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  }