From c2f1d0c5dc749a239c200713119026a1c36fb4c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Thu, 4 Jun 2026 19:43:23 +0800 Subject: [PATCH] test: add backend calc contract coverage --- backend/pyproject.toml | 1 + backend/tests/conftest.py | 69 ++++++++++++++++++++ backend/tests/contract/test_calc_contract.py | 19 ++++++ backend/uv.lock | 42 +++++++++++- 4 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 backend/tests/conftest.py create mode 100644 backend/tests/contract/test_calc_contract.py diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 5cc61cec..cdc2e615 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -15,5 +15,6 @@ dependencies = [ [dependency-groups] dev = [ + "pytest>=8.4.0", "ruff>=0.15.15", ] diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py new file mode 100644 index 00000000..b97dffa9 --- /dev/null +++ b/backend/tests/conftest.py @@ -0,0 +1,69 @@ +import base64 +import json +import sys +import time +from pathlib import Path + +import pytest +from fastapi.testclient import TestClient + +sys.path.insert(0, str(Path(__file__).resolve().parents[1])) + +from main import application + + +@pytest.fixture +def client(): + return TestClient(application) + + +@pytest.fixture +def alter_token(): + payload = { + 'alter': 'MDAwMDAw', + 'equVersion': '0', + 'time': int(time.time() * 1000), + } + return base64.b64encode(json.dumps(payload).encode('utf-8')).decode('utf-8') + + +@pytest.fixture +def minimal_calc_config(): + parts = [ + '武器', + '副武器', + '称号', + '上衣', + '头肩', + '下装', + '腰带', + '鞋', + '手镯', + '项链', + '戒指', + '辅助装备', + '魔法石', + '耳环', + ] + return { + 'equips': { + part: { + 'id': '', + 'reinforce': 0, + 'reinforceType': 0, + 'enchant': '0', + 'refine': 0, + 'adaptation': 0, + } + for part in parts + }, + 'oaths': {}, + 'emblems': {}, + 'skills': {}, + 'avatar': {}, + 'sundry': {}, + 'jades': {}, + 'options': {}, + 'DSB': False, + 'BUFF': False, + } diff --git a/backend/tests/contract/test_calc_contract.py b/backend/tests/contract/test_calc_contract.py new file mode 100644 index 00000000..81cab551 --- /dev/null +++ b/backend/tests/contract/test_calc_contract.py @@ -0,0 +1,19 @@ +def test_calc_response_contract(client, alter_token, minimal_calc_config): + response = client.post( + '/api/calc', + headers={'alter-token': alter_token}, + json=minimal_calc_config, + ) + + assert response.status_code == 200 + payload = response.json() + assert payload['code'] == 200 + assert payload['message'] == 'Success' + assert isinstance(payload['data'], dict) + + data = payload['data'] + assert set(['uuid', 'skills', 'info', 'suits', 'buffer']).issubset(data) + assert isinstance(data['uuid'], str) + assert isinstance(data['skills'], list) + assert isinstance(data['info'], list) + assert isinstance(data['buffer'], bool) diff --git a/backend/uv.lock b/backend/uv.lock index 16b48ad8..3dbdc9bb 100644 --- a/backend/uv.lock +++ b/backend/uv.lock @@ -546,6 +546,7 @@ dependencies = [ [package.dev-dependencies] dev = [ + { name = "pytest" }, { name = "ruff" }, ] @@ -560,7 +561,10 @@ requires-dist = [ ] [package.metadata.requires-dev] -dev = [{ name = "ruff", specifier = ">=0.15.15" }] +dev = [ + { name = "pytest", specifier = ">=8.4.0" }, + { name = "ruff", specifier = ">=0.15.15" }, +] [[package]] name = "detect-installer" @@ -1151,6 +1155,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, ] +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + [[package]] name = "itsdangerous" version = "2.2.0" @@ -1600,6 +1613,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868", size = 21216, upload-time = "2026-03-05T18:34:12.172Z" }, ] +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + [[package]] name = "propcache" version = "0.4.1" @@ -1944,6 +1966,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/df/80/fc9d01d5ed37ba4c42ca2b55b4339ae6e200b456be3a1aaddf4a9fa99b8c/pyperclip-1.11.0-py3-none-any.whl", hash = "sha256:299403e9ff44581cb9ba2ffeed69c7aa96a008622ad0c46cb575ca75b5b84273", size = 11063, upload-time = "2025-09-26T14:40:36.069Z" }, ] +[[package]] +name = "pytest" +version = "9.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, +] + [[package]] name = "python-dotenv" version = "1.1.0"