@@ -59,3 +59,114 @@ func Test(t *testing.T) {
5959 })
6060 }
6161}
62+
63+ //nolint:goconst
64+ func TestNewCached (t * testing.T ) {
65+ authFunc := func (ctx context.Context , r * http.Request , userName , password string ) (auth.Info , error ) {
66+ if userName == "auth-error" {
67+ return nil , fmt .Errorf ("Invalid credentials" )
68+ }
69+
70+ return auth .NewDefaultUser ("test" , "10" , nil , nil ), nil
71+ }
72+
73+ table := []struct {
74+ name string
75+ setCredentials func (r * http.Request )
76+ expectedErr bool
77+ }{
78+ {
79+ name : "it return user from cache" ,
80+ setCredentials : func (r * http.Request ) { r .SetBasicAuth ("predefined2" , "test" ) },
81+ expectedErr : false ,
82+ },
83+ {
84+ name : "it re-authenticate user when hash missing" ,
85+ setCredentials : func (r * http.Request ) { r .SetBasicAuth ("predefined3" , "test" ) },
86+ expectedErr : false ,
87+ },
88+ {
89+ name : "it return error when cache hold invalid user info" ,
90+ setCredentials : func (r * http.Request ) { r .SetBasicAuth ("predefined" , "test" ) },
91+ expectedErr : true ,
92+ },
93+ {
94+ name : "it return error when cache return error on load" ,
95+ setCredentials : func (r * http.Request ) { r .SetBasicAuth ("error" , "test" ) },
96+ expectedErr : true ,
97+ },
98+ {
99+ name : "it return error when cache return error on store" ,
100+ setCredentials : func (r * http.Request ) { r .SetBasicAuth ("store-error" , "test" ) },
101+ expectedErr : true ,
102+ },
103+ {
104+ name : "it return user info when request authenticated" ,
105+ setCredentials : func (r * http.Request ) { r .SetBasicAuth ("test" , "test" ) },
106+ expectedErr : false ,
107+ },
108+ {
109+ name : "it return error when request has invalid credentials" ,
110+ setCredentials : func (r * http.Request ) { r .SetBasicAuth ("auth-error" , "unknown" ) },
111+ expectedErr : true ,
112+ },
113+ {
114+ name : "it return error when request missing basic auth params" ,
115+ setCredentials : func (r * http.Request ) { /* no op */ },
116+ expectedErr : true ,
117+ },
118+ }
119+
120+ for _ , tt := range table {
121+ t .Run (tt .name , func (t * testing.T ) {
122+ r , _ := http .NewRequest ("GET" , "/" , nil )
123+ tt .setCredentials (r )
124+
125+ cache := make (mockCache )
126+ cache ["predefined" ] = "invalid-type"
127+ cache ["predefined2" ] = auth .NewDefaultUser (
128+ "predefined2" ,
129+ "10" ,
130+ nil ,
131+ map [string ][]string {
132+ ExtensionKey : {"$2a$10$aj7RBUkAjknXMyqeLW0v3.FF0aarP4/MraQD7bsmvQ6YSQzxCyyKG" },
133+ },
134+ )
135+ cache ["predefined3" ] = auth .NewDefaultUser ("predefined3" , "10" , nil , nil )
136+
137+ info , err := New (authFunc , cache ).Authenticate (r .Context (), r )
138+
139+ if tt .expectedErr && err == nil {
140+ t .Errorf ("%s: Expected error, got none" , tt .name )
141+ return
142+ }
143+
144+ if ! tt .expectedErr && info == nil {
145+ t .Errorf ("%s: Expected info object, got nil: %v" , tt .name , err )
146+ return
147+ }
148+ })
149+ }
150+ }
151+
152+ type mockCache map [string ]interface {}
153+
154+ func (m mockCache ) Load (key string , _ * http.Request ) (interface {}, bool , error ) {
155+ if key == "error" {
156+ return nil , false , fmt .Errorf ("Load Error" )
157+ }
158+ v , ok := m [key ]
159+ return v , ok , nil
160+ }
161+
162+ func (m mockCache ) Store (key string , value interface {}, _ * http.Request ) error {
163+ if key == "store-error" {
164+ return fmt .Errorf ("Store Error" )
165+ }
166+ m [key ] = value
167+ return nil
168+ }
169+
170+ func (m mockCache ) Delete (key string , _ * http.Request ) error {
171+ return nil
172+ }
0 commit comments