=== RUN   TestValidatePasswordStrength_TooShort
--- PASS: TestValidatePasswordStrength_TooShort (0.00s)
=== RUN   TestValidatePasswordStrength_OnlyLowercase
--- PASS: TestValidatePasswordStrength_OnlyLowercase (0.00s)
=== RUN   TestValidatePasswordStrength_LowerAndDigit
--- PASS: TestValidatePasswordStrength_LowerAndDigit (0.00s)
=== RUN   TestValidatePasswordStrength_StrictMode_MissingUpper
--- PASS: TestValidatePasswordStrength_StrictMode_MissingUpper (0.00s)
=== RUN   TestValidatePasswordStrength_StrictMode_MissingDigit
--- PASS: TestValidatePasswordStrength_StrictMode_MissingDigit (0.00s)
=== RUN   TestValidatePasswordStrength_StrictMode_Valid
--- PASS: TestValidatePasswordStrength_StrictMode_Valid (0.00s)
=== RUN   TestValidatePasswordStrength_ExactMinLen
--- PASS: TestValidatePasswordStrength_ExactMinLen (0.00s)
=== RUN   TestGetPasswordStrength_Scoring
--- PASS: TestGetPasswordStrength_Scoring (0.00s)
=== RUN   TestGetPasswordStrength_WeakPassword
--- PASS: TestGetPasswordStrength_WeakPassword (0.00s)
=== RUN   TestRegister_WeakPassword_TooShort
--- PASS: TestRegister_WeakPassword_TooShort (0.00s)
=== RUN   TestRegister_WeakPassword_SingleCharType
--- PASS: TestRegister_WeakPassword_SingleCharType (0.00s)
=== RUN   TestRegister_StrongPassword_Accepted
--- PASS: TestRegister_StrongPassword_Accepted (0.06s)
=== RUN   TestLogin_LockAfterMaxAttempts
--- PASS: TestLogin_LockAfterMaxAttempts (0.26s)
=== RUN   TestLogin_SuccessAfterCorrectPassword_ClearsAttempts
--- PASS: TestLogin_SuccessAfterCorrectPassword_ClearsAttempts (0.26s)
=== RUN   TestLogin_ByEmail
--- PASS: TestLogin_ByEmail (0.13s)
=== RUN   TestLogin_ByPhone
--- PASS: TestLogin_ByPhone (0.13s)
=== RUN   TestRefreshToken_Success
--- PASS: TestRefreshToken_Success (0.13s)
=== RUN   TestRefreshToken_InvalidToken
--- PASS: TestRefreshToken_InvalidToken (0.00s)
=== RUN   TestLogout_BlacklistsToken
--- PASS: TestLogout_BlacklistsToken (0.13s)
=== RUN   TestIsTokenBlacklisted_EmptyJTI
--- PASS: TestIsTokenBlacklisted_EmptyJTI (0.00s)
=== RUN   TestGetUserInfo_Success
--- PASS: TestGetUserInfo_Success (0.06s)
=== RUN   TestGetUserInfo_NotFound
--- PASS: TestGetUserInfo_NotFound (0.00s)
=== RUN   TestRobust_Password_ExactMinLength
--- PASS: TestRobust_Password_ExactMinLength (0.00s)
=== RUN   TestRobust_Password_OneBelowMinLength
--- PASS: TestRobust_Password_OneBelowMinLength (0.00s)
=== RUN   TestRobust_Password_MaxReasonableLength
--- PASS: TestRobust_Password_MaxReasonableLength (0.00s)
=== RUN   TestRobust_Password_UnicodeCharacters
--- PASS: TestRobust_Password_UnicodeCharacters (0.00s)
=== RUN   TestRobust_Password_AllSpecialChars
--- PASS: TestRobust_Password_AllSpecialChars (0.00s)
=== RUN   TestRobust_Password_SpecialPlusDigit
--- PASS: TestRobust_Password_SpecialPlusDigit (0.00s)
=== RUN   TestRobust_Password_EmptyString
--- PASS: TestRobust_Password_EmptyString (0.00s)
=== RUN   TestRobust_Password_WhitespaceOnly
--- PASS: TestRobust_Password_WhitespaceOnly (0.00s)
=== RUN   TestRobust_Register_EmptyUsername
--- PASS: TestRobust_Register_EmptyUsername (0.07s)
=== RUN   TestRobust_Register_VeryLongUsername
--- PASS: TestRobust_Register_VeryLongUsername (0.06s)
=== RUN   TestRobust_Register_SQLInjectionInUsername
--- PASS: TestRobust_Register_SQLInjectionInUsername (0.06s)
=== RUN   TestRobust_Register_XSSInNickname
--- PASS: TestRobust_Register_XSSInNickname (0.06s)
=== RUN   TestRobust_Register_InvalidEmailFormats
--- PASS: TestRobust_Register_InvalidEmailFormats (0.33s)
=== RUN   TestRobust_Login_EmptyAccount
--- PASS: TestRobust_Login_EmptyAccount (0.00s)
=== RUN   TestRobust_Login_EmptyPassword
--- PASS: TestRobust_Login_EmptyPassword (0.13s)
=== RUN   TestRobust_Login_NullByteInInput
--- PASS: TestRobust_Login_NullByteInInput (0.00s)
=== RUN   TestRobust_Login_VeryLongInput
--- PASS: TestRobust_Login_VeryLongInput (0.00s)
=== RUN   TestRobust_Login_DisabledUser
--- PASS: TestRobust_Login_DisabledUser (0.06s)
=== RUN   TestRobust_Login_LockedUser
--- PASS: TestRobust_Login_LockedUser (0.06s)
=== RUN   TestRobust_Login_InactiveUser
--- PASS: TestRobust_Login_InactiveUser (0.07s)
=== RUN   TestRobust_Login_LockCounterResetsAfterSuccess
--- PASS: TestRobust_Login_LockCounterResetsAfterSuccess (0.64s)
=== RUN   TestRobust_ValidateToken_Tampered
--- PASS: TestRobust_ValidateToken_Tampered (0.00s)
=== RUN   TestRobust_ValidateToken_EmptyString
--- PASS: TestRobust_ValidateToken_EmptyString (0.00s)
=== RUN   TestRobust_ValidateToken_WrongSecret
--- PASS: TestRobust_ValidateToken_WrongSecret (0.00s)
=== RUN   TestRobust_ValidateToken_RefreshTokenUsedAsAccess
--- PASS: TestRobust_ValidateToken_RefreshTokenUsedAsAccess (0.00s)
=== RUN   TestRobust_RefreshToken_WithExpiredToken
--- PASS: TestRobust_RefreshToken_WithExpiredToken (0.01s)
=== RUN   TestRobust_ConcurrentRegister_UniqueUsernames
--- PASS: TestRobust_ConcurrentRegister_UniqueUsernames (0.26s)
=== RUN   TestRobust_ConcurrentLogin_SameUser
--- PASS: TestRobust_ConcurrentLogin_SameUser (0.21s)
=== RUN   TestRobust_ConcurrentRegister_DuplicateUsername
    auth_robustness_test.go:438: 并发重复用户名注册：16 次成功（mock 无锁，真实 DB 应为 1）
--- PASS: TestRobust_ConcurrentRegister_DuplicateUsername (0.10s)
=== RUN   TestRobust_Logout_Idempotent
--- PASS: TestRobust_Logout_Idempotent (0.13s)
=== RUN   TestRobust_Logout_NilRequest
--- PASS: TestRobust_Logout_NilRequest (0.00s)
=== RUN   TestRobust_IsTokenBlacklisted_EmptyJTI
--- PASS: TestRobust_IsTokenBlacklisted_EmptyJTI (0.00s)
=== RUN   TestRobust_GetPasswordStrength_EmptyInput
--- PASS: TestRobust_GetPasswordStrength_EmptyInput (0.00s)
=== RUN   TestRobust_GetPasswordStrength_AllTypes
--- PASS: TestRobust_GetPasswordStrength_AllTypes (0.00s)
=== RUN   TestRobust_GetPasswordStrength_MaxLengthInput
--- PASS: TestRobust_GetPasswordStrength_MaxLengthInput (0.00s)
=== RUN   TestRegister_Success
--- PASS: TestRegister_Success (0.07s)
=== RUN   TestRegister_DuplicateUsername
--- PASS: TestRegister_DuplicateUsername (0.06s)
=== RUN   TestRegister_DuplicateEmail
--- PASS: TestRegister_DuplicateEmail (0.06s)
=== RUN   TestLogin_Success
--- PASS: TestLogin_Success (0.13s)
=== RUN   TestLogin_WrongPassword
--- PASS: TestLogin_WrongPassword (0.13s)
=== RUN   TestLogin_UserNotFound
--- PASS: TestLogin_UserNotFound (0.00s)
=== RUN   TestLogin_DisabledUser
--- PASS: TestLogin_DisabledUser (0.06s)
=== RUN   TestCaptchaService_Generate
--- PASS: TestCaptchaService_Generate (0.00s)
=== RUN   TestCaptchaService_Verify_WrongAnswer
--- PASS: TestCaptchaService_Verify_WrongAnswer (0.00s)
=== RUN   TestCaptchaService_Verify_EmptyInputs
--- PASS: TestCaptchaService_Verify_EmptyInputs (0.00s)
=== RUN   TestCaptchaService_ValidateCaptcha_EmptyID
--- PASS: TestCaptchaService_ValidateCaptcha_EmptyID (0.00s)
=== RUN   TestCaptchaService_Generate_UniqueIDs
--- PASS: TestCaptchaService_Generate_UniqueIDs (0.01s)
=== RUN   TestDeviceService_CreateAndList
--- PASS: TestDeviceService_CreateAndList (0.01s)
=== RUN   TestDeviceService_DeleteDevice
--- PASS: TestDeviceService_DeleteDevice (0.00s)
=== RUN   TestDeviceService_UpdateDeviceStatus
--- PASS: TestDeviceService_UpdateDeviceStatus (0.00s)
=== RUN   TestLoginLogService_RecordAndList
--- PASS: TestLoginLogService_RecordAndList (0.00s)
=== RUN   TestLoginLogService_RecordFailedLogin
--- PASS: TestLoginLogService_RecordFailedLogin (0.00s)
=== RUN   TestOperationLogService_RecordAndList
--- PASS: TestOperationLogService_RecordAndList (0.00s)
=== RUN   TestPermissionService_CreateAndList
--- PASS: TestPermissionService_CreateAndList (0.00s)
=== RUN   TestPermissionService_DuplicateCode
--- PASS: TestPermissionService_DuplicateCode (0.00s)
=== RUN   TestPermissionService_GetAndUpdate
--- PASS: TestPermissionService_GetAndUpdate (0.00s)
=== RUN   TestPermissionService_Delete
--- PASS: TestPermissionService_Delete (0.00s)
=== RUN   TestRoleService_CreateAndGet
--- PASS: TestRoleService_CreateAndGet (0.00s)
=== RUN   TestRoleService_DuplicateCode
--- PASS: TestRoleService_DuplicateCode (0.00s)
=== RUN   TestRoleService_ListRoles
--- PASS: TestRoleService_ListRoles (0.00s)
=== RUN   TestRoleService_UpdateRole
--- PASS: TestRoleService_UpdateRole (0.00s)
=== RUN   TestRoleService_DeleteRole
--- PASS: TestRoleService_DeleteRole (0.00s)
=== RUN   TestTOTPManager_GenerateSecret
--- PASS: TestTOTPManager_GenerateSecret (0.01s)
=== RUN   TestTOTPManager_Verify_ValidCode
--- PASS: TestTOTPManager_Verify_ValidCode (0.01s)
=== RUN   TestTOTPManager_Verify_InvalidCode
--- PASS: TestTOTPManager_Verify_InvalidCode (0.01s)
=== RUN   TestTOTPService_GetTOTPStatus_Disabled
--- PASS: TestTOTPService_GetTOTPStatus_Disabled (0.00s)
=== RUN   TestTOTPService_GetTOTPStatus_Enabled
--- PASS: TestTOTPService_GetTOTPStatus_Enabled (0.00s)
=== RUN   TestTOTPManager_RecoveryCodesFormat
--- PASS: TestTOTPManager_RecoveryCodesFormat (0.01s)
=== RUN   TestValidateRecoveryCode
--- PASS: TestValidateRecoveryCode (0.00s)
=== RUN   TestUserRepo_GetUser_NotFound
--- PASS: TestUserRepo_GetUser_NotFound (0.00s)
=== RUN   TestUserRepo_EmailConflictDetection
--- PASS: TestUserRepo_EmailConflictDetection (0.00s)
=== RUN   TestUserRepo_DeleteUser
--- PASS: TestUserRepo_DeleteUser (0.00s)
=== RUN   TestUserRepo_UpdateStatus
--- PASS: TestUserRepo_UpdateStatus (0.00s)
=== RUN   TestUserRepo_List_Pagination
--- PASS: TestUserRepo_List_Pagination (0.00s)
=== RUN   TestUserRepo_ListByStatus
--- PASS: TestUserRepo_ListByStatus (0.00s)
=== RUN   TestUserService_GetUser_NotFound
--- PASS: TestUserService_GetUser_NotFound (0.00s)
=== RUN   TestUserService_UpdateUser_Nickname
--- PASS: TestUserService_UpdateUser_Nickname (0.07s)
=== RUN   TestUserService_UpdateUser_EmailConflict
--- PASS: TestUserService_UpdateUser_EmailConflict (0.07s)
=== RUN   TestUserService_UpdateUser_Birthday
--- PASS: TestUserService_UpdateUser_Birthday (0.07s)
=== RUN   TestUserService_UpdatePassword_Success
--- PASS: TestUserService_UpdatePassword_Success (0.32s)
=== RUN   TestUserService_UpdatePassword_WrongOld
--- PASS: TestUserService_UpdatePassword_WrongOld (0.13s)
=== RUN   TestUserService_UpdatePassword_SameAsOld
--- PASS: TestUserService_UpdatePassword_SameAsOld (0.20s)
=== RUN   TestUserService_UpdatePassword_WeakNew
--- PASS: TestUserService_UpdatePassword_WeakNew (0.13s)
=== RUN   TestUserService_ListUsers_All
--- PASS: TestUserService_ListUsers_All (0.07s)
=== RUN   TestUserService_ListUsers_Pagination
--- PASS: TestUserService_ListUsers_Pagination (0.07s)
=== RUN   TestUserService_ListUsers_FilterByStatus
--- PASS: TestUserService_ListUsers_FilterByStatus (0.07s)
=== RUN   TestUserService_UpdateUserStatus
--- PASS: TestUserService_UpdateUserStatus (0.07s)
=== RUN   TestWebhookService_CreateAndList
--- PASS: TestWebhookService_CreateAndList (0.00s)
=== RUN   TestWebhookService_Update
--- PASS: TestWebhookService_Update (0.00s)
=== RUN   TestWebhookService_Delete
--- PASS: TestWebhookService_Delete (0.00s)
=== RUN   TestWebhookService_Publish_DeliveryRecord
--- PASS: TestWebhookService_Publish_DeliveryRecord (0.00s)
=== RUN   TestWebhookSubscribesTo
--- PASS: TestWebhookSubscribesTo (0.00s)
PASS
ok  	github.com/user-management-system/internal/service	5.528s
