from types import SimpleNamespace from typing import Any, cast from unittest.mock import Mock from core.douyu.login import DouyuLogin from core.douyu.login_api_wgapi import WgapiLoginAPI class TestMobileBindSkip: def setup_method(self): self.login = DouyuLogin.__new__(DouyuLogin) self.login.api = WgapiLoginAPI() self.login.account = cast( Any, SimpleNamespace(username="test-user", password="test-password") ) self.request_json = Mock() self.login.__dict__["_request_json"] = self.request_json def test_second_login_skips_mobile_bind_with_unique_key(self): self.request_json.side_effect = [ { "error": 130014, "msg": "需要进行手机号绑定", "data": {"mobileBind": {"uniqueKey": "one-time-key"}}, }, { "error": 0, "data": { "url": "//www.douyu.com/api/passport/login?code=callback-code" }, }, ] next_step, login_url = self.login._second_login( "gt", "challenge", "validate", "validate|jordan", "code-token", ) assert next_step == "mobile_bind_skip" assert ( login_url == "https://www.douyu.com/api/passport/login?code=callback-code" ) 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", "跳过手机号绑定接口", ) assert skip_call.kwargs["data"] == { "type": "3", "uniqueKey": "one-time-key", "biz_type": "1", } def test_second_login_preserves_remote_email_flow_without_unique_key(self): self.request_json.return_value = { "error": 130014, "data": {"remoteLogin": {"code": "remote-code"}}, } next_step, remote_code = self.login._second_login( "gt", "challenge", "validate", "validate|jordan", "code-token", ) assert (next_step, remote_code) == ("remote_email", "remote-code") assert self.request_json.call_count == 1