coder/codersdk/time_test.go

157 lines
2.8 KiB
Go

package codersdk_test
import (
"database/sql"
"encoding/json"
"fmt"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/coder/coder/v2/codersdk"
)
func TestNullTime_MarshalJSON(t *testing.T) {
t.Parallel()
t1, err := time.Parse(time.RFC3339, "2022-08-18T00:00:00Z")
require.NoError(t, err)
bt1, err := json.Marshal(t1)
require.NoError(t, err)
tests := []struct {
name string
input sql.NullTime
want string
}{
{
name: "valid zero",
input: sql.NullTime{Valid: true},
want: `"0001-01-01T00:00:00Z"`,
},
{
name: "invalid zero",
input: sql.NullTime{Valid: false},
want: "null",
},
{
name: "valid time",
input: sql.NullTime{Time: t1, Valid: true},
want: string(bt1),
},
{
name: "null time",
input: sql.NullTime{Time: t1, Valid: false},
want: "null",
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
tr := codersdk.NewNullTime(tt.input.Time, tt.input.Valid)
got, err := tr.MarshalJSON()
require.NoError(t, err)
require.Equal(t, tt.want, string(got))
})
}
}
func TestNullTime_UnmarshalJSON(t *testing.T) {
t.Parallel()
t1, err := time.Parse(time.RFC3339, "2022-08-18T00:00:00Z")
require.NoError(t, err)
bt1, err := json.Marshal(t1)
require.NoError(t, err)
type request struct {
Time codersdk.NullTime `json:"time"`
}
tests := []struct {
name string
data string
want codersdk.NullTime
wantErr bool
}{
{
name: "null",
data: `{"time": null}`,
want: codersdk.NullTime{},
},
{
name: "empty",
data: `{}`,
want: codersdk.NullTime{},
},
{
name: "empty string",
data: `{"time": ""}`,
wantErr: true,
},
{
name: "valid time",
data: fmt.Sprintf(`{"time": %s}`, bt1),
want: codersdk.NewNullTime(t1, true),
},
{
name: "invalid time",
data: fmt.Sprintf(`{"time": %q}`, `2022-08-18T00:00:00`),
wantErr: true,
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
var req request
err := json.Unmarshal([]byte(tt.data), &req)
if tt.wantErr {
require.Error(t, err)
return
}
require.NoError(t, err)
require.Equal(t, tt.want, req.Time)
})
}
}
func TestNullTime_IsZero(t *testing.T) {
t.Parallel()
tests := []struct {
name string
input sql.NullTime
want bool
}{
{
name: "zero",
input: sql.NullTime{},
want: true,
},
{
name: "not zero",
input: sql.NullTime{Time: time.Now(), Valid: true},
want: false,
},
{
name: "null is zero",
input: sql.NullTime{Time: time.Now(), Valid: false},
want: true,
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
tr := codersdk.NullTime{NullTime: tt.input}
require.Equal(t, tt.want, tr.IsZero())
})
}
}