Skip to content

Commit 6ea59a6

Browse files
committed
feat(ci): add unit tests
1 parent 538813d commit 6ea59a6

22 files changed

+234
-136
lines changed

tests/legacy/test_websocket_async_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from dashscope.protocol.websocket import WebsocketStreamingMode
88
from tests.unit.base_test import BaseTestEnvironment
99
from tests.unit.constants import TestTasks
10-
from tests.legacy.websocket_task_request import WebSocketRequest
10+
from tests.unit.websocket_task_request import WebSocketRequest
1111

1212
# set mock server url.
1313
base_websocket_api_url = "ws://localhost:8080/ws/aigc/v1"

tests/legacy/test_websocket_parameters.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
TEST_ENABLE_DATA_INSPECTION_REQUEST_ID,
1010
TestTasks,
1111
)
12-
from tests.legacy.websocket_task_request import WebSocketRequest
12+
from tests.unit.websocket_task_request import WebSocketRequest
1313

1414

1515
def pytest_generate_tests(metafunc):

tests/legacy/test_websocket_sync_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from dashscope.protocol.websocket import WebsocketStreamingMode
66
from tests.unit.base_test import BaseTestEnvironment
77
from tests.unit.constants import TestTasks
8-
from tests.legacy.websocket_task_request import WebSocketRequest
8+
from tests.unit.websocket_task_request import WebSocketRequest
99

1010

1111
def pytest_generate_tests(metafunc):

tests/unit/mock_server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
list_fine_tune_handler,
3434
)
3535
from tests.unit.mock_sse import sse_response
36-
from tests.legacy.websocket_mock_server_task_handler import (
36+
from tests.unit.websocket_mock_server_task_handler import (
3737
WebSocketTaskProcessor,
3838
)
3939

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010

1111
class TestDeploymentRequest(MockRequestBase):
12+
# pylint: disable=unused-argument
1213
def test_create_deployment_tune_job(self, http_server):
1314
resp = Deployments.call(
1415
model="gpt",
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99

1010
class TestFileRequest(MockRequestBase):
11+
# pylint: disable=unused-argument
1112
def test_upload_files(self, http_server):
1213
resp = Files.upload(
1314
file_path="tests/data/dogs.jpg",
Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@ class TestFineTuneRequest(MockServerBase):
1818

1919
@classmethod
2020
def setup_class(cls):
21+
# pylint: disable=consider-using-with
2122
cls.case_data = json.load(
2223
open('tests/data/fine_tune.json', 'r', encoding='utf-8'),
2324
)
2425
super().setup_class()
2526

2627
def test_create_fine_tune_job(self, mock_server: MockServer):
27-
response_body = self.case_data['create_response']
28+
# type: ignore[index]
29+
# pylint: disable=unsubscriptable-object
30+
response_body = self.case_data['create_response'] # type: ignore
2831
mock_server.responses.put(json.dumps(response_body))
2932
model = 'gpt'
3033
training_file_ids = 'training_001'
@@ -47,10 +50,19 @@ def test_create_fine_tune_job(self, mock_server: MockServer):
4750
assert req['body']['hyper_parameters'] == hyper_parameters
4851
assert resp.output.job_id == response_body['output']['job_id']
4952
assert resp.output.status == response_body['output']['status']
50-
assert resp.output.hyper_parameters == {'learning_rate': '2e-5', 'n_epochs': 10, 'batch_size': 32}
53+
expected_hyper_params = {
54+
'learning_rate': '2e-5',
55+
'n_epochs': 10,
56+
'batch_size': 32,
57+
}
58+
assert resp.output.hyper_parameters == expected_hyper_params
5159

5260
def test_create_fine_tune_job_with_files(self, mock_server: MockServer):
53-
response_body = self.case_data['create_multi_files_response']
61+
# type: ignore[index]
62+
# pylint: disable=unsubscriptable-object
63+
response_body = self.case_data[ # type: ignore
64+
'create_multi_files_response'
65+
]
5466
mock_server.responses.put(json.dumps(response_body))
5567
model = 'gpt'
5668
training_file_ids = ['training_001', 'training_002']
@@ -75,10 +87,13 @@ def test_create_fine_tune_job_with_files(self, mock_server: MockServer):
7587
assert resp.output.status == response_body['output']['status']
7688
assert resp.output.training_file_ids == training_file_ids
7789
assert resp.output.validation_file_ids == validation_file_ids
78-
assert resp.output.hyper_parameters == response_body['output']['hyper_parameters']
90+
expected_hyper_params = response_body['output']['hyper_parameters']
91+
assert resp.output.hyper_parameters == expected_hyper_params
7992

8093
def test_list_fine_tune_job(self, mock_server: MockServer):
81-
response_body = self.case_data['list_response']
94+
# type: ignore[index]
95+
# pylint: disable=unsubscriptable-object
96+
response_body = self.case_data['list_response'] # type: ignore
8297
mock_server.responses.put(json.dumps(response_body))
8398
response = FineTunes.list(
8499
page_no=10,
@@ -90,7 +105,9 @@ def test_list_fine_tune_job(self, mock_server: MockServer):
90105
assert response.output.jobs[0].job_id == 'ft-202403261454-d8b4'
91106

92107
def test_get_fine_tune_job(self, mock_server: MockServer):
93-
response_body = self.case_data['query_response']
108+
# type: ignore[index]
109+
# pylint: disable=unsubscriptable-object
110+
response_body = self.case_data['query_response'] # type: ignore
94111
mock_server.responses.put(json.dumps(response_body))
95112
job_id = str(uuid.uuid4())
96113
response = FineTunes.get(job_id=job_id)
@@ -100,7 +117,11 @@ def test_get_fine_tune_job(self, mock_server: MockServer):
100117

101118
def test_delete_fine_tune_job(self, mock_server: MockServer):
102119
request_id = str(uuid.uuid4())
103-
response_body = '{"output": {"status": "success"}, "request_id": "%s", "code": null, "message": "", "usage": null}' % request_id # noqa E501
120+
response_body = (
121+
'{"output": {"status": "success"}, '
122+
f'"request_id": "{request_id}", '
123+
'"code": null, "message": "", "usage": null}'
124+
)
104125
mock_server.responses.put(response_body)
105126
rsp = FineTunes.delete(TEST_JOB_ID)
106127
req = mock_server.requests.get(block=True)
@@ -110,14 +131,19 @@ def test_delete_fine_tune_job(self, mock_server: MockServer):
110131

111132
def test_cancel_fine_tune_job(self, mock_server: MockServer):
112133
request_id = str(uuid.uuid4())
113-
response_body = '{"output": {"status": "success"}, "request_id": "%s", "code": null, "message": "", "usage": null}' % request_id # noqa E501
134+
response_body = (
135+
'{"output": {"status": "success"}, '
136+
f'"request_id": "{request_id}", '
137+
'"code": null, "message": "", "usage": null}'
138+
)
114139
mock_server.responses.put(response_body)
115140
rsp = FineTunes.cancel(TEST_JOB_ID)
116141
req = mock_server.requests.get(block=True)
117142
assert req['path'] == f'/api/v1/fine-tunes/{TEST_JOB_ID}/cancel'
118143
assert rsp.status_code == HTTPStatus.OK
119144
assert rsp.request_id == request_id
120145

146+
# pylint: disable=unused-argument
121147
def test_stream_event(self, mock_server: MockServer):
122148
responses = FineTunes.stream_events(TEST_JOB_ID)
123149
idx = 0
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010

1111
class TestModelRequest(MockRequestBase):
12+
# pylint: disable=unused-argument
1213
def test_list_models(self, http_server):
1314
rsp = Models.list()
1415
assert rsp.status_code == HTTPStatus.OK
Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,20 @@ class TestMessages(MockServerBase):
1717

1818
@classmethod
1919
def setup_class(cls):
20+
# pylint: disable=consider-using-with
2021
cls.case_data = json.load(
2122
open("tests/data/messages.json", "r", encoding="utf-8"),
2223
)
2324
super().setup_class()
2425

2526
def test_create(self, mock_server: MockServer):
26-
request_body = self.case_data["create_message_request"]
27-
response_body = self.case_data["create_message_response"]
27+
# type: ignore[index]
28+
# pylint: disable=unsubscriptable-object
29+
request_body = self.case_data["create_message_request"] # type: ignore
30+
# pylint: disable=unsubscriptable-object
31+
response_body = self.case_data[ # type: ignore
32+
"create_message_response"
33+
]
2834
mock_server.responses.put(json.dumps(response_body))
2935
response = Messages.create(**request_body)
3036
req = mock_server.requests.get(block=True)
@@ -34,7 +40,11 @@ def test_create(self, mock_server: MockServer):
3440
assert len(response.content) == 1
3541

3642
def test_update(self, mock_server: MockServer):
37-
response_body = self.case_data["create_message_response"]
43+
# type: ignore[index]
44+
# pylint: disable=unsubscriptable-object
45+
response_body = self.case_data[ # type: ignore
46+
"create_message_response"
47+
]
3848
mock_server.responses.put(json.dumps(response_body))
3949
thread_id = str(uuid.uuid4())
4050
message_id = str(uuid.uuid4())
@@ -55,7 +65,11 @@ def test_update(self, mock_server: MockServer):
5565
assert len(response.content) == 1
5666

5767
def test_retrieve(self, mock_server: MockServer):
58-
response_obj = self.case_data["create_message_response"]
68+
# type: ignore[index]
69+
# pylint: disable=unsubscriptable-object
70+
response_obj = self.case_data[ # type: ignore
71+
"create_message_response"
72+
]
5973
response_str = json.dumps(response_obj)
6074
mock_server.responses.put(response_str)
6175
thread_id = "tid"
@@ -68,7 +82,9 @@ def test_retrieve(self, mock_server: MockServer):
6882
assert len(response.content) == 1
6983

7084
def test_list(self, mock_server: MockServer):
71-
response_obj = self.case_data["list_message_response"]
85+
# type: ignore[index]
86+
# pylint: disable=unsubscriptable-object
87+
response_obj = self.case_data["list_message_response"] # type: ignore
7288
mock_server.responses.put(json.dumps(response_obj))
7389
thread_id = "test_thread_id"
7490
response = Messages.list(
@@ -80,16 +96,21 @@ def test_list(self, mock_server: MockServer):
8096
)
8197
# get assistant id we send.
8298
req = mock_server.requests.get(block=True)
83-
assert (
84-
req
85-
== f"/api/v1/threads/{thread_id}/messages?limit=10&order=inc&after=after&before=before"
99+
expected_path = (
100+
f"/api/v1/threads/{thread_id}/messages?"
101+
"limit=10&order=inc&after=after&before=before"
86102
)
103+
assert req == expected_path
87104
assert len(response.data) == 2
88105
assert response.data[0].id == "msg_1"
89106
assert response.data[1].id == "msg_0"
90107

91108
def test_list_message_files(self, mock_server: MockServer):
92-
response_obj = self.case_data["list_message_files_response"]
109+
# type: ignore[index]
110+
# pylint: disable=unsubscriptable-object
111+
response_obj = self.case_data[ # type: ignore
112+
"list_message_files_response"
113+
]
93114
mock_server.responses.put(json.dumps(response_obj))
94115
thread_id = "test_thread_id"
95116
message_id = "test_message_id"
@@ -103,10 +124,11 @@ def test_list_message_files(self, mock_server: MockServer):
103124
)
104125
# get assistant id we send.
105126
req = mock_server.requests.get(block=True)
106-
assert (
107-
req
108-
== f"/api/v1/threads/{thread_id}/messages/{message_id}/files?limit=10&order=inc&after=after&before=before"
109-
) # noqa E501
127+
expected_path = (
128+
f"/api/v1/threads/{thread_id}/messages/{message_id}/files?"
129+
"limit=10&order=inc&after=after&before=before"
130+
)
131+
assert req == expected_path
110132
assert len(response.data) == 2
111133
assert response.data[0].id == "file-1"
112134
assert response.data[1].id == "file-2"
@@ -133,9 +155,10 @@ def test_retrieve_message_file(self, mock_server: MockServer):
133155
)
134156
# get assistant id we send.
135157
req = mock_server.requests.get(block=True)
136-
assert (
137-
req
138-
== f"/api/v1/threads/{thread_id}/messages/{message_id}/files/{file_id}"
158+
expected_path = (
159+
f"/api/v1/threads/{thread_id}/messages/{message_id}/"
160+
f"files/{file_id}"
139161
)
162+
assert req == expected_path
140163
assert response.id == file_id
141164
assert response.message_id == message_id
Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
# -*- coding: utf-8 -*-
22
# Copyright (c) Alibaba, Inc. and its affiliates.
3-
import sys
4-
import pytest
53
import logging
4+
import sys
65
import time
7-
from dashscope.common.logging import logger
6+
7+
import pytest
88
from dashscope.multimodal.dialog_state import DialogState
99
from dashscope.multimodal.multimodal_dialog import (
1010
MultiModalDialog,
@@ -21,9 +21,13 @@
2121

2222
logger = logging.getLogger("dashscope")
2323
logger.setLevel(logging.DEBUG)
24-
# create console handler and set level to debug
2524
console_handler = logging.StreamHandler()
2625

26+
# Global variable for dialog ID
27+
g_dialog_id = None
28+
# Global variable for conversation instance
29+
conver_instance = None
30+
2731

2832
# 定义voice chat服务回调
2933
class TestCallback(MultiModalCallback):
@@ -36,20 +40,22 @@ def on_started(self, dialog_id):
3640

3741
def on_stopped(self):
3842
logger.info("stopped with server.")
39-
pass
4043

4144
def on_state_changed(self, state: DialogState):
4245
if state == DialogState.LISTENING:
4346
# app.update_text("开始收音。。。请提问")
44-
pass
45-
elif state == DialogState.THINKING:
46-
pass
47+
return
48+
if state == DialogState.THINKING:
4749
# app.update_text("思考中。。。请耐心等待")
48-
elif state == DialogState.RESPONDING:
49-
pass
50+
return
51+
if state == DialogState.RESPONDING:
5052
# app.update_text("正在回答。。。")
53+
return
5154

52-
def on_speech_audio_data(self, data: bytes):
55+
def on_speech_audio_data(
56+
self,
57+
data: bytes,
58+
): # pylint: disable=unused-argument
5359
# pcm_play.play(data)
5460
return
5561

@@ -60,22 +66,22 @@ def on_error(self, error):
6066
def on_responding_started(self):
6167
# 开始端侧播放
6268
# pcm_play.start_play()
63-
global conver_instance
64-
conver_instance.send_local_responding_started()
65-
return
69+
global conver_instance # pylint: disable=global-variable-not-assigned
70+
if conver_instance is not None:
71+
conver_instance.send_local_responding_started()
6672

67-
def on_responding_ended(self, payload):
73+
def on_responding_ended(self, payload): # pylint: disable=unused-argument
6874
logger.debug("on responding ended")
69-
conver_instance.send_local_responding_ended()
75+
global conver_instance # pylint: disable=global-variable-not-assigned
76+
if conver_instance is not None:
77+
conver_instance.send_local_responding_ended()
7078
# pcm_play.stop_play()
7179

7280
def on_speech_content(self, payload):
73-
pass
7481
if payload is not None:
7582
logger.debug(payload)
7683

7784
def on_responding_content(self, payload):
78-
pass
7985
if payload is not None:
8086
logger.debug(payload)
8187

@@ -86,8 +92,9 @@ def on_request_accepted(self):
8692

8793
def on_close(self, close_status_code, close_msg):
8894
logger.info(
89-
"close with status code: %d, msg: %s"
90-
% (close_status_code, close_msg),
95+
"close with status code: %d, msg: %s",
96+
close_status_code,
97+
close_msg,
9198
)
9299

93100

0 commit comments

Comments
 (0)