@@ -66,11 +66,11 @@ func TestLocalDirStoraget(t *testing.T) {
66
66
},
67
67
},
68
68
{
69
- name : "storing with query handler enabled should create indexes" ,
69
+ name : "storing with metas handler enabled should create indexes" ,
70
70
setup : func (t * testing.T ) (* LocalDirV1 , fs.FS ) {
71
71
s := & LocalDirV1 {
72
72
RootDir : t .TempDir (),
73
- EnableQueryHandler : true ,
73
+ EnableMetasHandler : true ,
74
74
}
75
75
return s , createTestFS (t )
76
76
},
@@ -106,7 +106,7 @@ func TestLocalDirStoraget(t *testing.T) {
106
106
for i := 0 ; i < 10 ; i ++ {
107
107
wg .Add (1 )
108
108
go func () {
109
- defer wg .Add ( - 1 )
109
+ defer wg .Done ( )
110
110
for j := 0 ; j < 100 ; j ++ {
111
111
s .ContentExists (catalog )
112
112
}
@@ -266,13 +266,13 @@ func TestLocalDirServerHandler(t *testing.T) {
266
266
}
267
267
}
268
268
269
- // Tests to verify the behavior of the query endpoint, as described in
269
+ // Tests to verify the behavior of the metas endpoint, as described in
270
270
// https://docs.google.com/document/d/1s6_9IFEKGQLNh3ueH7SF4Yrx4PW9NSiNFqFIJx0pU-8/edit?usp=sharing
271
- func TestQueryEndpoint (t * testing.T ) {
271
+ func TestMetasEndpoint (t * testing.T ) {
272
272
store := & LocalDirV1 {
273
273
RootDir : t .TempDir (),
274
274
RootURL : & url.URL {Path : urlPrefix },
275
- EnableQueryHandler : true ,
275
+ EnableMetasHandler : true ,
276
276
}
277
277
if store .Store (context .Background (), "test-catalog" , createTestFS (t )) != nil {
278
278
t .Fatal ("failed to store test catalog" )
@@ -281,7 +281,7 @@ func TestQueryEndpoint(t *testing.T) {
281
281
282
282
testCases := []struct {
283
283
name string
284
- setupStore func () ( * httptest. Server , error )
284
+ initRequest func (req * http. Request ) error
285
285
queryParams string
286
286
expectedStatusCode int
287
287
expectedContent string
@@ -329,27 +329,50 @@ func TestQueryEndpoint(t *testing.T) {
329
329
expectedContent : "" ,
330
330
},
331
331
{
332
- name : "cached response with If-Modified-Since" ,
333
- queryParams : "?schema=olm.package" ,
332
+ name : "valid query with packageName that returns multiple bolbs" ,
333
+ queryParams : "?package=webhook_operator_test" ,
334
+ expectedStatusCode : http .StatusOK ,
335
+ expectedContent : `{"image":"quaydock.io/namespace/bundle:0.0.3","name":"bundle.v0.0.1","package":"webhook_operator_test","properties":[{"type":"olm.bundle.object","value":{"data":"dW5pbXBvcnRhbnQK"}},{"type":"some.other","value":{"data":"arbitrary-info"}}],"relatedImages":[{"image":"testimage:latest","name":"test"}],"schema":"olm.bundle"}
336
+ {"entries":[{"name":"bundle.v0.0.1"}],"name":"preview_test","package":"webhook_operator_test","schema":"olm.channel"}` ,
337
+ },
338
+ {
339
+ name : "cached response with If-Modified-Since" ,
340
+ queryParams : "?schema=olm.package" ,
341
+ initRequest : func (req * http.Request ) error {
342
+ resp , err := http .DefaultClient .Do (req )
343
+ if err != nil {
344
+ return err
345
+ }
346
+ resp .Body .Close ()
347
+ req .Header .Set ("If-Modified-Since" , resp .Header .Get ("Last-Modified" ))
348
+ return nil
349
+ },
334
350
expectedStatusCode : http .StatusNotModified ,
335
351
expectedContent : "" ,
336
352
},
353
+ {
354
+ name : "request with unknown parameters" ,
355
+ queryParams : "?non-existent=foo" ,
356
+ expectedStatusCode : http .StatusBadRequest ,
357
+ expectedContent : "400 Bad Request" ,
358
+ },
359
+ {
360
+ name : "request with duplicate parameters" ,
361
+ queryParams : "?schema=olm.bundle&&schema=olm.bundle" ,
362
+ expectedStatusCode : http .StatusOK ,
363
+ expectedContent : `{"image":"quaydock.io/namespace/bundle:0.0.3","name":"bundle.v0.0.1","package":"webhook_operator_test","properties":[{"type":"olm.bundle.object","value":{"data":"dW5pbXBvcnRhbnQK"}},{"type":"some.other","value":{"data":"arbitrary-info"}}],"relatedImages":[{"image":"testimage:latest","name":"test"}],"schema":"olm.bundle"}` ,
364
+ },
337
365
}
338
366
339
367
for _ , tc := range testCases {
340
368
t .Run (tc .name , func (t * testing.T ) {
341
- req , err := http .NewRequest (http .MethodGet , fmt .Sprintf ("%s/catalogs/test-catalog/api/v1/metas%s" , testServer .URL , tc .queryParams ), nil )
369
+ reqGet , err := http .NewRequest (http .MethodGet , fmt .Sprintf ("%s/catalogs/test-catalog/api/v1/metas%s" , testServer .URL , tc .queryParams ), nil )
342
370
require .NoError (t , err )
343
371
344
- if strings .Contains (tc .name , "If-Modified-Since" ) {
345
- // Do an initial request to get a Last-Modified timestamp
346
- // for the actual request
347
- resp , err := http .DefaultClient .Do (req )
348
- require .NoError (t , err )
349
- resp .Body .Close ()
350
- req .Header .Set ("If-Modified-Since" , resp .Header .Get ("Last-Modified" ))
372
+ if tc .initRequest != nil {
373
+ require .NoError (t , tc .initRequest (reqGet ))
351
374
}
352
- resp , err := http .DefaultClient .Do (req )
375
+ resp , err := http .DefaultClient .Do (reqGet )
353
376
require .NoError (t , err )
354
377
defer resp .Body .Close ()
355
378
@@ -358,6 +381,42 @@ func TestQueryEndpoint(t *testing.T) {
358
381
actualContent , err := io .ReadAll (resp .Body )
359
382
require .NoError (t , err )
360
383
require .Equal (t , tc .expectedContent , strings .TrimSpace (string (actualContent )))
384
+
385
+ // Also do a HEAD request
386
+ reqHead , err := http .NewRequest (http .MethodHead , fmt .Sprintf ("%s/catalogs/test-catalog/api/v1/metas%s" , testServer .URL , tc .queryParams ), nil )
387
+ require .NoError (t , err )
388
+ if tc .initRequest != nil {
389
+ require .NoError (t , tc .initRequest (reqHead ))
390
+ }
391
+ resp , err = http .DefaultClient .Do (reqHead )
392
+ require .NoError (t , err )
393
+ require .Equal (t , tc .expectedStatusCode , resp .StatusCode )
394
+ actualContent , err = io .ReadAll (resp .Body )
395
+ require .NoError (t , err )
396
+ require .Equal (t , "" , string (actualContent )) // HEAD should not return a body
397
+ resp .Body .Close ()
398
+
399
+ // And make sure any other method is not allowed
400
+ reqPost , err := http .NewRequest (http .MethodPost , fmt .Sprintf ("%s/catalogs/test-catalog/api/v1/metas%s" , testServer .URL , tc .queryParams ), nil )
401
+ require .NoError (t , err )
402
+ resp , err = http .DefaultClient .Do (reqPost )
403
+ require .NoError (t , err )
404
+ require .Equal (t , http .StatusMethodNotAllowed , resp .StatusCode )
405
+ resp .Body .Close ()
406
+
407
+ reqDelete , err := http .NewRequest (http .MethodDelete , fmt .Sprintf ("%s/catalogs/test-catalog/api/v1/metas%s" , testServer .URL , tc .queryParams ), nil )
408
+ require .NoError (t , err )
409
+ resp , err = http .DefaultClient .Do (reqDelete )
410
+ require .NoError (t , err )
411
+ require .Equal (t , http .StatusMethodNotAllowed , resp .StatusCode )
412
+ resp .Body .Close ()
413
+
414
+ reqPut , err := http .NewRequest (http .MethodPut , fmt .Sprintf ("%s/catalogs/test-catalog/api/v1/metas%s" , testServer .URL , tc .queryParams ), nil )
415
+ require .NoError (t , err )
416
+ resp , err = http .DefaultClient .Do (reqPut )
417
+ require .NoError (t , err )
418
+ require .Equal (t , http .StatusMethodNotAllowed , resp .StatusCode )
419
+ resp .Body .Close ()
361
420
})
362
421
}
363
422
}
@@ -366,7 +425,7 @@ func TestServerLoadHandling(t *testing.T) {
366
425
store := & LocalDirV1 {
367
426
RootDir : t .TempDir (),
368
427
RootURL : & url.URL {Path : urlPrefix },
369
- EnableQueryHandler : true ,
428
+ EnableMetasHandler : true ,
370
429
}
371
430
372
431
// Create large test data
@@ -443,20 +502,20 @@ func TestServerLoadHandling(t *testing.T) {
443
502
},
444
503
},
445
504
{
446
- name : "mixed all and query endpoints" ,
505
+ name : "mixed all and metas endpoints" ,
447
506
concurrent : 40 ,
448
507
requests : func (baseURL string ) []* http.Request {
449
508
var reqs []* http.Request
450
509
for i := 0 ; i < 20 ; i ++ {
451
510
allReq , _ := http .NewRequest (http .MethodGet ,
452
511
fmt .Sprintf ("%s/catalogs/test-catalog/api/v1/all" , baseURL ),
453
512
nil )
454
- queryReq , _ := http .NewRequest (http .MethodGet ,
513
+ metasReq , _ := http .NewRequest (http .MethodGet ,
455
514
fmt .Sprintf ("%s/catalogs/test-catalog/api/v1/metas?schema=olm.bundle" , baseURL ),
456
515
nil )
457
516
allReq .Header .Set ("Accept" , "application/jsonl" )
458
- queryReq .Header .Set ("Accept" , "application/jsonl" )
459
- reqs = append (reqs , allReq , queryReq )
517
+ metasReq .Header .Set ("Accept" , "application/jsonl" )
518
+ reqs = append (reqs , allReq , metasReq )
460
519
}
461
520
return reqs
462
521
},
0 commit comments