You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

hcaptcha_test.go 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package hcaptcha
  4. import (
  5. "net/http"
  6. "os"
  7. "strings"
  8. "testing"
  9. "time"
  10. )
  11. const (
  12. dummySiteKey = "10000000-ffff-ffff-ffff-000000000001"
  13. dummySecret = "0x0000000000000000000000000000000000000000"
  14. dummyToken = "10000000-aaaa-bbbb-cccc-000000000001"
  15. )
  16. func TestMain(m *testing.M) {
  17. os.Exit(m.Run())
  18. }
  19. func TestCaptcha(t *testing.T) {
  20. tt := []struct {
  21. Name string
  22. Secret string
  23. Token string
  24. Error ErrorCode
  25. }{
  26. {
  27. Name: "Success",
  28. Secret: dummySecret,
  29. Token: dummyToken,
  30. },
  31. {
  32. Name: "Missing Secret",
  33. Token: dummyToken,
  34. Error: ErrMissingInputSecret,
  35. },
  36. {
  37. Name: "Missing Token",
  38. Secret: dummySecret,
  39. Error: ErrMissingInputResponse,
  40. },
  41. {
  42. Name: "Invalid Token",
  43. Secret: dummySecret,
  44. Token: "test",
  45. Error: ErrInvalidInputResponse,
  46. },
  47. }
  48. for _, tc := range tt {
  49. t.Run(tc.Name, func(t *testing.T) {
  50. client, err := New(tc.Secret, WithHTTP(&http.Client{
  51. Timeout: time.Second * 5,
  52. }))
  53. if err != nil {
  54. // The only error that can be returned from creating a client
  55. if tc.Error == ErrMissingInputSecret && err == ErrMissingInputSecret {
  56. return
  57. }
  58. t.Log(err)
  59. t.FailNow()
  60. }
  61. resp, err := client.Verify(tc.Token, PostOptions{
  62. Sitekey: dummySiteKey,
  63. })
  64. if err != nil {
  65. // The only error that can be returned prior to the request
  66. if tc.Error == ErrMissingInputResponse && err == ErrMissingInputResponse {
  67. return
  68. }
  69. t.Log(err)
  70. t.FailNow()
  71. }
  72. if tc.Error.String() != "" {
  73. if resp.Success {
  74. t.Log("Verification should fail.")
  75. t.Fail()
  76. }
  77. if len(resp.ErrorCodes) == 0 {
  78. t.Log("hCaptcha should have returned an error.")
  79. t.Fail()
  80. }
  81. var hasErr bool
  82. for _, err := range resp.ErrorCodes {
  83. if strings.EqualFold(err.String(), tc.Error.String()) {
  84. hasErr = true
  85. break
  86. }
  87. }
  88. if !hasErr {
  89. t.Log("hCaptcha did not return the error being tested")
  90. t.Fail()
  91. }
  92. } else if !resp.Success {
  93. t.Log("Verification should succeed.")
  94. t.Fail()
  95. }
  96. })
  97. }
  98. }