1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
package graphql_test
import (
"bytes"
"encoding/json"
"testing"
"time"
"github.com/graph-gophers/graphql-go"
"github.com/graph-gophers/graphql-go/decode"
)
func TestTime_ImplementsUnmarshaler(t *testing.T) {
defer func() {
if err := recover(); err != nil {
t.Error(err)
}
}()
// assert *Time implements decode.Unmarshaler interface
var _ decode.Unmarshaler = (*graphql.Time)(nil)
}
func TestTime_ImplementsGraphQLType(t *testing.T) {
gt := &graphql.Time{}
if gt.ImplementsGraphQLType("foobar") {
t.Error("Type *Time must not claim to implement GraphQL type 'foobar'")
}
if !gt.ImplementsGraphQLType("Time") {
t.Error("Failed asserting *Time implements GraphQL type Time")
}
}
func TestTime_MarshalJSON(t *testing.T) {
var err error
var b1, b2 []byte
ref := time.Date(2021, time.April, 20, 12, 3, 23, 551476231, time.UTC)
if b1, err = json.Marshal(ref); err != nil {
t.Error(err)
return
}
if b2, err = json.Marshal(graphql.Time{Time: ref}); err != nil {
t.Errorf("MarshalJSON() error = %v", err)
return
}
if !bytes.Equal(b1, b2) {
t.Errorf("MarshalJSON() got = %s, want = %s", b2, b1)
}
}
func TestTime_UnmarshalGraphQL(t *testing.T) {
type args struct {
input interface{}
}
ref := time.Date(2021, time.April, 20, 12, 3, 23, 551476231, time.UTC)
refZeroNano := time.Unix(ref.Unix(), 0)
t.Run("invalid", func(t *testing.T) {
tests := []struct {
name string
args args
wantErr string
}{
{
name: "boolean",
args: args{input: true},
wantErr: "wrong type for Time: bool",
},
{
name: "invalid format",
args: args{input: ref.Format(time.ANSIC)},
wantErr: `parsing time "Tue Apr 20 12:03:23 2021" as "2006-01-02T15:04:05Z07:00": cannot parse "Tue Apr 20 12:03:23 2021" as "2006"`,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gt := &graphql.Time{}
if err := gt.UnmarshalGraphQL(tt.args.input); err != nil {
if err.Error() != tt.wantErr {
t.Errorf("UnmarshalGraphQL() error = %v, want = %s", err, tt.wantErr)
}
return
}
t.Error("UnmarshalGraphQL() expected error not raised")
})
}
})
tests := []struct {
name string
args args
wantEq time.Time
}{
{
name: "time.Time",
args: args{
input: ref,
},
wantEq: ref,
},
{
name: "string",
args: args{
input: ref.Format(time.RFC3339),
},
wantEq: refZeroNano,
},
{
name: "bytes",
args: args{
input: []byte(ref.Format(time.RFC3339)),
},
wantEq: refZeroNano,
},
{
name: "int32",
args: args{
input: int32(ref.Unix()),
},
wantEq: refZeroNano,
},
{
name: "int64",
args: args{
input: ref.Unix(),
},
wantEq: refZeroNano,
},
{
name: "int64-nano",
args: args{
input: ref.UnixNano(),
},
wantEq: ref,
},
{
name: "float64",
args: args{
input: float64(ref.Unix()),
},
wantEq: refZeroNano,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gt := &graphql.Time{}
if err := gt.UnmarshalGraphQL(tt.args.input); err != nil {
t.Errorf("UnmarshalGraphQL() error = %v", err)
return
}
if !gt.Equal(tt.wantEq) {
t.Errorf("UnmarshalGraphQL() got = %v, want = %v", gt, tt.wantEq)
}
})
}
}
|