k8s.io/kube-openapi@v0.0.0-20240228011516-70dd3763d340/pkg/validation/strfmt/time_test.go (about) 1 // Copyright 2015 go-swagger maintainers 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package strfmt 16 17 import ( 18 "bytes" 19 "testing" 20 "time" 21 22 "github.com/stretchr/testify/assert" 23 ) 24 25 var ( 26 p, _ = time.Parse(time.RFC3339Nano, "2011-08-18T19:03:37.000000000+01:00") 27 28 testCases = []struct { 29 in []byte // externally sourced data -- to be unmarshalled 30 time time.Time // its representation in time.Time 31 str string // its marshalled representation 32 }{ 33 {[]byte("2014-12-15T08:00:00"), time.Date(2014, 12, 15, 8, 0, 0, 0, time.UTC), "2014-12-15T08:00:00.000Z"}, 34 {[]byte("2014-12-15T08:00:00.000Z"), time.Date(2014, 12, 15, 8, 0, 0, 0, time.UTC), "2014-12-15T08:00:00.000Z"}, 35 {[]byte("2011-08-18T19:03:37.000000000+01:00"), time.Date(2011, 8, 18, 19, 3, 37, 0, p.Location()), "2011-08-18T19:03:37.000+01:00"}, 36 {[]byte("2014-12-15T19:30:20Z"), time.Date(2014, 12, 15, 19, 30, 20, 0, time.UTC), "2014-12-15T19:30:20.000Z"}, 37 {[]byte("0001-01-01T00:00:00Z"), time.Time{}.UTC(), "0001-01-01T00:00:00.000Z"}, 38 {[]byte(""), time.Unix(0, 0).UTC(), "1970-01-01T00:00:00.000Z"}, 39 {[]byte(nil), time.Unix(0, 0).UTC(), "1970-01-01T00:00:00.000Z"}, 40 } 41 ) 42 43 func TestNewDateTime(t *testing.T) { 44 assert.EqualValues(t, time.Unix(0, 0).UTC(), NewDateTime()) 45 } 46 47 func TestParseDateTime_errorCases(t *testing.T) { 48 _, err := ParseDateTime("yada") 49 assert.Error(t, err) 50 } 51 52 // TestParseDateTime tests the full cycle: 53 // parsing -> marshalling -> unmarshalling / scanning 54 func TestParseDateTime_fullCycle(t *testing.T) { 55 for caseNum, example := range testCases { 56 t.Logf("Case #%d", caseNum) 57 58 parsed, err := ParseDateTime(example.str) 59 assert.NoError(t, err) 60 assert.EqualValues(t, example.time, parsed) 61 62 mt, err := parsed.MarshalText() 63 assert.NoError(t, err) 64 assert.Equal(t, []byte(example.str), mt) 65 66 if example.str != "" { 67 v := IsDateTime(example.str) 68 assert.True(t, v) 69 } else { 70 t.Logf("IsDateTime() skipped for empty testcases") 71 } 72 73 pp := NewDateTime() 74 err = pp.UnmarshalText(mt) 75 assert.NoError(t, err) 76 assert.EqualValues(t, example.time, pp) 77 78 pp = NewDateTime() 79 err = pp.Scan(mt) 80 assert.NoError(t, err) 81 assert.Equal(t, DateTime(example.time), pp) 82 } 83 } 84 85 func TestDateTime_IsDateTime_errorCases(t *testing.T) { 86 v := IsDateTime("zor") 87 assert.False(t, v) 88 89 v = IsDateTime("zorg") 90 assert.False(t, v) 91 92 v = IsDateTime("zorgTx") 93 assert.False(t, v) 94 95 v = IsDateTime("1972-12-31Tx") 96 assert.False(t, v) 97 98 v = IsDateTime("1972-12-31T24:40:00.000Z") 99 assert.False(t, v) 100 101 v = IsDateTime("1972-12-31T23:63:00.000Z") 102 assert.False(t, v) 103 104 v = IsDateTime("1972-12-31T23:59:60.000Z") 105 assert.False(t, v) 106 107 } 108 func TestDateTime_UnmarshalText_errorCases(t *testing.T) { 109 pp := NewDateTime() 110 err := pp.UnmarshalText([]byte("yada")) 111 assert.Error(t, err) 112 err = pp.UnmarshalJSON([]byte("yada")) 113 assert.Error(t, err) 114 } 115 116 func TestDateTime_UnmarshalText(t *testing.T) { 117 for caseNum, example := range testCases { 118 t.Logf("Case #%d", caseNum) 119 pp := NewDateTime() 120 err := pp.UnmarshalText(example.in) 121 assert.NoError(t, err) 122 assert.EqualValues(t, example.time, pp) 123 } 124 } 125 func TestDateTime_UnmarshalJSON(t *testing.T) { 126 for caseNum, example := range testCases { 127 t.Logf("Case #%d", caseNum) 128 pp := NewDateTime() 129 err := pp.UnmarshalJSON(esc(example.in)) 130 assert.NoError(t, err) 131 assert.EqualValues(t, example.time, pp) 132 } 133 134 // Check UnmarshalJSON failure with no lexed items 135 pp := NewDateTime() 136 err := pp.UnmarshalJSON([]byte("zorg emperor")) 137 assert.Error(t, err) 138 139 // Check lexer failure 140 err = pp.UnmarshalJSON([]byte(`"zorg emperor"`)) 141 assert.Error(t, err) 142 143 // Check null case 144 err = pp.UnmarshalJSON([]byte("null")) 145 assert.Nil(t, err) 146 } 147 148 func esc(v []byte) []byte { 149 var buf bytes.Buffer 150 buf.WriteByte('"') 151 buf.Write(v) 152 buf.WriteByte('"') 153 return buf.Bytes() 154 } 155 156 func TestDateTime_MarshalText(t *testing.T) { 157 for caseNum, example := range testCases { 158 t.Logf("Case #%d", caseNum) 159 dt := DateTime(example.time) 160 mt, err := dt.MarshalText() 161 assert.NoError(t, err) 162 assert.Equal(t, []byte(example.str), mt) 163 } 164 } 165 func TestDateTime_MarshalJSON(t *testing.T) { 166 for caseNum, example := range testCases { 167 t.Logf("Case #%d", caseNum) 168 dt := DateTime(example.time) 169 bb, err := dt.MarshalJSON() 170 assert.NoError(t, err) 171 assert.EqualValues(t, esc([]byte(example.str)), bb) 172 } 173 } 174 175 func TestDateTime_Scan(t *testing.T) { 176 for caseNum, example := range testCases { 177 t.Logf("Case #%d", caseNum) 178 179 pp := NewDateTime() 180 err := pp.Scan(example.in) 181 assert.NoError(t, err) 182 assert.Equal(t, DateTime(example.time), pp) 183 184 pp = NewDateTime() 185 err = pp.Scan(string(example.in)) 186 assert.NoError(t, err) 187 assert.Equal(t, DateTime(example.time), pp) 188 189 pp = NewDateTime() 190 err = pp.Scan(example.time) 191 assert.NoError(t, err) 192 assert.Equal(t, DateTime(example.time), pp) 193 } 194 } 195 196 func TestDateTime_Scan_Failed(t *testing.T) { 197 pp := NewDateTime() 198 zero := NewDateTime() 199 200 err := pp.Scan(nil) 201 assert.NoError(t, err) 202 // Zero values differ... 203 //assert.Equal(t, zero, pp) 204 assert.Equal(t, DateTime{}, pp) 205 206 err = pp.Scan("") 207 assert.NoError(t, err) 208 assert.Equal(t, zero, pp) 209 210 err = pp.Scan(int64(0)) 211 assert.Error(t, err) 212 213 err = pp.Scan(float64(0)) 214 assert.Error(t, err) 215 } 216 217 func TestDeepCopyDateTime(t *testing.T) { 218 p, err := ParseDateTime("2011-08-18T19:03:37.000000000+01:00") 219 assert.NoError(t, err) 220 in := &p 221 222 out := new(DateTime) 223 in.DeepCopyInto(out) 224 assert.Equal(t, in, out) 225 226 out2 := in.DeepCopy() 227 assert.Equal(t, in, out2) 228 229 var inNil *DateTime 230 out3 := inNil.DeepCopy() 231 assert.Nil(t, out3) 232 }