type: 收窄测试与响应模型类型
This commit is contained in:
@@ -35,7 +35,7 @@ class TestAccountSensitiveFields:
|
||||
def test_sensitive_fields_are_hidden_by_default_even_for_admin(self):
|
||||
result = list_accounts(
|
||||
assigned_only=False,
|
||||
tag=None,
|
||||
tag="",
|
||||
has_cookie=False,
|
||||
search="",
|
||||
page=1,
|
||||
@@ -45,6 +45,7 @@ class TestAccountSensitiveFields:
|
||||
current=self.admin,
|
||||
)
|
||||
|
||||
assert isinstance(result, dict)
|
||||
item = result["items"][0]
|
||||
assert item.password is None
|
||||
assert item.email is None
|
||||
@@ -53,7 +54,7 @@ class TestAccountSensitiveFields:
|
||||
def test_admin_can_explicitly_request_sensitive_fields(self):
|
||||
result = list_accounts(
|
||||
assigned_only=False,
|
||||
tag=None,
|
||||
tag="",
|
||||
has_cookie=False,
|
||||
search="",
|
||||
page=1,
|
||||
@@ -63,6 +64,7 @@ class TestAccountSensitiveFields:
|
||||
current=self.admin,
|
||||
)
|
||||
|
||||
assert isinstance(result, dict)
|
||||
item = result["items"][0]
|
||||
assert item.password == "account-password"
|
||||
assert item.email == "account@example.com"
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
import pytest
|
||||
from types import SimpleNamespace
|
||||
from unittest.mock import patch
|
||||
from typing import cast
|
||||
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
|
||||
from web.backend.database import Base
|
||||
from web.backend.models import Account, LoginTask, User
|
||||
from web.backend.models import Account, LoginTask, ProxyConfig, User
|
||||
from web.backend.services.login_service import (
|
||||
LoginBatchRunner,
|
||||
cleanup_orphan_relogin_tasks,
|
||||
@@ -137,6 +138,7 @@ class TestCookieOperation:
|
||||
current=admin,
|
||||
)
|
||||
|
||||
assert isinstance(result, dict)
|
||||
assert result["total"] == 1
|
||||
assert [item["id"] for item in result["items"]] == [self.owned_task.id]
|
||||
|
||||
@@ -200,7 +202,7 @@ class TestCookieOperation:
|
||||
page=1,
|
||||
page_size=20,
|
||||
db=self.session,
|
||||
current=no_permission_user,
|
||||
current=cast(User, no_permission_user),
|
||||
)
|
||||
|
||||
def test_relogin_failed_record_stays_visible_and_can_be_checked(self):
|
||||
@@ -235,7 +237,7 @@ class TestCookieOperation:
|
||||
assert self.other_task.status == "success"
|
||||
|
||||
def test_runner_copies_proxy_config_before_background_execution(self):
|
||||
proxy = SimpleNamespace(
|
||||
proxy = ProxyConfig(
|
||||
enabled=True,
|
||||
http="http://127.0.0.1:8080",
|
||||
https="",
|
||||
|
||||
@@ -94,16 +94,18 @@ class TestDouyuGoldRechargeChannel:
|
||||
assert str(supplier.create_order.call_args.kwargs["pay_amount"]) == "10"
|
||||
self.session.refresh(self.task)
|
||||
assert self.task.status == "success"
|
||||
assert self.task.result["recharge_channel"] == "supplier_api"
|
||||
assert self.task.result["supplier_order_status"] == 2
|
||||
assert self.task.result["buy_num"] == 10
|
||||
assert self.task.result["out_order_id"] == expected_order_id
|
||||
assert self.task.result["recharge_account"] == "罗炅729"
|
||||
assert self.task.result["douyu_uid"] == "10001"
|
||||
assert self.task.result["order_id"] == "supplier-001"
|
||||
assert self.task.result["pay_amount"] == "10"
|
||||
assert "pay_url" not in self.task.result
|
||||
assert "sign" not in self.task.result["supplier_order"]
|
||||
task_result = self.task.result
|
||||
assert isinstance(task_result, dict)
|
||||
assert task_result["recharge_channel"] == "supplier_api"
|
||||
assert task_result["supplier_order_status"] == 2
|
||||
assert task_result["buy_num"] == 10
|
||||
assert task_result["out_order_id"] == expected_order_id
|
||||
assert task_result["recharge_account"] == "罗炅729"
|
||||
assert task_result["douyu_uid"] == "10001"
|
||||
assert task_result["order_id"] == "supplier-001"
|
||||
assert task_result["pay_amount"] == "10"
|
||||
assert "pay_url" not in task_result
|
||||
assert "sign" not in task_result["supplier_order"]
|
||||
|
||||
@patch("web.backend.services.douyu_runner_gold.FishFinRechargeClient")
|
||||
def test_supplier_channel_rejects_account_without_nickname(self, client_class):
|
||||
@@ -226,13 +228,14 @@ class TestDouyuGoldRechargeChannel:
|
||||
try:
|
||||
task = verify_session.get(DouyuTask, task_id)
|
||||
checked_login = verify_session.get(LoginTask, login_task_id)
|
||||
assert task is not None
|
||||
assert checked_login is not None
|
||||
assert task.status == "failed"
|
||||
assert "Cookie 已失效,请重新登录" in task.message
|
||||
assert checked_login.ck_check_status == "invalid"
|
||||
assert (
|
||||
checked_login.ck_check_result["message"]
|
||||
== "鱼丸接口: 未登录;等级接口: 未登录"
|
||||
)
|
||||
check_result = checked_login.ck_check_result
|
||||
assert isinstance(check_result, dict)
|
||||
assert check_result["message"] == "鱼丸接口: 未登录;等级接口: 未登录"
|
||||
finally:
|
||||
verify_session.close()
|
||||
|
||||
@@ -273,8 +276,10 @@ class TestDouyuGoldRechargeChannel:
|
||||
assert self.task.message == "供应商直充成功(异步通知)"
|
||||
self.session.refresh(self.account)
|
||||
assert self.account.bind_status == "gold_recharged"
|
||||
assert self.task.result["order_id"] == "supplier-001"
|
||||
assert self.task.result["supplier_order_status"] == 2
|
||||
task_result = self.task.result
|
||||
assert isinstance(task_result, dict)
|
||||
assert task_result["order_id"] == "supplier-001"
|
||||
assert task_result["supplier_order_status"] == 2
|
||||
audit = (
|
||||
self.session.query(AuditLog)
|
||||
.filter(AuditLog.action == "recharge:douyu:callback")
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from types import SimpleNamespace
|
||||
from unittest.mock import Mock
|
||||
from typing import Any, cast
|
||||
|
||||
from core.douyu.login import DouyuLogin
|
||||
from core.douyu.login_api_wgapi import WgapiLoginAPI
|
||||
@@ -9,13 +10,14 @@ class TestMobileBindSkip:
|
||||
def setup_method(self):
|
||||
self.login = DouyuLogin.__new__(DouyuLogin)
|
||||
self.login.api = WgapiLoginAPI()
|
||||
self.login.account = SimpleNamespace(
|
||||
username="test-user", password="test-password"
|
||||
self.login.account = cast(
|
||||
Any, SimpleNamespace(username="test-user", password="test-password")
|
||||
)
|
||||
self.login._request_json = Mock()
|
||||
self.request_json = Mock()
|
||||
self.login.__dict__["_request_json"] = self.request_json
|
||||
|
||||
def test_second_login_skips_mobile_bind_with_unique_key(self):
|
||||
self.login._request_json.side_effect = [
|
||||
self.request_json.side_effect = [
|
||||
{
|
||||
"error": 130014,
|
||||
"msg": "需要进行手机号绑定",
|
||||
@@ -41,8 +43,8 @@ class TestMobileBindSkip:
|
||||
assert (
|
||||
login_url == "https://www.douyu.com/api/passport/login?code=callback-code"
|
||||
)
|
||||
assert self.login._request_json.call_count == 2
|
||||
skip_call = self.login._request_json.call_args_list[1]
|
||||
assert self.request_json.call_count == 2
|
||||
skip_call = self.request_json.call_args_list[1]
|
||||
assert skip_call.args[:3] == (
|
||||
"post",
|
||||
"https://passport.douyu.com/wgapi/member/passport/login",
|
||||
@@ -55,7 +57,7 @@ class TestMobileBindSkip:
|
||||
}
|
||||
|
||||
def test_second_login_preserves_remote_email_flow_without_unique_key(self):
|
||||
self.login._request_json.return_value = {
|
||||
self.request_json.return_value = {
|
||||
"error": 130014,
|
||||
"data": {"remoteLogin": {"code": "remote-code"}},
|
||||
}
|
||||
@@ -69,4 +71,4 @@ class TestMobileBindSkip:
|
||||
)
|
||||
|
||||
assert (next_step, remote_code) == ("remote_email", "remote-code")
|
||||
assert self.login._request_json.call_count == 1
|
||||
assert self.request_json.call_count == 1
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import pytest
|
||||
from types import SimpleNamespace
|
||||
|
||||
from sqlalchemy import create_engine, event
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
@@ -54,12 +53,6 @@ class TestDouyuWorkbenchScope:
|
||||
)
|
||||
)
|
||||
self.session.commit()
|
||||
self.current = SimpleNamespace(
|
||||
id=self.user.id,
|
||||
username=self.user.username,
|
||||
role=self.user.role,
|
||||
custom_permissions=None,
|
||||
)
|
||||
|
||||
def teardown_method(self):
|
||||
self.session.close()
|
||||
@@ -72,12 +65,10 @@ class TestDouyuWorkbenchScope:
|
||||
handbook_scope="elite", account_ids=[self.account.id]
|
||||
),
|
||||
db=self.session,
|
||||
current=self.current,
|
||||
)
|
||||
elite = list_workbench_accounts("elite", db=self.session, current=self.current)
|
||||
esports = list_workbench_accounts(
|
||||
"esports", db=self.session, current=self.current
|
||||
current=self.user,
|
||||
)
|
||||
elite = list_workbench_accounts("elite", db=self.session, current=self.user)
|
||||
esports = list_workbench_accounts("esports", db=self.session, current=self.user)
|
||||
assert elite["account_ids"] == [self.account.id]
|
||||
assert esports["account_ids"] == []
|
||||
assert elite["configured"]
|
||||
@@ -87,10 +78,10 @@ class TestDouyuWorkbenchScope:
|
||||
update_workbench_accounts(
|
||||
DouyuWorkbenchAccountsUpdate(handbook_scope="elite", account_ids=[]),
|
||||
db=self.session,
|
||||
current=self.current,
|
||||
current=self.user,
|
||||
)
|
||||
empty_elite = list_workbench_accounts(
|
||||
"elite", db=self.session, current=self.current
|
||||
"elite", db=self.session, current=self.user
|
||||
)
|
||||
assert empty_elite["account_ids"] == []
|
||||
assert empty_elite["configured"]
|
||||
@@ -118,7 +109,7 @@ class TestDouyuWorkbenchScope:
|
||||
page=None,
|
||||
page_size=100,
|
||||
db=self.session,
|
||||
current=self.current,
|
||||
current=self.user,
|
||||
)
|
||||
esports = list_tasks(
|
||||
batch_id=None,
|
||||
@@ -127,8 +118,10 @@ class TestDouyuWorkbenchScope:
|
||||
page=None,
|
||||
page_size=100,
|
||||
db=self.session,
|
||||
current=self.current,
|
||||
current=self.user,
|
||||
)
|
||||
assert isinstance(elite, list)
|
||||
assert isinstance(esports, list)
|
||||
assert {item.batch_id for item in elite} == {elite_batch}
|
||||
assert {item.batch_id for item in esports} == {esports_batch}
|
||||
assert {
|
||||
@@ -182,6 +175,6 @@ class TestDouyuWorkbenchScope:
|
||||
)
|
||||
self.session.commit()
|
||||
|
||||
delete_account(self.account.id, db=self.session, current=self.current)
|
||||
delete_account(self.account.id, db=self.session, current=self.user)
|
||||
|
||||
assert self.session.query(DouyuWorkbenchAccount).count() == 0
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
import pytest
|
||||
from types import SimpleNamespace
|
||||
|
||||
from sqlalchemy import create_engine, event
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
|
||||
@@ -53,11 +51,12 @@ class TestUserDeletion:
|
||||
result = delete_user(
|
||||
self.user.id,
|
||||
db=self.session,
|
||||
current=SimpleNamespace(id=self.admin.id, username=self.admin.username),
|
||||
current=self.admin,
|
||||
)
|
||||
|
||||
deleted = self.session.get(User, self.user.id)
|
||||
account = self.session.query(Account).one()
|
||||
assert deleted is not None
|
||||
assert result["success"]
|
||||
assert result["released_accounts"] == 1
|
||||
assert not deleted.is_active
|
||||
@@ -74,7 +73,7 @@ class TestUserDeletion:
|
||||
delete_user(
|
||||
self.user.id,
|
||||
db=self.session,
|
||||
current=SimpleNamespace(id=self.user.id, username=self.user.username),
|
||||
current=self.user,
|
||||
)
|
||||
|
||||
def test_rename_preserves_user_id_and_related_data(self):
|
||||
@@ -82,12 +81,13 @@ class TestUserDeletion:
|
||||
self.user.id,
|
||||
UserRename(username="renamed-support"),
|
||||
db=self.session,
|
||||
current=SimpleNamespace(id=self.admin.id, username=self.admin.username),
|
||||
current=self.admin,
|
||||
)
|
||||
|
||||
renamed = self.session.get(User, self.user.id)
|
||||
account = self.session.query(Account).one()
|
||||
task = self.session.query(LoginTask).one()
|
||||
assert renamed is not None
|
||||
assert result.username == "renamed-support"
|
||||
assert renamed.id == self.user.id
|
||||
assert account.assigned_to == self.user.id
|
||||
|
||||
Reference in New Issue
Block a user