package auth import ( "testing" "time" "github.com/pquerna/otp/totp" ) func TestHashAndVerifyPassword(t *testing.T) { hash, err := HashPassword("correct-horse-battery-staple") if err != nil { t.Fatalf("HashPassword: %v", err) } if !VerifyPassword(hash, "correct-horse-battery-staple") { t.Error("VerifyPassword should return true for correct password") } if VerifyPassword(hash, "wrong-password") { t.Error("VerifyPassword should return false for wrong password") } } func TestGenerateTOTP(t *testing.T) { qr, secret, err := GenerateTOTP("TestApp", "user@test") if err != nil { t.Fatalf("GenerateTOTP: %v", err) } if secret == "" { t.Error("secret should not be empty") } if qr == "" { t.Error("qr should not be empty") } } func TestValidateTOTPCode(t *testing.T) { _, secret, err := GenerateTOTP("TestApp", "user@test") if err != nil { t.Fatalf("GenerateTOTP: %v", err) } // Generate a valid code code, err := totp.GenerateCode(secret, time.Now()) if err != nil { t.Fatalf("GenerateCode: %v", err) } if !ValidateTOTPCode(code, secret) { t.Error("ValidateTOTPCode should return true for valid code") } if ValidateTOTPCode("000000", secret) { t.Error("ValidateTOTPCode should return false for invalid code") } } func TestGenerateState(t *testing.T) { s1, err := GenerateState() if err != nil { t.Fatalf("GenerateState: %v", err) } s2, err := GenerateState() if err != nil { t.Fatalf("GenerateState: %v", err) } if s1 == s2 { t.Error("GenerateState should return unique values") } if len(s1) != 32 { // 16 bytes → 32 hex chars t.Errorf("GenerateState length = %d, want 32", len(s1)) } }