github.com/hellofresh/janus@v0.0.0-20230925145208-ce8de8183c67/pkg/jwt/provider/verifier_test.go (about) 1 package provider 2 3 import ( 4 "errors" 5 "net/http" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 ) 11 12 var ( 13 r *http.Request 14 httpClient *http.Client 15 ) 16 17 type mockVerifier struct { 18 result1 bool 19 result2 error 20 } 21 22 func (v *mockVerifier) Verify(r *http.Request, httpClient *http.Client) (bool, error) { 23 return v.result1, v.result2 24 } 25 26 func (v *mockVerifier) VerifyReturns(result1 bool, result2 error) { 27 v.result1 = result1 28 v.result2 = result2 29 } 30 31 func TestVerifiersScenarios(t *testing.T) { 32 tests := []struct { 33 scenario string 34 function func(*testing.T, *mockVerifier, *mockVerifier, *VerifierBasket) 35 }{ 36 { 37 scenario: "when all verifiers fails, it should return false", 38 function: testAllVerifiersFailed, 39 }, 40 { 41 scenario: "when one verifier fails, it should return false", 42 function: testOneVerifierFailed, 43 }, 44 { 45 scenario: "when all verifiers have an error, it should return false and error", 46 function: testAllVerifiersError, 47 }, 48 { 49 scenario: "when one verifier has an error, it should return false and error", 50 function: testOneVerifierError, 51 }, 52 { 53 scenario: "when one verifier returns true and does not error, it should return true", 54 function: testOneVerifierReturnsTrueAndDoesNotError, 55 }, 56 } 57 58 for _, test := range tests { 59 t.Run(test.scenario, func(t *testing.T) { 60 t.Parallel() 61 fakeVerifier1 := new(mockVerifier) 62 fakeVerifier2 := new(mockVerifier) 63 verifierBasket := NewVerifierBasket(fakeVerifier1, fakeVerifier2) 64 65 test.function(t, fakeVerifier1, fakeVerifier2, verifierBasket) 66 }) 67 } 68 } 69 70 func testAllVerifiersFailed(t *testing.T, fakeVerifier1 *mockVerifier, fakeVerifier2 *mockVerifier, verifierBasket *VerifierBasket) { 71 fakeVerifier1.VerifyReturns(false, nil) 72 fakeVerifier2.VerifyReturns(false, nil) 73 result, err := verifierBasket.Verify(r, httpClient) 74 75 require.NoError(t, err) 76 assert.False(t, result) 77 } 78 79 func testOneVerifierFailed(t *testing.T, fakeVerifier1 *mockVerifier, fakeVerifier2 *mockVerifier, verifierBasket *VerifierBasket) { 80 fakeVerifier1.VerifyReturns(false, nil) 81 fakeVerifier2.VerifyReturns(true, nil) 82 result, err := verifierBasket.Verify(r, httpClient) 83 84 require.NoError(t, err) 85 assert.True(t, result) 86 } 87 88 func testAllVerifiersError(t *testing.T, fakeVerifier1 *mockVerifier, fakeVerifier2 *mockVerifier, verifierBasket *VerifierBasket) { 89 fakeVerifier1.VerifyReturns(false, errors.New("first error")) 90 fakeVerifier2.VerifyReturns(false, errors.New("second error")) 91 result, err := verifierBasket.Verify(r, httpClient) 92 93 require.Error(t, err) 94 assert.False(t, result) 95 } 96 97 func testOneVerifierError(t *testing.T, fakeVerifier1 *mockVerifier, fakeVerifier2 *mockVerifier, verifierBasket *VerifierBasket) { 98 fakeVerifier1.VerifyReturns(false, errors.New("first error")) 99 fakeVerifier2.VerifyReturns(false, nil) 100 result, err := verifierBasket.Verify(r, httpClient) 101 102 require.Error(t, err) 103 assert.False(t, result) 104 } 105 106 func testOneVerifierReturnsTrueAndDoesNotError(t *testing.T, fakeVerifier1 *mockVerifier, fakeVerifier2 *mockVerifier, verifierBasket *VerifierBasket) { 107 fakeVerifier1.VerifyReturns(false, errors.New("first error")) 108 fakeVerifier2.VerifyReturns(true, nil) 109 result, err := verifierBasket.Verify(r, httpClient) 110 111 require.NoError(t, err) 112 assert.True(t, result) 113 }