Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions deepobject.go
Original file line number Diff line number Diff line change
Expand Up @@ -258,11 +258,10 @@ func assignPathValues(dst interface{}, pathValues fieldOrValue) error {
tm, err = time.Parse(time.RFC3339Nano, pathValues.value)
if err != nil {
// Fall back to parsing it as a date.
_, err = time.Parse(types.DateFormat, pathValues.value) // the time result is never used, so it doesn't need to be assigned
tm, err = time.Parse(types.DateFormat, pathValues.value)
if err != nil {
return fmt.Errorf("error parsing '%s' as RFC3339 or 2006-01-02 time: %w", pathValues.value, err)
}
return fmt.Errorf("invalid date format: %w", err)
}
dst := iv
if it != reflect.TypeOf(time.Time{}) {
Expand Down
36 changes: 36 additions & 0 deletions deepobject_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,42 @@ type Item struct {
Value string `json:"value"`
}

func TestDeepObject_TimeFields(t *testing.T) {
type TimeObject struct {
Created time.Time `json:"created"`
}

t.Run("RFC3339 time parses correctly", func(t *testing.T) {
params := url.Values{}
params.Set("p[created]", "2024-01-15T10:30:00Z")

var dst TimeObject
err := UnmarshalDeepObject(&dst, "p", params)
require.NoError(t, err)
assert.Equal(t, time.Date(2024, 1, 15, 10, 30, 0, 0, time.UTC), dst.Created)
})

t.Run("date-only string parses correctly as time.Time", func(t *testing.T) {
params := url.Values{}
params.Set("p[created]", "2024-01-15")

var dst TimeObject
err := UnmarshalDeepObject(&dst, "p", params)
require.NoError(t, err)
assert.Equal(t, time.Date(2024, 1, 15, 0, 0, 0, 0, time.UTC), dst.Created)
})

t.Run("invalid time string returns error", func(t *testing.T) {
params := url.Values{}
params.Set("p[created]", "not-a-time")

var dst TimeObject
err := UnmarshalDeepObject(&dst, "p", params)
require.Error(t, err)
assert.Contains(t, err.Error(), "error parsing")
})
}

func TestDeepObject_ArrayOfObjects(t *testing.T) {
// Test case for:
// name: items
Expand Down