@@ -336,6 +336,107 @@ func TestBindQueryParameter(t *testing.T) {
336336 assert .Equal (t , expected , birthday )
337337 })
338338
339+ // Regression tests for https://github.com/oapi-codegen/runtime/issues/21
340+ // types.Date should bind correctly as a query parameter in all configurations.
341+ t .Run ("date_form_explode_required" , func (t * testing.T ) {
342+ expectedDate := types.Date {Time : time .Date (2023 , 1 , 1 , 0 , 0 , 0 , 0 , time .UTC )}
343+ var date types.Date
344+ queryParams := url.Values {
345+ "date" : {"2023-01-01" },
346+ }
347+ err := BindQueryParameter ("form" , true , true , "date" , queryParams , & date )
348+ assert .NoError (t , err )
349+ assert .Equal (t , expectedDate , date )
350+ })
351+
352+ t .Run ("date_form_explode_optional" , func (t * testing.T ) {
353+ expectedDate := types.Date {Time : time .Date (2023 , 1 , 1 , 0 , 0 , 0 , 0 , time .UTC )}
354+ var date * types.Date
355+ queryParams := url.Values {
356+ "date" : {"2023-01-01" },
357+ }
358+ err := BindQueryParameter ("form" , true , false , "date" , queryParams , & date )
359+ assert .NoError (t , err )
360+ require .NotNil (t , date )
361+ assert .Equal (t , expectedDate , * date )
362+ })
363+
364+ t .Run ("date_form_explode_optional_missing" , func (t * testing.T ) {
365+ var date * types.Date
366+ queryParams := url.Values {}
367+ err := BindQueryParameter ("form" , true , false , "date" , queryParams , & date )
368+ assert .NoError (t , err )
369+ assert .Nil (t , date )
370+ })
371+
372+ t .Run ("date_form_no_explode_required" , func (t * testing.T ) {
373+ expectedDate := types.Date {Time : time .Date (2023 , 1 , 1 , 0 , 0 , 0 , 0 , time .UTC )}
374+ var date types.Date
375+ queryParams := url.Values {
376+ "date" : {"2023-01-01" },
377+ }
378+ err := BindQueryParameter ("form" , false , true , "date" , queryParams , & date )
379+ assert .NoError (t , err )
380+ assert .Equal (t , expectedDate , date )
381+ })
382+
383+ t .Run ("date_form_no_explode_optional" , func (t * testing.T ) {
384+ expectedDate := types.Date {Time : time .Date (2023 , 1 , 1 , 0 , 0 , 0 , 0 , time .UTC )}
385+ var date * types.Date
386+ queryParams := url.Values {
387+ "date" : {"2023-01-01" },
388+ }
389+ err := BindQueryParameter ("form" , false , false , "date" , queryParams , & date )
390+ assert .NoError (t , err )
391+ require .NotNil (t , date )
392+ assert .Equal (t , expectedDate , * date )
393+ })
394+
395+ // time.Time has the same bug as types.Date for form/no-explode.
396+ t .Run ("time_form_no_explode_required" , func (t * testing.T ) {
397+ expectedTime := time .Date (2020 , 12 , 9 , 16 , 9 , 53 , 0 , time .UTC )
398+ var ts time.Time
399+ queryParams := url.Values {
400+ "ts" : {"2020-12-09T16:09:53Z" },
401+ }
402+ err := BindQueryParameter ("form" , false , true , "ts" , queryParams , & ts )
403+ assert .NoError (t , err )
404+ assert .Equal (t , expectedTime , ts )
405+ })
406+
407+ t .Run ("date_in_struct_form_explode" , func (t * testing.T ) {
408+ type Params struct {
409+ Name string `json:"name"`
410+ StartDate types.Date `json:"start_date"`
411+ }
412+ queryParams := url.Values {
413+ "name" : {"test" },
414+ "start_date" : {"2023-06-15" },
415+ }
416+ var params Params
417+ err := BindQueryParameter ("form" , true , true , "params" , queryParams , & params )
418+ assert .NoError (t , err )
419+ assert .Equal (t , "test" , params .Name )
420+ assert .Equal (t , types.Date {Time : time .Date (2023 , 6 , 15 , 0 , 0 , 0 , 0 , time .UTC )}, params .StartDate )
421+ })
422+
423+ t .Run ("date_pointer_in_struct_form_explode" , func (t * testing.T ) {
424+ type Params struct {
425+ Name string `json:"name"`
426+ StartDate * types.Date `json:"start_date"`
427+ }
428+ queryParams := url.Values {
429+ "name" : {"test" },
430+ "start_date" : {"2023-06-15" },
431+ }
432+ var params Params
433+ err := BindQueryParameter ("form" , true , true , "params" , queryParams , & params )
434+ assert .NoError (t , err )
435+ assert .Equal (t , "test" , params .Name )
436+ require .NotNil (t , params .StartDate )
437+ assert .Equal (t , types.Date {Time : time .Date (2023 , 6 , 15 , 0 , 0 , 0 , 0 , time .UTC )}, * params .StartDate )
438+ })
439+
339440 t .Run ("optional" , func (t * testing.T ) {
340441 queryParams := url.Values {
341442 "time" : {"2020-12-09T16:09:53+00:00" },
0 commit comments