Skip to content

Commit 563bce9

Browse files
authored
Merge pull request #25 from AierLab/update
Implemented the test suite structure and essential API tests
2 parents 770f028 + bfcc30b commit 563bce9

File tree

9 files changed

+404
-145
lines changed

9 files changed

+404
-145
lines changed

backend/README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,22 @@ pip install -e .
77
pip install -e .[dev]
88
pip install -e .[test]
99

10+
```
11+
12+
# Run all tests
13+
> Currently running on Python3.10
14+
15+
```bash
16+
cd backend
17+
18+
python3.10 -m pytest -v
19+
```
20+
21+
# Run individual test scripts
22+
## Example: API functional tests
23+
24+
```bash
25+
cd backend/tests/functional
26+
27+
pytest functional_api_test.py
1028
```

backend/app/view/appView.py

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -87,16 +87,24 @@ def session():
8787
content = request.json.get('content')
8888
role_name = request.json.get('role_name')
8989

90-
success = self.history_manager.add_session_message(
91-
MessageModel(role=RoleEnum.get_by_name(role_name), content=content),
92-
self.current_session)
90+
# Added a check to make sure both content and role_name are provided
91+
success = False
92+
if content and role_name:
93+
success = self.history_manager.add_session_message(
94+
MessageModel(role=RoleEnum.get_by_name(role_name), content=content),
95+
self.current_session)
9396

94-
return jsonify({'status': 'success' if success else 'failure', 'message': 'Entry updated'})
97+
return jsonify({'status': 'success' if success else 'failure',
98+
'message': 'Entry updated' if success else 'Entry not updated'}), 200 if success else 400
9599

96100
elif request.method == 'DELETE':
97101
message_id = request.json.get('message_id')
98-
success = self.history_manager.delete_session_message(self.current_session, message_id)
99-
return jsonify({'status': 'success' if success else 'failure', 'message': 'Entry deleted'})
102+
# Added a check to make sure message_id is provided
103+
success = False
104+
if message_id:
105+
success = self.history_manager.delete_session_message(self.current_session, message_id)
106+
return jsonify({'status': 'success' if success else 'failure',
107+
'message': 'Entry deleted' if success else 'Entry not deleted'}), 200 if success else 400
100108

101109
@self.app.route('/history', methods=['GET', 'PUT', 'DELETE'])
102110
def history():
@@ -109,12 +117,17 @@ def history():
109117
return jsonify(self.current_session.id)
110118
elif request.method == 'DELETE':
111119
session_id = request.json.get('session_id')
112-
self.history_manager.delete_session(session_id)
120+
# Added a check to make sure session_id is provided
121+
success = False
122+
if session_id:
123+
success = self.history_manager.delete_session(session_id)
113124
if session_id == self.current_session.id:
114125
self.current_session = self.history_manager.create_session()
115126
self.config_manager.config.runtime.current_session_id = self.current_session.id
116-
return jsonify(self.current_session.id)
117-
127+
return jsonify({'status': 'success' if success else 'failure',
128+
'message': 'Session deleted' if success else 'Session not deleted',
129+
'current_session_id': self.current_session.id}), 200 if success else 400
130+
118131
@self.app.route('/config/<key>', methods=['GET', 'POST'])
119132
def config(key):
120133
if request.method == 'GET':
@@ -124,13 +137,16 @@ def config(key):
124137
return jsonify({key: value})
125138

126139
elif request.method == 'POST':
140+
success = False
127141
value = request.json.get('value')
142+
# How to make sure the config key exists before updating it? - Y.S.
143+
if value:
128144
# If session ID is updated, update the current session
129-
if key == "runtime.current_session_id":
130-
self.current_session = self.history_manager.get_session(value)
131-
set_nested_attribute(self.config_manager.config, key, value)
132-
self.config_manager.save()
133-
return jsonify({key: value, 'status': 'updated'})
145+
if key == "runtime.current_session_id":
146+
self.current_session = self.history_manager.get_session(value)
147+
set_nested_attribute(self.config_manager.config, key, value)
148+
success = self.config_manager.save()
149+
return jsonify({key: value, 'status': 'updated' if success else 'update failed'}), 200 if success else 400
134150

135151
@self.app.route('/bots', methods=['GET'])
136152
def bots_list():

backend/tests/functional/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pass
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
# THis test file ensures the general functionality of the application by testing the API endpoints.
2+
3+
import os
4+
5+
import pytest
6+
7+
from app.dao.configDataManager import ConfigManager
8+
from app.view.appView import AppView
9+
10+
11+
@pytest.fixture
12+
def client():
13+
# Get the absolute path to the config file
14+
config_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../storage/config/main_config.yaml'))
15+
# config_path = '../../storage/config/main_config.yaml'
16+
config_manager = ConfigManager(config_path)
17+
flask_app = AppView(config_manager).app
18+
with flask_app.test_client() as client:
19+
yield client
20+
21+
22+
def test_sanity_check(client):
23+
assert True
24+
25+
26+
# It takes me forever to generate an OpenAI API key for no apparent reason
27+
# Should work fine currently not passing without setting the key in main_config.yaml
28+
def test_ask_post(client):
29+
response = client.post('/ask', json={'content': 'test'})
30+
assert response.status_code == 200
31+
assert type(response.json['response']) == str and len(response.json['response']) > 0
32+
33+
34+
def test_session_get(client):
35+
response = client.get('/session')
36+
assert response.status_code == 200
37+
assert response.json['id'] is not None
38+
39+
40+
def test_session_put(client):
41+
response = client.put('/session', json={'content': 'test', 'role_name': 'user'})
42+
assert response.status_code == 200
43+
assert response.json['status'] == 'success'
44+
45+
46+
def test_session_put_failure(client):
47+
response = client.put('/session', json={'content': 'test'})
48+
assert response.status_code == 400
49+
assert response.json['status'] == 'failure'
50+
51+
52+
def test_session_delete(client):
53+
curr_session_id = client.get('/session').json['id']
54+
response = client.delete('/session', json={'message_id': curr_session_id})
55+
assert response.status_code == 200
56+
assert response.json['status'] == 'success'
57+
58+
59+
def test_session_delete_failure(client):
60+
response = client.delete('/session', json={})
61+
assert response.status_code == 400
62+
assert response.json['status'] == 'failure'
63+
64+
65+
def test_history_get(client):
66+
response = client.get('/history')
67+
assert response.status_code == 200
68+
assert isinstance(response.json, list) and len(response.json) > 0
69+
70+
71+
def test_history_put(client):
72+
response = client.put('/history')
73+
curr_session_id = response.json
74+
session_list = client.get('/history').json
75+
assert response.status_code == 200
76+
assert curr_session_id in session_list
77+
78+
79+
def test_history_delete(client):
80+
session_list = client.get('/history').json
81+
response = client.delete('/history', json={'session_id': session_list[0]})
82+
assert response.status_code == 200
83+
assert response.json['status'] == 'success'
84+
85+
86+
def test_history_delete_failure(client):
87+
response = client.delete('/history', json={})
88+
assert response.status_code == 400
89+
assert response.json['status'] == 'failure'
90+
91+
92+
def test_config_get(client):
93+
curr_session_id = client.get('/session').json['id']
94+
response = client.get(f'/config/{curr_session_id}')
95+
assert response.status_code == 200
96+
assert response.json[curr_session_id] is not None
97+
98+
99+
def test_config_get_failure(client):
100+
response = client.get('/config/test')
101+
assert response.status_code == 200
102+
assert 'Attribute test not found in ConfigModel' in response.json['test']
103+
104+
105+
def test_config_post(client):
106+
curr_session_id = client.get('/session').json['id']
107+
response = client.post(f'/config/{curr_session_id}', json={'value': 'test'})
108+
assert response.status_code == 200
109+
assert response.json['status'] == 'updated'
110+
111+
112+
def test_bots_get(client):
113+
response = client.get('/bots')
114+
assert response.status_code == 200
115+
assert isinstance(response.json, list) and len(response.json) > 0

backend/tests/historyTest.py renamed to backend/tests/functional/historyTest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import shutil
33
import unittest
44

5-
from app.dao import HistoryManager
5+
from app.dao.historyDataManager import HistoryManager
66
from app.model.dataModel import MessageModel, RoleEnum
77

88

backend/tests/openaiModelTest.py renamed to backend/tests/functional/openaiModelTest.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import unittest
22

33
from app.control.bot import OpenAIBot # Adjust the import according to your project structure
4-
from app.dao import ConfigManager, HistoryManager
4+
from app.dao.configDataManager import ConfigManager
5+
from app.dao.historyDataManager import HistoryManager
56
from app.model.dataModel import MessageModel, RoleEnum
67

78
config_manager = ConfigManager("../config.yaml")

backend/tests/test.py

Lines changed: 0 additions & 129 deletions
This file was deleted.

backend/tests/unit/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pass

0 commit comments

Comments
 (0)