From d182ecc46b24c9fdd810504b2a4f4591dedef0aa Mon Sep 17 00:00:00 2001 From: Kevin Lin Date: Wed, 21 Jan 2026 15:15:16 +0800 Subject: [PATCH 1/4] feat(ci): add github action unit_test --- .github/workflows/unit_test.yml | 64 +++++++++++++++++ .pre-commit-config.yaml | 36 +++++----- tests/{ => legacy}/test_add_resources.py | 6 +- tests/{ => legacy}/test_application.py | 4 +- tests/{ => legacy}/test_asr_phrases.py | 4 +- tests/{ => legacy}/test_assistant_files.py | 4 +- tests/{ => legacy}/test_assistants.py | 4 +- tests/{ => legacy}/test_async_api.py | 2 +- tests/{ => legacy}/test_code_generation.py | 4 +- tests/{ => legacy}/test_conversation.py | 4 +- tests/{ => legacy}/test_encryption.py | 0 .../{ => legacy}/test_http_deployments_api.py | 4 +- tests/{ => legacy}/test_http_files_api.py | 2 +- .../{ => legacy}/test_http_fine_tunes_api.py | 6 +- tests/{ => legacy}/test_http_models_api.py | 4 +- tests/{ => legacy}/test_image_synthesis.py | 2 +- tests/{ => legacy}/test_messages.py | 4 +- tests/{ => legacy}/test_multimodal_dialog.py | 3 +- tests/{ => legacy}/test_rerank.py | 4 +- tests/{ => legacy}/test_runs.py | 4 +- .../test_sketch_image_synthesis.py | 4 +- tests/{ => legacy}/test_speech_recognizer.py | 2 +- tests/{ => legacy}/test_speech_synthesis.py | 2 +- .../{ => legacy}/test_speech_synthesis_v2.py | 2 +- .../{ => legacy}/test_speech_transcription.py | 2 +- tests/{ => legacy}/test_text_embedding.py | 2 +- tests/{ => legacy}/test_threads.py | 4 +- tests/{ => legacy}/test_tokenization.py | 4 +- tests/{ => legacy}/test_tokenizer.py | 0 .../test_translation_recognizer.py | 2 +- tests/{ => legacy}/test_understanding.py | 4 +- tests/{ => legacy}/test_video_synthesis.py | 2 +- .../{ => legacy}/test_websocket_async_api.py | 6 +- .../{ => legacy}/test_websocket_parameters.py | 6 +- tests/{ => legacy}/test_websocket_sync_api.py | 6 +- .../websocket_mock_server_task_handler.py | 0 tests/{ => legacy}/websocket_task_request.py | 0 tests/{ => unit}/base_test.py | 0 tests/{ => unit}/conftest.py | 2 +- tests/{ => unit}/constants.py | 0 tests/{ => unit}/handle_deployment_request.py | 6 +- tests/{ => unit}/handle_fine_tune_request.py | 12 ++-- tests/{ => unit}/helper.py | 0 tests/{ => unit}/http_task_request.py | 6 +- tests/{ => unit}/mock_request_base.py | 2 +- tests/{ => unit}/mock_server.py | 69 +++++++++++-------- tests/{ => unit}/mock_sse.py | 21 ++++-- tests/{ => unit}/test_http_api.py | 13 +++- 48 files changed, 219 insertions(+), 125 deletions(-) create mode 100644 .github/workflows/unit_test.yml rename tests/{ => legacy}/test_add_resources.py (96%) rename tests/{ => legacy}/test_application.py (99%) rename tests/{ => legacy}/test_asr_phrases.py (98%) rename tests/{ => legacy}/test_assistant_files.py (97%) rename tests/{ => legacy}/test_assistants.py (98%) rename tests/{ => legacy}/test_async_api.py (99%) rename tests/{ => legacy}/test_code_generation.py (99%) rename tests/{ => legacy}/test_conversation.py (98%) rename tests/{ => legacy}/test_encryption.py (100%) rename tests/{ => legacy}/test_http_deployments_api.py (91%) rename tests/{ => legacy}/test_http_files_api.py (96%) rename tests/{ => legacy}/test_http_fine_tunes_api.py (97%) rename tests/{ => legacy}/test_http_models_api.py (83%) rename tests/{ => legacy}/test_image_synthesis.py (98%) rename tests/{ => legacy}/test_messages.py (98%) rename tests/{ => legacy}/test_multimodal_dialog.py (98%) rename tests/{ => legacy}/test_rerank.py (95%) rename tests/{ => legacy}/test_runs.py (99%) rename tests/{ => legacy}/test_sketch_image_synthesis.py (96%) rename tests/{ => legacy}/test_speech_recognizer.py (99%) rename tests/{ => legacy}/test_speech_synthesis.py (99%) rename tests/{ => legacy}/test_speech_synthesis_v2.py (98%) rename tests/{ => legacy}/test_speech_transcription.py (99%) rename tests/{ => legacy}/test_text_embedding.py (95%) rename tests/{ => legacy}/test_threads.py (97%) rename tests/{ => legacy}/test_tokenization.py (93%) rename tests/{ => legacy}/test_tokenizer.py (100%) rename tests/{ => legacy}/test_translation_recognizer.py (98%) rename tests/{ => legacy}/test_understanding.py (94%) rename tests/{ => legacy}/test_video_synthesis.py (97%) rename tests/{ => legacy}/test_websocket_async_api.py (98%) rename tests/{ => legacy}/test_websocket_parameters.py (95%) rename tests/{ => legacy}/test_websocket_sync_api.py (98%) rename tests/{ => legacy}/websocket_mock_server_task_handler.py (100%) rename tests/{ => legacy}/websocket_task_request.py (100%) rename tests/{ => unit}/base_test.py (100%) rename tests/{ => unit}/conftest.py (92%) rename tests/{ => unit}/constants.py (100%) rename tests/{ => unit}/handle_deployment_request.py (94%) rename tests/{ => unit}/handle_fine_tune_request.py (93%) rename tests/{ => unit}/helper.py (100%) rename tests/{ => unit}/http_task_request.py (87%) rename tests/{ => unit}/mock_request_base.py (93%) rename tests/{ => unit}/mock_server.py (94%) rename tests/{ => unit}/mock_sse.py (92%) rename tests/{ => unit}/test_http_api.py (88%) diff --git a/.github/workflows/unit_test.yml b/.github/workflows/unit_test.yml new file mode 100644 index 0000000..f1c41bc --- /dev/null +++ b/.github/workflows/unit_test.yml @@ -0,0 +1,64 @@ +name: Unit Tests + +on: + push: + branches: + - 'main' + pull_request: + branches: + - 'main' + +jobs: + test: + if: ${{ !(github.event_name == 'pull_request' && startsWith(github.event.pull_request.title, 'docs:')) }} + + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ ubuntu-latest ] + python-version: [ '3.8' ] + + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Cache pip dependencies + uses: actions/cache@v4 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/pyproject.toml') }} + restore-keys: | + ${{ runner.os }}-pip- + + - name: Update setuptools + run: | + pip install --upgrade pip + pip install setuptools==78.1.1 wheel==0.45.1 + + - name: Set PYTHONPATH + run: | + echo "PYTHONPATH=$PYTHONPATH:${{ github.workspace }}/src" >> $GITHUB_ENV + + - name: Install dependencies + run: | + export PIP_DEFAULT_TIMEOUT=300 + pip install -r requirements.txt + pip install -r requirements-test.txt + + - name: Show installed pip packages (versions) + run: | + python -m pip list --format=columns + + - name: Run tests with coverage + run: | + coverage run -m pytest tests/unit + + - name: Generate coverage report + run: | + coverage report -m diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a9d9f51..ed456ba 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,35 +3,35 @@ repos: rev: v4.3.0 hooks: - id: check-ast - exclude: ^(tests|samples)/ + exclude: ^(tests/legacy|samples)/ - id: sort-simple-yaml - exclude: ^(tests|samples)/ + exclude: ^(tests/legacy|samples)/ - id: check-yaml exclude: | (?x)^( meta.yaml - | tests/ + | tests/legacy/ | samples/ )$ - id: check-xml - exclude: ^(tests|samples)/ + exclude: ^(tests/legacy|samples)/ - id: check-toml - exclude: ^(tests|samples)/ + exclude: ^(tests/legacy|samples)/ - id: check-docstring-first - exclude: ^(tests|samples)/ + exclude: ^(tests/legacy|samples)/ - id: check-json - exclude: ^(tests|samples)/ + exclude: ^(tests/legacy|samples)/ - id: fix-encoding-pragma - exclude: ^(tests|samples)/ + exclude: ^(tests/legacy|samples)/ - id: detect-private-key - exclude: ^(tests|samples)/ + exclude: ^(tests/legacy|samples)/ - id: trailing-whitespace - exclude: ^(tests|samples)/ + exclude: ^(tests/legacy|samples)/ - repo: https://github.com/asottile/add-trailing-comma rev: v3.1.0 hooks: - id: add-trailing-comma - exclude: ^(tests|samples)/ + exclude: ^(tests/legacy|samples)/ - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.7.0 hooks: @@ -41,7 +41,7 @@ repos: pb2\.py$ | grpc\.py$ | ^docs - | ^tests/ + | ^tests/legacy/ | ^samples/ | \.html$ ) @@ -61,13 +61,13 @@ repos: hooks: - id: black args: [ --line-length=79 ] - exclude: ^(tests|samples)/ + exclude: ^(tests/legacy|samples)/ - repo: https://github.com/PyCQA/flake8 rev: 6.1.0 hooks: - id: flake8 args: [ "--extend-ignore=E203"] - exclude: ^(tests|samples)/ + exclude: ^(tests/legacy|samples)/ - repo: https://github.com/pylint-dev/pylint rev: v3.0.2 hooks: @@ -75,7 +75,7 @@ repos: exclude: (?x)( ^docs - | ^tests/ + | ^tests/legacy/ | ^samples/ | pb2\.py$ | grpc\.py$ @@ -122,14 +122,14 @@ repos: hooks: - id: eslint files: \.(js|jsx)$ - exclude: '(.*js_third_party.*|^tests/|^samples/)' + exclude: '(.*js_third_party.*|^tests/legacy/|^samples/)' args: [ '--fix' ] - repo: https://github.com/thibaudcolas/pre-commit-stylelint rev: v14.4.0 hooks: - id: stylelint files: \.(css)$ - exclude: '(.*css_third_party.*|^tests/|^samples/)' + exclude: '(.*css_third_party.*|^tests/legacy/|^samples/)' args: [ '--fix' ] - repo: https://github.com/pre-commit/mirrors-prettier rev: 'v3.0.0' @@ -137,4 +137,4 @@ repos: - id: prettier additional_dependencies: [ 'prettier@3.0.0' ] files: \.(tsx?)$ - exclude: ^(tests|samples)/ \ No newline at end of file + exclude: ^(tests/legacy|samples)/ \ No newline at end of file diff --git a/tests/test_add_resources.py b/tests/legacy/test_add_resources.py similarity index 96% rename from tests/test_add_resources.py rename to tests/legacy/test_add_resources.py index 8571018..b06165b 100644 --- a/tests/test_add_resources.py +++ b/tests/legacy/test_add_resources.py @@ -5,9 +5,9 @@ from http import HTTPStatus from dashscope import Generation -from tests.http_task_request import HttpRequest -from tests.mock_request_base import MockServerBase -from tests.mock_server import MockServer +from tests.unit.http_task_request import HttpRequest +from tests.unit.mock_request_base import MockServerBase +from tests.unit.mock_server import MockServer model = Generation.Models.qwen_turbo diff --git a/tests/test_application.py b/tests/legacy/test_application.py similarity index 99% rename from tests/test_application.py rename to tests/legacy/test_application.py index 10e9b46..5a8341a 100644 --- a/tests/test_application.py +++ b/tests/legacy/test_application.py @@ -11,8 +11,8 @@ from dashscope import Application from dashscope.app.application_response import ApplicationResponse -from tests.mock_request_base import MockServerBase -from tests.mock_server import MockServer +from tests.unit.mock_request_base import MockServerBase +from tests.unit.mock_server import MockServer class TestCompletion(MockServerBase): diff --git a/tests/test_asr_phrases.py b/tests/legacy/test_asr_phrases.py similarity index 98% rename from tests/test_asr_phrases.py rename to tests/legacy/test_asr_phrases.py index 4055e05..01cfda1 100644 --- a/tests/test_asr_phrases.py +++ b/tests/legacy/test_asr_phrases.py @@ -11,8 +11,8 @@ import dashscope from dashscope.audio.asr import AsrPhraseManager -from tests.constants import TEST_JOB_ID -from tests.mock_request_base import MockRequestBase +from tests.unit.constants import TEST_JOB_ID +from tests.unit.mock_request_base import MockRequestBase logger = logging.getLogger("dashscope") logger.setLevel(logging.DEBUG) diff --git a/tests/test_assistant_files.py b/tests/legacy/test_assistant_files.py similarity index 97% rename from tests/test_assistant_files.py rename to tests/legacy/test_assistant_files.py index 113f63e..1ea0811 100644 --- a/tests/test_assistant_files.py +++ b/tests/legacy/test_assistant_files.py @@ -5,8 +5,8 @@ import uuid from dashscope.assistants.files import Files -from tests.mock_request_base import MockServerBase -from tests.mock_server import MockServer +from tests.unit.mock_request_base import MockServerBase +from tests.unit.mock_server import MockServer class TestAssistantFiles(MockServerBase): diff --git a/tests/test_assistants.py b/tests/legacy/test_assistants.py similarity index 98% rename from tests/test_assistants.py rename to tests/legacy/test_assistants.py index 4eea86d..569a91c 100644 --- a/tests/test_assistants.py +++ b/tests/legacy/test_assistants.py @@ -5,8 +5,8 @@ import uuid from dashscope import Assistants -from tests.mock_request_base import MockServerBase -from tests.mock_server import MockServer +from tests.unit.mock_request_base import MockServerBase +from tests.unit.mock_server import MockServer class TestAssistants(MockServerBase): diff --git a/tests/test_async_api.py b/tests/legacy/test_async_api.py similarity index 99% rename from tests/test_async_api.py rename to tests/legacy/test_async_api.py index f692e0d..f41746c 100644 --- a/tests/test_async_api.py +++ b/tests/legacy/test_async_api.py @@ -7,7 +7,7 @@ from dashscope.api_entities.dashscope_response import DashScopeAPIResponse from dashscope.client.base_api import BaseAsyncApi from dashscope.common.constants import ApiProtocol, HTTPMethod, TaskStatus -from tests.base_test import BaseTestEnvironment +from tests.unit.base_test import BaseTestEnvironment class AsyncRequest(BaseAsyncApi): diff --git a/tests/test_code_generation.py b/tests/legacy/test_code_generation.py similarity index 99% rename from tests/test_code_generation.py rename to tests/legacy/test_code_generation.py index 798d6c4..ce1c339 100644 --- a/tests/test_code_generation.py +++ b/tests/legacy/test_code_generation.py @@ -9,8 +9,8 @@ AttachmentRoleMessageParam, UserRoleMessageParam, ) -from tests.mock_request_base import MockServerBase -from tests.mock_server import MockServer +from tests.unit.mock_request_base import MockServerBase +from tests.unit.mock_server import MockServer model = CodeGeneration.Models.tongyi_lingma_v1 diff --git a/tests/test_conversation.py b/tests/legacy/test_conversation.py similarity index 98% rename from tests/test_conversation.py rename to tests/legacy/test_conversation.py index 11ffe80..7b25384 100644 --- a/tests/test_conversation.py +++ b/tests/legacy/test_conversation.py @@ -8,8 +8,8 @@ from dashscope.aigc.conversation import Conversation, History, HistoryItem from dashscope.api_entities.dashscope_response import Choice, Message, Role from dashscope.common.message_manager import MessageManager -from tests.mock_request_base import MockServerBase -from tests.mock_server import MockServer +from tests.unit.mock_request_base import MockServerBase +from tests.unit.mock_server import MockServer def request_generator(): diff --git a/tests/test_encryption.py b/tests/legacy/test_encryption.py similarity index 100% rename from tests/test_encryption.py rename to tests/legacy/test_encryption.py diff --git a/tests/test_http_deployments_api.py b/tests/legacy/test_http_deployments_api.py similarity index 91% rename from tests/test_http_deployments_api.py rename to tests/legacy/test_http_deployments_api.py index 43fd934..58472bd 100644 --- a/tests/test_http_deployments_api.py +++ b/tests/legacy/test_http_deployments_api.py @@ -4,8 +4,8 @@ from http import HTTPStatus from dashscope import Deployments -from tests.constants import TEST_JOB_ID -from tests.mock_request_base import MockRequestBase +from tests.unit.constants import TEST_JOB_ID +from tests.unit.mock_request_base import MockRequestBase class TestDeploymentRequest(MockRequestBase): diff --git a/tests/test_http_files_api.py b/tests/legacy/test_http_files_api.py similarity index 96% rename from tests/test_http_files_api.py rename to tests/legacy/test_http_files_api.py index c405a4b..d02ed4d 100644 --- a/tests/test_http_files_api.py +++ b/tests/legacy/test_http_files_api.py @@ -4,7 +4,7 @@ from http import HTTPStatus from dashscope import Files -from tests.mock_request_base import MockRequestBase +from tests.unit.mock_request_base import MockRequestBase class TestFileRequest(MockRequestBase): diff --git a/tests/test_http_fine_tunes_api.py b/tests/legacy/test_http_fine_tunes_api.py similarity index 97% rename from tests/test_http_fine_tunes_api.py rename to tests/legacy/test_http_fine_tunes_api.py index 1fcf26b..843e6d7 100644 --- a/tests/test_http_fine_tunes_api.py +++ b/tests/legacy/test_http_fine_tunes_api.py @@ -6,9 +6,9 @@ from http import HTTPStatus from dashscope import FineTunes -from tests.constants import TEST_JOB_ID -from tests.mock_request_base import MockServerBase -from tests.mock_server import MockServer +from tests.unit.constants import TEST_JOB_ID +from tests.unit.mock_request_base import MockServerBase +from tests.unit.mock_server import MockServer # yapf: disable diff --git a/tests/test_http_models_api.py b/tests/legacy/test_http_models_api.py similarity index 83% rename from tests/test_http_models_api.py rename to tests/legacy/test_http_models_api.py index f175880..2345c52 100644 --- a/tests/test_http_models_api.py +++ b/tests/legacy/test_http_models_api.py @@ -4,8 +4,8 @@ from http import HTTPStatus from dashscope import Models -from tests.constants import TEST_JOB_ID -from tests.mock_request_base import MockRequestBase +from tests.unit.constants import TEST_JOB_ID +from tests.unit.mock_request_base import MockRequestBase class TestModelRequest(MockRequestBase): diff --git a/tests/test_image_synthesis.py b/tests/legacy/test_image_synthesis.py similarity index 98% rename from tests/test_image_synthesis.py rename to tests/legacy/test_image_synthesis.py index aa7950b..df3c361 100644 --- a/tests/test_image_synthesis.py +++ b/tests/legacy/test_image_synthesis.py @@ -5,7 +5,7 @@ from dashscope import ImageSynthesis from dashscope.common.constants import TaskStatus -from tests.base_test import BaseTestEnvironment +from tests.unit.base_test import BaseTestEnvironment class TestAsyncImageSynthesisRequest(BaseTestEnvironment): diff --git a/tests/test_messages.py b/tests/legacy/test_messages.py similarity index 98% rename from tests/test_messages.py rename to tests/legacy/test_messages.py index 6b1d8be..b1ac74f 100644 --- a/tests/test_messages.py +++ b/tests/legacy/test_messages.py @@ -6,8 +6,8 @@ from dashscope import Messages from dashscope.threads.messages.files import Files -from tests.mock_request_base import MockServerBase -from tests.mock_server import MockServer +from tests.unit.mock_request_base import MockServerBase +from tests.unit.mock_server import MockServer class TestMessages(MockServerBase): diff --git a/tests/test_multimodal_dialog.py b/tests/legacy/test_multimodal_dialog.py similarity index 98% rename from tests/test_multimodal_dialog.py rename to tests/legacy/test_multimodal_dialog.py index e919c8c..7be5d87 100644 --- a/tests/test_multimodal_dialog.py +++ b/tests/legacy/test_multimodal_dialog.py @@ -16,9 +16,8 @@ ClientInfo, RequestParameters, Device, - RequestToRespondParameters, ) -from tests.base_test import BaseTestEnvironment +from tests.unit.base_test import BaseTestEnvironment logger = logging.getLogger("dashscope") logger.setLevel(logging.DEBUG) diff --git a/tests/test_rerank.py b/tests/legacy/test_rerank.py similarity index 95% rename from tests/test_rerank.py rename to tests/legacy/test_rerank.py index bf0890e..d2afd34 100644 --- a/tests/test_rerank.py +++ b/tests/legacy/test_rerank.py @@ -5,8 +5,8 @@ import uuid from dashscope import TextReRank -from tests.mock_request_base import MockServerBase -from tests.mock_server import MockServer +from tests.unit.mock_request_base import MockServerBase +from tests.unit.mock_server import MockServer class TestReRank(MockServerBase): diff --git a/tests/test_runs.py b/tests/legacy/test_runs.py similarity index 99% rename from tests/test_runs.py rename to tests/legacy/test_runs.py index 845edf4..e7ba9da 100644 --- a/tests/test_runs.py +++ b/tests/legacy/test_runs.py @@ -5,8 +5,8 @@ import uuid from dashscope import Runs, Steps -from tests.mock_request_base import MockServerBase -from tests.mock_server import MockServer +from tests.unit.mock_request_base import MockServerBase +from tests.unit.mock_server import MockServer class TestRuns(MockServerBase): diff --git a/tests/test_sketch_image_synthesis.py b/tests/legacy/test_sketch_image_synthesis.py similarity index 96% rename from tests/test_sketch_image_synthesis.py rename to tests/legacy/test_sketch_image_synthesis.py index 3d2c814..47400df 100644 --- a/tests/test_sketch_image_synthesis.py +++ b/tests/legacy/test_sketch_image_synthesis.py @@ -5,8 +5,8 @@ from http import HTTPStatus from dashscope import ImageSynthesis -from tests.mock_request_base import MockServerBase -from tests.mock_server import MockServer +from tests.unit.mock_request_base import MockServerBase +from tests.unit.mock_server import MockServer class TestSketchImageSynthesis(MockServerBase): diff --git a/tests/test_speech_recognizer.py b/tests/legacy/test_speech_recognizer.py similarity index 99% rename from tests/test_speech_recognizer.py rename to tests/legacy/test_speech_recognizer.py index 7c081ee..dbec01b 100644 --- a/tests/test_speech_recognizer.py +++ b/tests/legacy/test_speech_recognizer.py @@ -16,7 +16,7 @@ RecognitionCallback, RecognitionResult, ) -from tests.base_test import BaseTestEnvironment +from tests.unit.base_test import BaseTestEnvironment logger = logging.getLogger("dashscope") logger.setLevel(logging.DEBUG) diff --git a/tests/test_speech_synthesis.py b/tests/legacy/test_speech_synthesis.py similarity index 99% rename from tests/test_speech_synthesis.py rename to tests/legacy/test_speech_synthesis.py index c25edbc..22bfaf1 100644 --- a/tests/test_speech_synthesis.py +++ b/tests/legacy/test_speech_synthesis.py @@ -16,7 +16,7 @@ SpeechSynthesisResult, SpeechSynthesizer, ) -from tests.base_test import BaseTestEnvironment +from tests.unit.base_test import BaseTestEnvironment logger = logging.getLogger("dashscope") logger.setLevel(logging.DEBUG) diff --git a/tests/test_speech_synthesis_v2.py b/tests/legacy/test_speech_synthesis_v2.py similarity index 98% rename from tests/test_speech_synthesis_v2.py rename to tests/legacy/test_speech_synthesis_v2.py index b758673..31395fc 100644 --- a/tests/test_speech_synthesis_v2.py +++ b/tests/legacy/test_speech_synthesis_v2.py @@ -4,7 +4,7 @@ import pytest from dashscope.audio.tts_v2 import ResultCallback, SpeechSynthesizer -from tests.base_test import BaseTestEnvironment +from tests.unit.base_test import BaseTestEnvironment class TestCallback(ResultCallback): diff --git a/tests/test_speech_transcription.py b/tests/legacy/test_speech_transcription.py similarity index 99% rename from tests/test_speech_transcription.py rename to tests/legacy/test_speech_transcription.py index aa9f770..ab67a08 100644 --- a/tests/test_speech_transcription.py +++ b/tests/legacy/test_speech_transcription.py @@ -12,7 +12,7 @@ import dashscope from dashscope.audio.asr import Transcription from dashscope.common.constants import TaskStatus -from tests.base_test import BaseTestEnvironment +from tests.unit.base_test import BaseTestEnvironment HTTPS_16K_CH1_WAV = "https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example.wav" # noqa: * HTTPS_16K_CH2_WAV = "https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_2ch.wav" # noqa: * diff --git a/tests/test_text_embedding.py b/tests/legacy/test_text_embedding.py similarity index 95% rename from tests/test_text_embedding.py rename to tests/legacy/test_text_embedding.py index 64699fd..964aabf 100644 --- a/tests/test_text_embedding.py +++ b/tests/legacy/test_text_embedding.py @@ -4,7 +4,7 @@ from http import HTTPStatus from dashscope import TextEmbedding -from tests.mock_request_base import MockRequestBase +from tests.unit.mock_request_base import MockRequestBase class TestTextEmbeddingRequest(MockRequestBase): diff --git a/tests/test_threads.py b/tests/legacy/test_threads.py similarity index 97% rename from tests/test_threads.py rename to tests/legacy/test_threads.py index 744ac92..0a8f092 100644 --- a/tests/test_threads.py +++ b/tests/legacy/test_threads.py @@ -5,8 +5,8 @@ import uuid from dashscope import Threads -from tests.mock_request_base import MockServerBase -from tests.mock_server import MockServer +from tests.unit.mock_request_base import MockServerBase +from tests.unit.mock_server import MockServer class TestThreads(MockServerBase): diff --git a/tests/test_tokenization.py b/tests/legacy/test_tokenization.py similarity index 93% rename from tests/test_tokenization.py rename to tests/legacy/test_tokenization.py index 3fa7683..8fe1739 100644 --- a/tests/test_tokenization.py +++ b/tests/legacy/test_tokenization.py @@ -5,8 +5,8 @@ from http import HTTPStatus from dashscope import Tokenization -from tests.mock_request_base import MockServerBase -from tests.mock_server import MockServer +from tests.unit.mock_request_base import MockServerBase +from tests.unit.mock_server import MockServer class TestTokenization(MockServerBase): diff --git a/tests/test_tokenizer.py b/tests/legacy/test_tokenizer.py similarity index 100% rename from tests/test_tokenizer.py rename to tests/legacy/test_tokenizer.py diff --git a/tests/test_translation_recognizer.py b/tests/legacy/test_translation_recognizer.py similarity index 98% rename from tests/test_translation_recognizer.py rename to tests/legacy/test_translation_recognizer.py index 6031779..8ed639e 100644 --- a/tests/test_translation_recognizer.py +++ b/tests/legacy/test_translation_recognizer.py @@ -12,7 +12,7 @@ TranslationRecognizerRealtime, TranslationResult, ) -from tests.base_test import BaseTestEnvironment +from tests.unit.base_test import BaseTestEnvironment class Callback(TranslationRecognizerCallback): diff --git a/tests/test_understanding.py b/tests/legacy/test_understanding.py similarity index 94% rename from tests/test_understanding.py rename to tests/legacy/test_understanding.py index a0c340a..6e2756c 100644 --- a/tests/test_understanding.py +++ b/tests/legacy/test_understanding.py @@ -5,8 +5,8 @@ from http import HTTPStatus from dashscope import Understanding -from tests.mock_request_base import MockServerBase -from tests.mock_server import MockServer +from tests.unit.mock_request_base import MockServerBase +from tests.unit.mock_server import MockServer model = Understanding.Models.opennlu_v1 diff --git a/tests/test_video_synthesis.py b/tests/legacy/test_video_synthesis.py similarity index 97% rename from tests/test_video_synthesis.py rename to tests/legacy/test_video_synthesis.py index d845322..2ec9638 100644 --- a/tests/test_video_synthesis.py +++ b/tests/legacy/test_video_synthesis.py @@ -5,7 +5,7 @@ from dashscope import VideoSynthesis from dashscope.common.constants import TaskStatus -from tests.base_test import BaseTestEnvironment +from tests.unit.base_test import BaseTestEnvironment class TestAsyncVideoSynthesisRequest(BaseTestEnvironment): diff --git a/tests/test_websocket_async_api.py b/tests/legacy/test_websocket_async_api.py similarity index 98% rename from tests/test_websocket_async_api.py rename to tests/legacy/test_websocket_async_api.py index 7551154..bf87b49 100644 --- a/tests/test_websocket_async_api.py +++ b/tests/legacy/test_websocket_async_api.py @@ -5,9 +5,9 @@ import dashscope from dashscope.protocol.websocket import WebsocketStreamingMode -from tests.base_test import BaseTestEnvironment -from tests.constants import TestTasks -from tests.websocket_task_request import WebSocketRequest +from tests.unit.base_test import BaseTestEnvironment +from tests.unit.constants import TestTasks +from tests.legacy.websocket_task_request import WebSocketRequest # set mock server url. base_websocket_api_url = "ws://localhost:8080/ws/aigc/v1" diff --git a/tests/test_websocket_parameters.py b/tests/legacy/test_websocket_parameters.py similarity index 95% rename from tests/test_websocket_parameters.py rename to tests/legacy/test_websocket_parameters.py index b2c1a7e..d21403c 100644 --- a/tests/test_websocket_parameters.py +++ b/tests/legacy/test_websocket_parameters.py @@ -3,13 +3,13 @@ import dashscope from dashscope.protocol.websocket import WebsocketStreamingMode -from tests.base_test import BaseTestEnvironment -from tests.constants import ( +from tests.unit.base_test import BaseTestEnvironment +from tests.unit.constants import ( TEST_DISABLE_DATA_INSPECTION_REQUEST_ID, TEST_ENABLE_DATA_INSPECTION_REQUEST_ID, TestTasks, ) -from tests.websocket_task_request import WebSocketRequest +from tests.legacy.websocket_task_request import WebSocketRequest def pytest_generate_tests(metafunc): diff --git a/tests/test_websocket_sync_api.py b/tests/legacy/test_websocket_sync_api.py similarity index 98% rename from tests/test_websocket_sync_api.py rename to tests/legacy/test_websocket_sync_api.py index 864d916..67900ea 100644 --- a/tests/test_websocket_sync_api.py +++ b/tests/legacy/test_websocket_sync_api.py @@ -3,9 +3,9 @@ import dashscope from dashscope.protocol.websocket import WebsocketStreamingMode -from tests.base_test import BaseTestEnvironment -from tests.constants import TestTasks -from tests.websocket_task_request import WebSocketRequest +from tests.unit.base_test import BaseTestEnvironment +from tests.unit.constants import TestTasks +from tests.legacy.websocket_task_request import WebSocketRequest def pytest_generate_tests(metafunc): diff --git a/tests/websocket_mock_server_task_handler.py b/tests/legacy/websocket_mock_server_task_handler.py similarity index 100% rename from tests/websocket_mock_server_task_handler.py rename to tests/legacy/websocket_mock_server_task_handler.py diff --git a/tests/websocket_task_request.py b/tests/legacy/websocket_task_request.py similarity index 100% rename from tests/websocket_task_request.py rename to tests/legacy/websocket_task_request.py diff --git a/tests/base_test.py b/tests/unit/base_test.py similarity index 100% rename from tests/base_test.py rename to tests/unit/base_test.py diff --git a/tests/conftest.py b/tests/unit/conftest.py similarity index 92% rename from tests/conftest.py rename to tests/unit/conftest.py index fd6916a..5f804bd 100644 --- a/tests/conftest.py +++ b/tests/unit/conftest.py @@ -7,7 +7,7 @@ import pytest from dashscope.common.constants import DASHSCOPE_DISABLE_DATA_INSPECTION_ENV -from tests.mock_server import create_app, create_mock_server, run_server +from tests.unit.mock_server import create_app, create_mock_server, run_server @pytest.fixture diff --git a/tests/constants.py b/tests/unit/constants.py similarity index 100% rename from tests/constants.py rename to tests/unit/constants.py diff --git a/tests/handle_deployment_request.py b/tests/unit/handle_deployment_request.py similarity index 94% rename from tests/handle_deployment_request.py rename to tests/unit/handle_deployment_request.py index deb5561..5a5d65e 100644 --- a/tests/handle_deployment_request.py +++ b/tests/unit/handle_deployment_request.py @@ -6,7 +6,7 @@ import aiohttp from aiohttp import web -from tests.constants import TEST_JOB_ID +from tests.unit.constants import TEST_JOB_ID async def create_deployment_handler(request: aiohttp.request): @@ -30,7 +30,9 @@ async def create_deployment_handler(request: aiohttp.request): ) -async def list_deployment_handler(request: aiohttp.request): +async def list_deployment_handler( + request: aiohttp.request, +): # pylint: disable=unused-argument response = { "status_code": 200, "request_id": "af80b388-b891-43fb-9721-ce5c23d1cafb", diff --git a/tests/handle_fine_tune_request.py b/tests/unit/handle_fine_tune_request.py similarity index 93% rename from tests/handle_fine_tune_request.py rename to tests/unit/handle_fine_tune_request.py index 658b2b6..c9bf07a 100644 --- a/tests/handle_fine_tune_request.py +++ b/tests/unit/handle_fine_tune_request.py @@ -7,9 +7,9 @@ import aiohttp from aiohttp import web -from tests.mock_sse import sse_response +from tests.unit.mock_sse import sse_response -from .constants import TEST_JOB_ID +from .constants import TEST_JOB_ID # pylint: disable=relative-beyond-top-level async def create_fine_tune_handler(request: aiohttp.request): @@ -46,7 +46,9 @@ async def create_fine_tune_handler(request: aiohttp.request): ) -async def list_fine_tune_handler(request: aiohttp.request): +async def list_fine_tune_handler( + request: aiohttp.request, +): # pylint: disable=unused-argument response = { "output": { "jobs": [ @@ -151,8 +153,8 @@ async def events_fine_tune_handler(request: aiohttp.request): assert fine_tune_id == TEST_JOB_ID async with sse_response(request) as resp: for idx in range(10): - log = "fine-tune logging %s" % idx - print("Sending sse data: %s" % log) + log = f"fine-tune logging {idx}" + print(f"Sending sse data: {log}") await resp.send(log, id=idx) await asyncio.sleep(1) print("logging send completed") diff --git a/tests/helper.py b/tests/unit/helper.py similarity index 100% rename from tests/helper.py rename to tests/unit/helper.py diff --git a/tests/http_task_request.py b/tests/unit/http_task_request.py similarity index 87% rename from tests/http_task_request.py rename to tests/unit/http_task_request.py index 4c38713..fc8f18c 100644 --- a/tests/http_task_request.py +++ b/tests/unit/http_task_request.py @@ -18,7 +18,7 @@ async def async_call( task_group: str = "aigc", api_key: str = None, api_protocol=ApiProtocol.HTTP, - http_method=HTTPMethod.POST, + http_method=HTTPMethod.POST, # pylint: disable=unused-argument is_binary_input=False, **kwargs, ) -> DashScopeAPIResponse: @@ -43,8 +43,8 @@ def call( task_group: str = "aigc", api_key: str = None, api_protocol=ApiProtocol.HTTP, - http_method=HTTPMethod.POST, - is_binary_input=False, + http_method=HTTPMethod.POST, # pylint: disable=unused-argument + is_binary_input=False, # pylint: disable=unused-argument **kwargs, ) -> DashScopeAPIResponse: return super().call( diff --git a/tests/mock_request_base.py b/tests/unit/mock_request_base.py similarity index 93% rename from tests/mock_request_base.py rename to tests/unit/mock_request_base.py index 8dc6817..c5c016b 100644 --- a/tests/mock_request_base.py +++ b/tests/unit/mock_request_base.py @@ -2,7 +2,7 @@ # Copyright (c) Alibaba, Inc. and its affiliates. import dashscope -from tests.base_test import BaseTestEnvironment +from tests.unit.base_test import BaseTestEnvironment class MockRequestBase(BaseTestEnvironment): diff --git a/tests/mock_server.py b/tests/unit/mock_server.py similarity index 94% rename from tests/mock_server.py rename to tests/unit/mock_server.py index d9d5920..559769d 100644 --- a/tests/mock_server.py +++ b/tests/unit/mock_server.py @@ -12,19 +12,19 @@ from aiohttp import web from dashscope.protocol.websocket import ActionType -from tests.constants import ( +from tests.unit.constants import ( TEST_DISABLE_DATA_INSPECTION_REQUEST_ID, TEST_ENABLE_DATA_INSPECTION_REQUEST_ID, TEST_JOB_ID, ) -from tests.handle_deployment_request import ( +from tests.unit.handle_deployment_request import ( create_deployment_handler, delete_deployment_handler, events_deployment_handler, get_deployment_handler, list_deployment_handler, ) -from tests.handle_fine_tune_request import ( +from tests.unit.handle_fine_tune_request import ( cancel_fine_tune_handler, create_fine_tune_handler, delete_fine_tune_handler, @@ -32,8 +32,10 @@ get_fine_tune_handler, list_fine_tune_handler, ) -from tests.mock_sse import sse_response -from tests.websocket_mock_server_task_handler import WebSocketTaskProcessor +from tests.unit.mock_sse import sse_response +from tests.legacy.websocket_mock_server_task_handler import ( + WebSocketTaskProcessor, +) def validate_data_inspection_parameter(request: aiohttp.request): @@ -59,7 +61,7 @@ async def post_echo(request: aiohttp.request): await mock_sse(request) return body = await request.json() - print("receive request json:\n %s" % body) + print(f"receive request json:\n {body}") if "messages" in body["input"]: input_text = body["input"]["messages"][0]["content"] else: @@ -103,7 +105,9 @@ async def post_echo(request: aiohttp.request): ) -async def response_403(request: aiohttp.request): +async def response_403( + request: aiohttp.request, +): # pylint: disable=unused-argument return web.Response(status=403, text='{"message": "Error api key"}') @@ -118,7 +122,7 @@ async def websocket_handler_stream_none(request): if req["header"]["action"] == ActionType.START: task_id = req["header"]["task_id"] streaming_mode = req["header"]["streaming"] - print("receive first payload: %s" % req["payload"]) + print(f"receive first payload: {req['payload']}") wsc = WebSocketTaskProcessor( ws, task_id, @@ -144,7 +148,7 @@ async def websocket_handler_stream_in(request): if req["header"]["action"] == ActionType.START: task_id = req["header"]["task_id"] streaming_mode = req["header"]["streaming"] - print("receive first payload: %s" % req["payload"]) + print(f"receive first payload: {req['payload']}") wsc = WebSocketTaskProcessor( ws, task_id, @@ -170,7 +174,7 @@ async def websocket_handler_stream_out(request): if req["header"]["action"] == ActionType.START: task_id = req["header"]["task_id"] streaming_mode = req["header"]["streaming"] - print("receive first payload: %s" % req["payload"]) + print(f"receive first payload: {req['payload']}") wsc = WebSocketTaskProcessor( ws, task_id, @@ -196,7 +200,7 @@ async def websocket_handler_stream_in_out(request): if req["header"]["action"] == ActionType.START: task_id = req["header"]["task_id"] streaming_mode = req["header"]["streaming"] - print("receive first payload: %s" % req["payload"]) + print(f"receive first payload: {req['payload']}") wsc = WebSocketTaskProcessor( ws, task_id, @@ -215,7 +219,7 @@ async def websocket_handler_stream_in_out(request): async def mock_sse(request): async with sse_response(request) as resp: for idx in range(10): - data = "{}".format(idx) + data = f"{idx}" response = { "output": { "text": data, @@ -227,7 +231,7 @@ async def mock_sse(request): "request_id": "d167c38b-bd5d-11ed-981e-00163e0d4788", } response_str = json.dumps(response) - print("Sending sse data: %s" % response_str) + print(f"Sending sse data: {response_str}") await resp.send(response_str, id=idx) await asyncio.sleep(1) print("data send completed") @@ -241,7 +245,7 @@ async def handle_send_receive_form_data(request: aiohttp.request): reader = await request.multipart() # dog, and bird, async for field in reader: - print("multipart field: %s" % field.name) + print(f"multipart field: {field.name}") content = await field.read() real_md5 = md5(content).hexdigest() if field.name == "files": @@ -288,7 +292,9 @@ async def handle_upload_file(request: aiohttp.request): ) -async def handle_list_file(request: aiohttp.request): +async def handle_list_file( + request: aiohttp.request, +): # pylint: disable=unused-argument response = { "request_id": "d7bd0668-8bd7-486c-8383-d1582c4b44f0", "code": 0, @@ -303,21 +309,21 @@ async def handle_list_file(request: aiohttp.request): "file_id": "da55d958-fbb2-4ed9-b979-f29af139d6f3", "name": "fine_tune_example.jsonl", "description": "testfilesfasfdsf", - "url": "http://dashscope.oss-cn-beijing.aliyuncs.com/api-fs/1", + "url": "http://dashscope.oss-cn-beijing.aliyuncs.com/api-fs/1", # noqa: E501 }, { "id": 10, "file_id": "fedffd0c-c247-4442-ae93-cf8525786e6c", "name": "fine_tune_example.jsonl", "description": "testfilesfasfdsf", - "url": "http://dashscope.oss-cn-beijing.aliyuncs.com/api-fs/2", + "url": "http://dashscope.oss-cn-beijing.aliyuncs.com/api-fs/2", # noqa: E501 }, { "id": 9, "file_id": "13ee1928-3ce4-494c-96a8-27219aec298e", "name": "fine_tune_example.jsonl", "description": "testfilesfasfdsf", - "url": "http://dashscope.oss-cn-beijing.aliyuncs.com/api-fs/3", + "url": "http://dashscope.oss-cn-beijing.aliyuncs.com/api-fs/3", # noqa: E501 }, ], }, @@ -330,7 +336,7 @@ async def handle_list_file(request: aiohttp.request): async def handle_get_file(request: aiohttp.request): - id = request.match_info["id"] + id = request.match_info["id"] # pylint: disable=redefined-builtin response = { "request_id": "e2faec4a-1183-47e5-9279-222e0a762c61", "code": 0, @@ -351,7 +357,7 @@ async def handle_get_file(request: aiohttp.request): async def handle_delete_file(request: aiohttp.request): - id = request.match_info["id"] + id = request.match_info["id"] # pylint: disable=redefined-builtin if id == "111111": response = {"code": "200", "success": True} return web.json_response( @@ -389,7 +395,9 @@ async def handle_delete_file(request: aiohttp.request): ) -async def list_models_handler(request: aiohttp.request): +async def list_models_handler( + request: aiohttp.request, +): # pylint: disable=unused-argument response = { "code": "200", "data": { @@ -639,7 +647,7 @@ def __init__(self) -> None: ) # retrieve message file app.router.add_get( - "/api/v1/threads/{thread_id}/messages/{message_id}/files/{file_id}", + "/api/v1/threads/{thread_id}/messages/{message_id}/files/{file_id}", # noqa: E501 self.handle_list_object, ) # retrieve message file @@ -788,7 +796,7 @@ def handle_list_object(self, request: aiohttp.request): async def handle_update_object_with_post(self, request: aiohttp.request): func = request.match_info["function"] object_id = request.match_info["object_id"] - print("function: %s" % (func)) + print(f"function: {func}") body = await request.json() self.requests.put(body) rsp = self.responses.get(block=True) @@ -804,7 +812,7 @@ async def handle_update_object_with_post(self, request: aiohttp.request): def handle_retrieve_object(self, request: aiohttp.request): func = request.match_info["function"] object_id = request.match_info["object_id"] - print("Retrieve %s, object_id: %s" % (func, object_id)) + print(f"Retrieve {func}, object_id: {object_id}") self.requests.put(object_id) rsp = self.responses.get(block=True) status_code, rsp = self.process_response(rsp) @@ -841,7 +849,7 @@ async def handle_mock_request(self, request: aiohttp.request): group = request.match_info["group"] task = request.match_info["task"] func = request.match_info["function"] - print("group: %s, task: %s, function: %s" % (group, task, func)) + print(f"group: {group}, task: {task}, function: {func}") body = await request.json() print("handle_mock_request body", str(body)) self.requests.put(body) @@ -874,7 +882,7 @@ async def websocket_handler(self, request): if req["header"]["action"] == ActionType.START: task_id = req["header"]["task_id"] streaming_mode = req["header"]["streaming"] - print("receive first payload: %s" % req["payload"]) + print(f"receive first payload: {req['payload']}") wsc = WebSocketTaskProcessor( ws, task_id, @@ -892,10 +900,13 @@ async def websocket_handler(self, request): def http_server(): runner = create_app() - proc = multiprocessing.Process(target=run_server, args=(runner,)) + proc = multiprocessing.Process( # pylint: disable=redefined-outer-name + target=run_server, + args=(runner,), + ) proc.start() - def stop_server(): + def stop_server(): # pylint: disable=unused-variable proc.terminate() print("Server stopped") @@ -922,7 +933,7 @@ def run_mock_server(requests, responses): def create_mock_server(request): mock_web_server = MockServer() - proc = multiprocessing.Process( + proc = multiprocessing.Process( # pylint: disable=redefined-outer-name target=run_mock_server, args=( mock_web_server.requests, diff --git a/tests/mock_sse.py b/tests/unit/mock_sse.py similarity index 92% rename from tests/mock_sse.py rename to tests/unit/mock_sse.py index ebeab71..aa5fa03 100644 --- a/tests/mock_sse.py +++ b/tests/unit/mock_sse.py @@ -3,6 +3,7 @@ # from: https://github.com/aio-libs/aiohttp-sse/blob/master/aiohttp_sse/__init__.py # noqa E501 # adapter for post request. +# pylint: disable=relative-beyond-top-level import asyncio import contextlib import io @@ -64,7 +65,7 @@ async def prepare(self, request): self._ping_task = asyncio.create_task(self._ping()) if request.method == "POST": request_str = await request.json() - print("Request content: %s" % request_str) + print(f"Request content: {request_str}") # explicitly enabling chunked encoding, since content length # usually not known beforehand. self.enable_chunked_encoding() @@ -77,7 +78,13 @@ async def prepare(self, request): # request disconnected raise asyncio.CancelledError() - async def send(self, data, id=None, event=None, retry=None): + async def send( + self, + data, + id=None, + event=None, + retry=None, + ): # pylint: disable=redefined-builtin """Send data using EventSource protocol :param str data: The data field for the message. @@ -160,7 +167,7 @@ async def _ping(self): # as ping message. while True: await asyncio.sleep(self._ping_interval) - await self.write(": ping{0}{0}".format(self._sep).encode("utf-8")) + await self.write(f": ping{self._sep}{self._sep}".encode("utf-8")) async def __aenter__(self): return self @@ -183,9 +190,11 @@ def sse_response( ): if not issubclass(response_cls, EventSourceResponse): raise TypeError( - "response_cls must be subclass of " - "aiohttp_sse.EventSourceResponse, got {}".format(response_cls), + f"response_cls must be subclass of " + f"aiohttp_sse.EventSourceResponse, got {response_cls}", ) sse = response_cls(status=status, reason=reason, headers=headers, sep=sep) - return _ContextManager(sse._prepare(request)) + return _ContextManager( + sse._prepare(request), # pylint: disable=protected-access + ) diff --git a/tests/test_http_api.py b/tests/unit/test_http_api.py similarity index 88% rename from tests/test_http_api.py rename to tests/unit/test_http_api.py index 009f12e..15ada15 100644 --- a/tests/test_http_api.py +++ b/tests/unit/test_http_api.py @@ -4,12 +4,12 @@ from http import HTTPStatus from dashscope import Generation -from tests.constants import ( +from tests.unit.constants import ( TEST_DISABLE_DATA_INSPECTION_REQUEST_ID, TEST_ENABLE_DATA_INSPECTION_REQUEST_ID, ) -from tests.http_task_request import HttpRequest -from tests.mock_request_base import MockRequestBase +from tests.unit.http_task_request import HttpRequest +from tests.unit.mock_request_base import MockRequestBase def request_generator(): @@ -17,6 +17,7 @@ def request_generator(): class TestHttpRequest(MockRequestBase): + # pylint: disable=unused-argument def test_independent_model_sync_batch_request(self, http_server): resp = Generation.call( model=Generation.Models.qwen_turbo, @@ -29,6 +30,7 @@ def test_independent_model_sync_batch_request(self, http_server): assert resp.output.text == "hello" assert resp.output["text"] == "hello" + # pylint: disable=unused-argument def test_disable_data_inspection( self, http_server, @@ -45,6 +47,7 @@ def test_disable_data_inspection( assert resp.output.text == "hello" assert resp.output["text"] == "hello" + # pylint: disable=unused-argument def test_enable_data_inspection( self, http_server, @@ -61,6 +64,7 @@ def test_enable_data_inspection( assert resp.output.text == "hello" assert resp.output["text"] == "hello" + # pylint: disable=unused-argument def test_independent_model_sync_stream_request(self, http_server): resp = Generation.call( model=Generation.Models.qwen_turbo, @@ -74,6 +78,7 @@ def test_independent_model_sync_stream_request(self, http_server): assert rsp.output.text == str(idx) print(rsp.output["text"]) + # pylint: disable=unused-argument,unspecified-encoding def test_echo_request_with_file_object(self, http_server): with open("tests/data/request_file.bin") as f: resp = Generation.call( @@ -85,6 +90,7 @@ def test_echo_request_with_file_object(self, http_server): ) assert resp.output.text[0] == "hello" + # pylint: disable=unused-argument def test_echo_request_with_generator(self, http_server): resp = Generation.call( model=Generation.Models.qwen_turbo, @@ -95,6 +101,7 @@ def test_echo_request_with_generator(self, http_server): ) assert resp.output.text == "hello" + # pylint: disable=unused-argument,consider-using-with def test_send_receive_files(self, http_server): bird_file = open("tests/data/bird.JPEG", "rb") dogs_file = open("tests/data/dogs.jpg", "rb") From c14e157900d6316fce441b965ba1f040f2e0091e Mon Sep 17 00:00:00 2001 From: Kevin Lin Date: Wed, 21 Jan 2026 20:06:50 +0800 Subject: [PATCH 2/4] feat(ci): add github action unit_test --- .github/workflows/unit_test.yml | 2 +- requirements-test.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/unit_test.yml b/.github/workflows/unit_test.yml index f1c41bc..e41be96 100644 --- a/.github/workflows/unit_test.yml +++ b/.github/workflows/unit_test.yml @@ -39,7 +39,7 @@ jobs: - name: Update setuptools run: | pip install --upgrade pip - pip install setuptools==78.1.1 wheel==0.45.1 + pip install setuptools==68.2.2 wheel==0.41.2 - name: Set PYTHONPATH run: | diff --git a/requirements-test.txt b/requirements-test.txt index a4c7f23..ce80619 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -5,3 +5,4 @@ pytest>=7 pytest-aiohttp pytest-asyncio yapf==0.30.0 # use fix version to ensure consistent auto-styling +coverage \ No newline at end of file From 199759ee382015eb7be1935678a0a51b73286e79 Mon Sep 17 00:00:00 2001 From: Kevin Lin Date: Wed, 21 Jan 2026 20:18:19 +0800 Subject: [PATCH 3/4] feat(ci): add github action unit_test --- tests/unit/helper.py | 1 + tests/unit/http_task_request.py | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/unit/helper.py b/tests/unit/helper.py index eb95638..d5659e9 100644 --- a/tests/unit/helper.py +++ b/tests/unit/helper.py @@ -11,6 +11,7 @@ def __init__(self, coro): self._coro = coro self._obj = None + # pylint: disable=arguments-renamed def send(self, arg): return self._coro.send(arg) # pragma: no cover diff --git a/tests/unit/http_task_request.py b/tests/unit/http_task_request.py index fc8f18c..1cb5f2e 100644 --- a/tests/unit/http_task_request.py +++ b/tests/unit/http_task_request.py @@ -10,7 +10,7 @@ class HttpRequest(BaseApi, BaseAioApi): """API for AI-Generated Content(AIGC) models.""" @classmethod - async def async_call( + async def async_call( # type: ignore[override] cls, model: str, prompt: str, @@ -33,8 +33,9 @@ async def async_call( **kwargs, ) + # pylint: disable=arguments-renamed @classmethod - def call( + def call( # type: ignore[override] cls, model: str, prompt: str, From 56fa02802dac1a4502ab0be9b4c35ff490b094bc Mon Sep 17 00:00:00 2001 From: Kevin Lin Date: Wed, 21 Jan 2026 20:23:36 +0800 Subject: [PATCH 4/4] feat(ci): add github action unit_test --- dashscope/api_entities/encryption.py | 1 + dashscope/audio/asr/recognition.py | 1 + dashscope/audio/tts_v2/speech_synthesizer.py | 1 + dashscope/multimodal/multimodal_request_params.py | 1 + dashscope/tokenizers/qwen_tokenizer.py | 1 + tests/unit/http_task_request.py | 2 +- 6 files changed, 6 insertions(+), 1 deletion(-) diff --git a/dashscope/api_entities/encryption.py b/dashscope/api_entities/encryption.py index 9f8d8ba..266a8c4 100644 --- a/dashscope/api_entities/encryption.py +++ b/dashscope/api_entities/encryption.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. +# mypy: disable-error-code="annotation-unchecked" import base64 import json import os diff --git a/dashscope/audio/asr/recognition.py b/dashscope/audio/asr/recognition.py index 4a9c8f8..f243d44 100644 --- a/dashscope/audio/asr/recognition.py +++ b/dashscope/audio/asr/recognition.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. +# mypy: disable-error-code="annotation-unchecked" import json import os diff --git a/dashscope/audio/tts_v2/speech_synthesizer.py b/dashscope/audio/tts_v2/speech_synthesizer.py index c980e6b..c981368 100644 --- a/dashscope/audio/tts_v2/speech_synthesizer.py +++ b/dashscope/audio/tts_v2/speech_synthesizer.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. +# mypy: disable-error-code="annotation-unchecked" import json import platform diff --git a/dashscope/multimodal/multimodal_request_params.py b/dashscope/multimodal/multimodal_request_params.py index 43eeb85..fe88161 100644 --- a/dashscope/multimodal/multimodal_request_params.py +++ b/dashscope/multimodal/multimodal_request_params.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# mypy: disable-error-code="annotation-unchecked" from dataclasses import dataclass, field import uuid diff --git a/dashscope/tokenizers/qwen_tokenizer.py b/dashscope/tokenizers/qwen_tokenizer.py index dcfc2a9..bfa1119 100644 --- a/dashscope/tokenizers/qwen_tokenizer.py +++ b/dashscope/tokenizers/qwen_tokenizer.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- # Copyright (c) Alibaba, Inc. and its affiliates. +# mypy: disable-error-code="annotation-unchecked" import base64 import unicodedata diff --git a/tests/unit/http_task_request.py b/tests/unit/http_task_request.py index 1cb5f2e..b8e893e 100644 --- a/tests/unit/http_task_request.py +++ b/tests/unit/http_task_request.py @@ -22,7 +22,7 @@ async def async_call( # type: ignore[override] is_binary_input=False, **kwargs, ) -> DashScopeAPIResponse: - return await super().async_call( + return await super().async_call( # type: ignore[misc] model=model, task_group=task_group, task=task,