github.com/letsencrypt/boulder@v0.20251208.0/sa/type-converter_test.go (about) 1 package sa 2 3 import ( 4 "encoding/json" 5 "testing" 6 "time" 7 8 "github.com/letsencrypt/boulder/core" 9 "github.com/letsencrypt/boulder/identifier" 10 "github.com/letsencrypt/boulder/test" 11 12 "github.com/go-jose/go-jose/v4" 13 ) 14 15 const JWK1JSON = `{ 16 "kty": "RSA", 17 "n": "vuc785P8lBj3fUxyZchF_uZw6WtbxcorqgTyq-qapF5lrO1U82Tp93rpXlmctj6fyFHBVVB5aXnUHJ7LZeVPod7Wnfl8p5OyhlHQHC8BnzdzCqCMKmWZNX5DtETDId0qzU7dPzh0LP0idt5buU7L9QNaabChw3nnaL47iu_1Di5Wp264p2TwACeedv2hfRDjDlJmaQXuS8Rtv9GnRWyC9JBu7XmGvGDziumnJH7Hyzh3VNu-kSPQD3vuAFgMZS6uUzOztCkT0fpOalZI6hqxtWLvXUMj-crXrn-Maavz8qRhpAyp5kcYk3jiHGgQIi7QSK2JIdRJ8APyX9HlmTN5AQ", 18 "e": "AQAB" 19 }` 20 21 func TestAcmeIdentifier(t *testing.T) { 22 tc := BoulderTypeConverter{} 23 24 ai := identifier.ACMEIdentifier{Type: "data1", Value: "data2"} 25 out := identifier.ACMEIdentifier{} 26 27 marshaledI, err := tc.ToDb(ai) 28 test.AssertNotError(t, err, "Could not ToDb") 29 30 scanner, ok := tc.FromDb(&out) 31 test.Assert(t, ok, "FromDb failed") 32 if !ok { 33 t.FailNow() 34 return 35 } 36 37 marshaled := marshaledI.(string) 38 err = scanner.Binder(&marshaled, &out) 39 test.AssertNotError(t, err, "failed to scanner.Binder") 40 test.AssertMarshaledEquals(t, ai, out) 41 } 42 43 func TestAcmeIdentifierBadJSON(t *testing.T) { 44 badJSON := `{` 45 tc := BoulderTypeConverter{} 46 out := identifier.ACMEIdentifier{} 47 scanner, _ := tc.FromDb(&out) 48 err := scanner.Binder(&badJSON, &out) 49 test.AssertError(t, err, "expected error from scanner.Binder") 50 var badJSONErr errBadJSON 51 test.AssertErrorWraps(t, err, &badJSONErr) 52 test.AssertEquals(t, string(badJSONErr.json), badJSON) 53 } 54 55 func TestJSONWebKey(t *testing.T) { 56 tc := BoulderTypeConverter{} 57 58 var jwk, out jose.JSONWebKey 59 err := json.Unmarshal([]byte(JWK1JSON), &jwk) 60 if err != nil { 61 t.Fatal(err) 62 } 63 64 marshaledI, err := tc.ToDb(jwk) 65 test.AssertNotError(t, err, "Could not ToDb") 66 67 scanner, ok := tc.FromDb(&out) 68 test.Assert(t, ok, "FromDb failed") 69 if !ok { 70 t.FailNow() 71 return 72 } 73 74 marshaled := marshaledI.(string) 75 err = scanner.Binder(&marshaled, &out) 76 test.AssertNotError(t, err, "failed to scanner.Binder") 77 test.AssertMarshaledEquals(t, jwk, out) 78 } 79 80 func TestJSONWebKeyBadJSON(t *testing.T) { 81 badJSON := `{` 82 tc := BoulderTypeConverter{} 83 out := jose.JSONWebKey{} 84 scanner, _ := tc.FromDb(&out) 85 err := scanner.Binder(&badJSON, &out) 86 test.AssertError(t, err, "expected error from scanner.Binder") 87 var badJSONErr errBadJSON 88 test.AssertErrorWraps(t, err, &badJSONErr) 89 test.AssertEquals(t, string(badJSONErr.json), badJSON) 90 } 91 92 func TestAcmeStatus(t *testing.T) { 93 tc := BoulderTypeConverter{} 94 95 var as, out core.AcmeStatus 96 as = "core.AcmeStatus" 97 98 marshaledI, err := tc.ToDb(as) 99 test.AssertNotError(t, err, "Could not ToDb") 100 101 scanner, ok := tc.FromDb(&out) 102 test.Assert(t, ok, "FromDb failed") 103 if !ok { 104 t.FailNow() 105 return 106 } 107 108 marshaled := marshaledI.(string) 109 err = scanner.Binder(&marshaled, &out) 110 test.AssertNotError(t, err, "failed to scanner.Binder") 111 test.AssertMarshaledEquals(t, as, out) 112 } 113 114 func TestOCSPStatus(t *testing.T) { 115 tc := BoulderTypeConverter{} 116 117 var os, out core.OCSPStatus 118 os = "core.OCSPStatus" 119 120 marshaledI, err := tc.ToDb(os) 121 test.AssertNotError(t, err, "Could not ToDb") 122 123 scanner, ok := tc.FromDb(&out) 124 test.Assert(t, ok, "FromDb failed") 125 if !ok { 126 t.FailNow() 127 return 128 } 129 130 marshaled := marshaledI.(string) 131 err = scanner.Binder(&marshaled, &out) 132 test.AssertNotError(t, err, "failed to scanner.Binder") 133 test.AssertMarshaledEquals(t, os, out) 134 } 135 136 func TestStringSlice(t *testing.T) { 137 tc := BoulderTypeConverter{} 138 var au, out []string 139 140 marshaledI, err := tc.ToDb(au) 141 test.AssertNotError(t, err, "Could not ToDb") 142 143 scanner, ok := tc.FromDb(&out) 144 test.Assert(t, ok, "FromDb failed") 145 if !ok { 146 t.FailNow() 147 return 148 } 149 150 marshaled := marshaledI.(string) 151 err = scanner.Binder(&marshaled, &out) 152 test.AssertNotError(t, err, "failed to scanner.Binder") 153 test.AssertMarshaledEquals(t, au, out) 154 } 155 156 func TestTimeTruncate(t *testing.T) { 157 tc := BoulderTypeConverter{} 158 preciseTime := time.Date(2024, 06, 20, 00, 00, 00, 999999999, time.UTC) 159 dbTime, err := tc.ToDb(preciseTime) 160 test.AssertNotError(t, err, "Could not ToDb") 161 dbTimeT, ok := dbTime.(time.Time) 162 test.Assert(t, ok, "Could not convert dbTime to time.Time") 163 test.Assert(t, dbTimeT.Nanosecond() == 0, "Nanosecond not truncated") 164 165 dbTimePtr, err := tc.ToDb(&preciseTime) 166 test.AssertNotError(t, err, "Could not ToDb") 167 dbTimePtrT, ok := dbTimePtr.(*time.Time) 168 test.Assert(t, ok, "Could not convert dbTimePtr to *time.Time") 169 test.Assert(t, dbTimePtrT.Nanosecond() == 0, "Nanosecond not truncated") 170 171 var dbTimePtrNil *time.Time 172 shouldBeNil, err := tc.ToDb(dbTimePtrNil) 173 test.AssertNotError(t, err, "Could not ToDb") 174 if shouldBeNil != nil { 175 t.Errorf("Expected nil, got %v", shouldBeNil) 176 } 177 }