Skip to content

Commit 64c2cba

Browse files
committed
Force valid dates
1 parent dd481f5 commit 64c2cba

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

coderd/httpapi/queryparams.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,15 @@ func (p *QueryParamParser) UUIDs(vals url.Values, def []uuid.UUID, queryParam st
8989
}
9090

9191
func (p *QueryParamParser) Time(vals url.Values, def time.Time, queryParam string, format string) time.Time {
92-
v, _ := parseQueryParam(p, vals, func(v string) (time.Time, error) {
92+
v, err := parseQueryParam(p, vals, func(v string) (time.Time, error) {
9393
return time.Parse(queryParam, format)
9494
}, def, queryParam)
95+
if err != nil {
96+
p.Errors = append(p.Errors, codersdk.ValidationError{
97+
Field: queryParam,
98+
Detail: fmt.Sprintf("Query param %q must be a valid date format (%s)", format, queryParam),
99+
})
100+
}
95101
return v
96102
}
97103

coderd/searchquery/search_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,57 @@ func TestSearchWorkspace(t *testing.T) {
164164
})
165165
}
166166

167+
func TestSearchAudit(t *testing.T) {
168+
t.Parallel()
169+
testCases := []struct {
170+
Name string
171+
Query string
172+
Expected database.GetAuditLogsOffsetParams
173+
ExpectedErrorContains string
174+
}{
175+
{
176+
Name: "Empty",
177+
Query: "",
178+
Expected: database.GetAuditLogsOffsetParams{},
179+
},
180+
// Failures
181+
{
182+
Name: "ExtraColon",
183+
Query: `search:name:extra`,
184+
ExpectedErrorContains: "can only contain 1 ':'",
185+
},
186+
{
187+
Name: "ExtraKeys",
188+
Query: `foo:bar`,
189+
ExpectedErrorContains: `Query param "foo" is not a valid query param`,
190+
},
191+
{
192+
Name: "Dates",
193+
Query: "date_from:2006",
194+
ExpectedErrorContains: "valid date format",
195+
},
196+
}
197+
198+
for _, c := range testCases {
199+
c := c
200+
t.Run(c.Name, func(t *testing.T) {
201+
t.Parallel()
202+
values, errs := searchquery.Audit(c.Query)
203+
if c.ExpectedErrorContains != "" {
204+
require.True(t, len(errs) > 0, "expect some errors")
205+
var s strings.Builder
206+
for _, err := range errs {
207+
_, _ = s.WriteString(fmt.Sprintf("%s: %s\n", err.Field, err.Detail))
208+
}
209+
require.Contains(t, s.String(), c.ExpectedErrorContains)
210+
} else {
211+
require.Len(t, errs, 0, "expected no error")
212+
require.Equal(t, c.Expected, values, "expected values")
213+
}
214+
})
215+
}
216+
}
217+
167218
func TestSearchUsers(t *testing.T) {
168219
t.Parallel()
169220
testCases := []struct {

0 commit comments

Comments
 (0)