Skip to content

Commit 1e5b23f

Browse files
authored
fix(store_test): 修复商店测试时出现缺少 author_id 报错的问题 (#268)
1 parent 1242072 commit 1e5b23f

File tree

3 files changed

+113
-93
lines changed

3 files changed

+113
-93
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/lang/zh-CN/
1010
### Fixed
1111

1212
- 修复商店测试中获取 PyPI 数据出错会直接退出的问题
13+
- 修复商店测试时出现缺少 author_id 报错的问题
1314

1415
## [4.0.1] - 2024-11-18
1516

src/providers/store_test/validation.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@ async def validate_plugin(
5757
else:
5858
# 将上次的插件数据作为新的插件数据
5959
raw_data: dict[str, Any] = previous_plugin.model_dump()
60+
# 还需要同步商店中的数据,如 author_id, tags 和 is_official
61+
raw_data.update(
62+
{
63+
"author_id": store_plugin.author_id,
64+
"tags": store_plugin.tags,
65+
"is_official": store_plugin.is_official,
66+
}
67+
)
6068

6169
# 当跳过测试的插件首次通过加载测试,则不再标记为跳过测试
6270
should_skip: bool = False if plugin_test_load else raw_data.get("skip_test", False)
@@ -89,15 +97,12 @@ async def validate_plugin(
8997
new_plugin = RegistryPlugin.from_publish_info(result.info)
9098
else:
9199
# 如果验证失败则使用以前的数据
92-
# 仅同步商店中的数据,比如 author_id, tags 和 is_official
93100
data = previous_plugin.model_dump() if previous_plugin else {}
94101
data.update(result.valid_data)
102+
# 顺便更新作者名与验证结果
95103
data.update(
96104
{
97-
"author_id": store_plugin.author_id,
98105
"author": author_name,
99-
"tags": store_plugin.tags,
100-
"is_official": store_plugin.is_official,
101106
"valid": result.valid,
102107
}
103108
)

tests/utils/store_test/test_validate_plugin.py

Lines changed: 103 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,7 @@ def mock_docker_result(path: Path, mocker: MockerFixture):
2424
return mock_plugin_test
2525

2626

27-
async def test_validate_plugin(
28-
tmp_path: Path, mocked_api: MockRouter, mocker: MockerFixture
29-
) -> None:
27+
async def test_validate_plugin(mocked_api: MockRouter, mocker: MockerFixture) -> None:
3028
"""验证插件信息"""
3129
from src.providers.models import (
3230
Metadata,
@@ -98,8 +96,101 @@ async def test_validate_plugin(
9896
assert mocked_api["homepage"].called
9997

10098

99+
async def test_validate_plugin_with_previous(
100+
mocked_api: MockRouter, mocker: MockerFixture
101+
) -> None:
102+
"""插件验证通过,但提供了之前插件信息的情况
103+
104+
需要能够正常更新 author_id, tags 和 is_official 等信息
105+
"""
106+
from src.providers.docker_test import Metadata
107+
from src.providers.models import RegistryPlugin, StoreTestResult
108+
from src.providers.store_test.validation import StorePlugin, validate_plugin
109+
110+
mock_datetime = mocker.patch("src.providers.models.datetime")
111+
mock_datetime.now.return_value = datetime(
112+
2023, 8, 23, 9, 22, 14, 836035, tzinfo=ZoneInfo("Asia/Shanghai")
113+
)
114+
115+
output_path = Path(__file__).parent / "output.json"
116+
mock_docker_result(output_path, mocker)
117+
118+
plugin = StorePlugin(
119+
module_name="module_name",
120+
project_link="project_link",
121+
author_id=1,
122+
tags=[],
123+
is_official=True,
124+
)
125+
126+
result, new_plugin = await validate_plugin(
127+
plugin,
128+
"",
129+
RegistryPlugin(
130+
module_name="module_name",
131+
project_link="project_link",
132+
name="name",
133+
author="author",
134+
desc="desc",
135+
homepage="https://nonebot.dev/",
136+
tags=[],
137+
is_official=False,
138+
type="application",
139+
supported_adapters=None,
140+
valid=True,
141+
time="2023-06-22 12:10:18",
142+
version="0.2.0",
143+
skip_test=False,
144+
),
145+
)
146+
147+
assert result == snapshot(
148+
StoreTestResult(
149+
config="",
150+
outputs={
151+
"validation": None,
152+
"load": """\
153+
创建测试目录 plugin_test
154+
require("nonebot_plugin_alconna")\
155+
""",
156+
"metadata": Metadata(
157+
desc="订阅牛客/CF/AT平台的比赛信息",
158+
homepage="https://nonebot.dev/",
159+
name="TREEHELP",
160+
supported_adapters=None,
161+
type="application",
162+
),
163+
},
164+
results={"validation": True, "load": True, "metadata": True},
165+
test_env={"unknown": True},
166+
version="0.2.0",
167+
)
168+
)
169+
170+
assert new_plugin == snapshot(
171+
RegistryPlugin(
172+
author="he0119",
173+
desc="订阅牛客/CF/AT平台的比赛信息",
174+
homepage="https://nonebot.dev/",
175+
is_official=True,
176+
module_name="module_name",
177+
name="TREEHELP",
178+
project_link="project_link",
179+
skip_test=False,
180+
supported_adapters=None,
181+
tags=[],
182+
time="2023-09-01T00:00:00+00:00Z",
183+
type="application",
184+
valid=True,
185+
version="0.2.0",
186+
)
187+
)
188+
189+
assert mocked_api["homepage"].called
190+
191+
101192
async def test_validate_plugin_skip_test(
102-
tmp_path: Path, mocked_api: MockRouter, mocker: MockerFixture
193+
mocked_api: MockRouter, mocker: MockerFixture
103194
) -> None:
104195
"""跳过插件测试的情况
105196
@@ -171,7 +262,7 @@ async def test_validate_plugin_skip_test(
171262

172263

173264
async def test_validate_plugin_skip_test_plugin_test_failed(
174-
tmp_path: Path, mocked_api: MockRouter, mocker: MockerFixture
265+
mocked_api: MockRouter, mocker: MockerFixture
175266
) -> None:
176267
"""跳过插件测试的情况
177268
@@ -221,65 +312,14 @@ async def test_validate_plugin_skip_test_plugin_test_failed(
221312
StoreTestResult(
222313
config="",
223314
outputs={
224-
"validation": {
225-
"data": {
226-
"module_name": "nonebot_plugin_treehelp",
227-
"project_link": "nonebot-plugin-treehelp",
228-
"time": "2021-08-01T00:00:00+00:00",
229-
"name": "帮助",
230-
"desc": "获取插件帮助信息",
231-
"author": "he0119",
232-
"homepage": "https://nonebot.dev/",
233-
"tags": [],
234-
"is_official": False,
235-
"type": "application",
236-
"supported_adapters": None,
237-
"load": True,
238-
"metadata": False,
239-
"skip_test": True,
240-
"version": "0.3.9",
241-
"test_output": """\
242-
创建测试目录 plugin_test
243-
For further information visit https://errors.pydantic.dev/2.9/v/model_type\x1b[0m\
244-
""",
245-
},
246-
"errors": [
247-
{
248-
"type": "missing",
249-
"loc": ("author_id",),
250-
"msg": "字段不存在",
251-
"input": {
252-
"module_name": "nonebot_plugin_treehelp",
253-
"project_link": "nonebot-plugin-treehelp",
254-
"name": "帮助",
255-
"desc": "获取插件帮助信息",
256-
"author": "he0119",
257-
"homepage": "https://nonebot.dev/",
258-
"tags": [],
259-
"is_official": False,
260-
"type": "application",
261-
"supported_adapters": None,
262-
"valid": True,
263-
"time": "2021-08-01T00:00:00+00:00",
264-
"version": "0.3.9",
265-
"skip_test": True,
266-
"load": False,
267-
"test_output": """\
268-
创建测试目录 plugin_test
269-
For further information visit https://errors.pydantic.dev/2.9/v/model_type\x1b[0m\
270-
""",
271-
"metadata": False,
272-
},
273-
}
274-
],
275-
},
315+
"validation": None,
276316
"load": """\
277317
创建测试目录 plugin_test
278318
For further information visit https://errors.pydantic.dev/2.9/v/model_type\x1b[0m\
279319
""",
280320
"metadata": None,
281321
},
282-
results={"validation": False, "load": False, "metadata": False},
322+
results={"validation": True, "load": False, "metadata": False},
283323
test_env={"unknown": True},
284324
version="0.3.9",
285325
)
@@ -298,7 +338,7 @@ async def test_validate_plugin_skip_test_plugin_test_failed(
298338
tags=[],
299339
time="2021-08-01T00:00:00+00:00",
300340
type="application",
301-
valid=False,
341+
valid=True,
302342
version="0.3.9",
303343
)
304344
)
@@ -307,7 +347,7 @@ async def test_validate_plugin_skip_test_plugin_test_failed(
307347

308348

309349
async def test_validate_plugin_failed_with_previous(
310-
tmp_path: Path, mocked_api: MockRouter, mocker: MockerFixture
350+
mocked_api: MockRouter, mocker: MockerFixture
311351
) -> None:
312352
"""插件验证失败,但提供了之前插件信息的情况
313353
@@ -365,9 +405,10 @@ async def test_validate_plugin_failed_with_previous(
365405
"name": "name",
366406
"desc": "desc",
367407
"author": "he0119",
408+
"author_id": 1,
368409
"homepage": "https://nonebot.dev/",
369410
"tags": [],
370-
"is_official": False,
411+
"is_official": True,
371412
"type": "application",
372413
"supported_adapters": None,
373414
"metadata": False,
@@ -379,33 +420,6 @@ async def test_validate_plugin_failed_with_previous(
379420
""",
380421
},
381422
"errors": [
382-
{
383-
"type": "missing",
384-
"loc": ("author_id",),
385-
"msg": "字段不存在",
386-
"input": {
387-
"module_name": "module_name",
388-
"project_link": "project_link",
389-
"name": "name",
390-
"desc": "desc",
391-
"author": "he0119",
392-
"homepage": "https://nonebot.dev/",
393-
"tags": [],
394-
"is_official": False,
395-
"type": "application",
396-
"supported_adapters": None,
397-
"valid": True,
398-
"time": "2023-09-01T00:00:00+00:00Z",
399-
"version": "0.3.9",
400-
"skip_test": False,
401-
"load": False,
402-
"test_output": """\
403-
创建测试目录 plugin_test
404-
For further information visit https://errors.pydantic.dev/2.9/v/model_type\x1b[0m\
405-
""",
406-
"metadata": False,
407-
},
408-
},
409423
{
410424
"type": "plugin.test",
411425
"loc": ("load",),
@@ -417,7 +431,7 @@ async def test_validate_plugin_failed_with_previous(
417431
For further information visit https://errors.pydantic.dev/2.9/v/model_type\x1b[0m\
418432
"""
419433
},
420-
},
434+
}
421435
],
422436
},
423437
"load": """\

0 commit comments

Comments
 (0)