新增线下收款记录和 ai 修图优化

This commit is contained in:
han xin
2026-08-21 15:51:52 +08:00
parent 6fe9928b49
commit 5cf4409bad
40 changed files with 5482 additions and 56 deletions
+87
View File
@@ -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",
])
}
}