新增线下收款记录和 ai 修图优化
This commit is contained in:
@@ -200,4 +200,91 @@ final class LoginViewModelTests: XCTestCase {
|
||||
XCTFail("意外错误: \(error)")
|
||||
}
|
||||
}
|
||||
|
||||
/// 密码校验成功后发现账号处于注销冷静期,应先确认恢复,再继续原有登录流程。
|
||||
func testPendingAccountDeletionCanBeCanceledAndResumeLogin() async throws {
|
||||
let loginJSON = """
|
||||
{
|
||||
"code": 100000,
|
||||
"msg": "success",
|
||||
"data": {
|
||||
"token": "pending-token",
|
||||
"scenic_users": [
|
||||
{
|
||||
"account_type": "scenic_user",
|
||||
"id": 101,
|
||||
"user_id": 101,
|
||||
"scenic_user_id": 101,
|
||||
"ss_user_id": 101,
|
||||
"username": "scenic_admin",
|
||||
"real_name": "张三",
|
||||
"nickname": "张三",
|
||||
"phone": "13800138000",
|
||||
"scenic_id": 10,
|
||||
"scenic_name": "示例景区",
|
||||
"is_current": false
|
||||
}
|
||||
],
|
||||
"store_users": []
|
||||
}
|
||||
}
|
||||
""".data(using: .utf8)!
|
||||
let setUserJSON = """
|
||||
{
|
||||
"code": 100000,
|
||||
"msg": "success",
|
||||
"data": {
|
||||
"token": "business-token-after-restore",
|
||||
"scenic_users": [],
|
||||
"store_users": []
|
||||
}
|
||||
}
|
||||
""".data(using: .utf8)!
|
||||
|
||||
let suiteName = "LoginViewModelTests.AccountDeletion.\(UUID().uuidString)"
|
||||
let deletionDefaults = UserDefaults(suiteName: suiteName)!
|
||||
deletionDefaults.removePersistentDomain(forName: suiteName)
|
||||
defer { deletionDefaults.removePersistentDomain(forName: suiteName) }
|
||||
let fixedDate = Date(timeIntervalSince1970: 1_800_000_000)
|
||||
let deletionService = AccountDeletionMockService(
|
||||
defaults: deletionDefaults,
|
||||
now: { fixedDate },
|
||||
responseDelayNanoseconds: 0
|
||||
)
|
||||
_ = try await deletionService.submitDeletion(
|
||||
username: "18651857230",
|
||||
verificationCode: AccountDeletionMockService.verificationCode,
|
||||
acknowledgedAssetKinds: Set(AccountDeletionAssetSummary.Kind.allCases),
|
||||
clientRequestID: UUID()
|
||||
)
|
||||
|
||||
let session = MockURLSession(responses: [loginJSON, setUserJSON])
|
||||
let api = AuthAPI(client: APIClient(environment: .testing, session: session))
|
||||
let viewModel = LoginViewModel(accountDeletionService: deletionService)
|
||||
viewModel.updateAccount("18651857230")
|
||||
viewModel.updatePassword("secret123")
|
||||
viewModel.togglePrivacyChecked()
|
||||
|
||||
let initialResolution = try await viewModel.login(authAPI: api)
|
||||
guard case let .accountDeletionPending(verifiedResponse, request) = initialResolution else {
|
||||
return XCTFail("应先提示账号正在注销中")
|
||||
}
|
||||
XCTAssertEqual(request.username, "18651857230")
|
||||
XCTAssertEqual(session.requests.map { $0.url?.path }, ["/api/app/v9/login"])
|
||||
|
||||
let resumedResolution = try await viewModel.resumeLoginAfterCancelingDeletion(
|
||||
verifiedResponse: verifiedResponse,
|
||||
authAPI: api
|
||||
)
|
||||
guard case let .completed(response, account) = resumedResolution else {
|
||||
return XCTFail("取消注销后应完成登录")
|
||||
}
|
||||
XCTAssertEqual(response.token, "business-token-after-restore")
|
||||
XCTAssertEqual(account.businessUserId, 101)
|
||||
XCTAssertEqual(deletionService.loginState(for: "18651857230"), .none)
|
||||
XCTAssertEqual(session.requests.map { $0.url?.path }, [
|
||||
"/api/app/v9/login",
|
||||
"/api/app/v9/set-user",
|
||||
])
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user