github.com/readium/readium-lcp-server@v0.0.0-20240101192032-6e95190e99f1/rwpm/metadata_test.go (about) 1 package rwpm 2 3 import ( 4 "encoding/json" 5 "testing" 6 "time" 7 ) 8 9 type multiStringStruct struct { 10 Ms MultiString `json:"ms"` 11 } 12 13 func TestMultiString(t *testing.T) { 14 var obj multiStringStruct 15 16 const single = `{"ms":"single"}` 17 if err := json.Unmarshal([]byte(single), &obj); err != nil { 18 t.Fatal(err) 19 } else { 20 if len(obj.Ms) == 0 || obj.Ms[0] != "single" { 21 t.Errorf("Expected one value named single, got %#v", obj.Ms) 22 } 23 } 24 // check MarshalJSON 25 jstring, err := json.Marshal(obj) 26 if err != nil { 27 t.Fatal(err) 28 } 29 if string(jstring) != single { 30 t.Errorf("Expected string equality, got %#v", string(jstring)) 31 } 32 33 } 34 35 type multiLanguageStruct struct { 36 Ml MultiLanguage `json:"ml"` 37 } 38 39 func TestMultiLanguage(t *testing.T) { 40 var obj multiLanguageStruct 41 42 // case = the property has a literal value 43 const single = `{"ml":"literal"}` 44 if err := json.Unmarshal([]byte(single), &obj); err != nil { 45 t.Fatal(err) 46 } else { 47 if obj.Ml.Text() != "literal" || obj.Ml["und"] != "literal" { 48 t.Errorf("Expected one value named 'literal', got %#v", obj.Ml) 49 } 50 } 51 jstring, err := json.Marshal(obj) 52 if err != nil { 53 t.Fatal(err) 54 } 55 if string(jstring) != single { 56 t.Errorf("Expected string equality, got %#v", string(jstring)) 57 } 58 59 // case= the property has a single localized value 60 const mapped = `{"ml":{"fr":"nom"}}` 61 if err := json.Unmarshal([]byte(mapped), &obj); err != nil { 62 t.Fatal(err) 63 } else { 64 if obj.Ml["fr"] != "nom" { 65 t.Errorf("Expected one value named 'nom', got %#v", obj.Ml["fr"]) 66 } 67 if obj.Ml["und"] != "" { 68 t.Errorf("Expected no 'und' value, got %#v", obj.Ml["und"]) 69 } 70 } 71 jstring, err = json.Marshal(obj) 72 if err != nil { 73 t.Fatal(err) 74 } 75 if string(jstring) != mapped { 76 t.Errorf("Expected string equality, got %#v", string(jstring)) 77 } 78 79 // case= the property has multiple localized values 80 const multiple = `{"ml":{"en":"name","fr":"nom"}}` 81 if err := json.Unmarshal([]byte(multiple), &obj); err != nil { 82 t.Fatal(err) 83 } else { 84 if obj.Ml["en"] != "name" { 85 t.Errorf("Expected one value named 'name', got %#v", obj.Ml["en"]) 86 } 87 } 88 jstring, err = json.Marshal(obj) 89 if err != nil { 90 t.Fatal(err) 91 } 92 if string(jstring) != multiple { 93 t.Errorf("Expected string equality, got %#v", string(jstring)) 94 } 95 96 } 97 98 type DateOrDatetimeStruct struct { 99 Dt DateOrDatetime `json:"dt"` 100 } 101 102 func TestDateOrDatetime(t *testing.T) { 103 var obj DateOrDatetimeStruct 104 105 // case = the property is a date 106 const date = `{"dt":"2020-04-01"}` 107 if err := json.Unmarshal([]byte(date), &obj); err != nil { 108 t.Fatal(err) 109 } else { 110 tm := time.Time(obj.Dt) 111 if tm.Format(time.RFC3339) != "2020-04-01T00:00:00Z" { 112 t.Errorf("Expected '2020-04-01T00:00:00Z', got %#v", tm.Format(time.RFC3339)) 113 } 114 } 115 jstring, err := json.Marshal(obj) 116 if err != nil { 117 t.Fatal(err) 118 } 119 if string(jstring) != `{"dt":"2020-04-01T00:00:00Z"}` { 120 t.Errorf("Expected string equality, got %#v", string(jstring)) 121 } 122 123 // case = the property is a date-time 124 const datetime = `{"dt":"2020-04-01T01:02:03+02:00"}` 125 if err := json.Unmarshal([]byte(datetime), &obj); err != nil { 126 t.Fatal(err) 127 } else { 128 tm := time.Time(obj.Dt) 129 if tm.Format(time.RFC3339) != "2020-04-01T01:02:03+02:00" { 130 t.Errorf("Expected '2020-04-01T01:02:03+02:00', got %#v", tm.Format(time.RFC3339)) 131 } 132 } 133 jstring, err = json.Marshal(obj) 134 if err != nil { 135 t.Fatal(err) 136 } 137 if string(jstring) != `{"dt":"2020-04-01T01:02:03+02:00"}` { 138 t.Errorf("Expected string equality, got %#v", string(jstring)) 139 } 140 } 141 142 type DateStruct struct { 143 Dt Date `json:"dt"` 144 } 145 146 func TestDate(t *testing.T) { 147 148 var obj DateStruct 149 150 const date = `{"dt":"2020-04-01"}` 151 if err := json.Unmarshal([]byte(date), &obj); err != nil { 152 t.Fatal(err) 153 } else { 154 tm := time.Time(obj.Dt) 155 if tm.Format(time.RFC3339) != "2020-04-01T00:00:00Z" { 156 t.Errorf("Expected '2020-04-01T00:00:00Z', got %#v", tm.Format(time.RFC3339)) 157 } 158 } 159 jstring, err := json.Marshal(obj) 160 if err != nil { 161 t.Fatal(err) 162 } 163 if string(jstring) != `{"dt":"2020-04-01"}` { 164 t.Errorf("Expected string equality, got %#v", string(jstring)) 165 } 166 167 } 168 169 type contributorsStruct struct { 170 Ctor Contributors `json:"ctor"` 171 } 172 173 func TestContributors(t *testing.T) { 174 var obj contributorsStruct 175 176 // check that we correctly implement UnmarshalJSON 177 //var _ json.Unmarshaler = (*Contributors)(nil) 178 179 const singleText = `{"ctor":"single"}` 180 if err := json.Unmarshal([]byte(singleText), &obj); err != nil { 181 t.Fatal(err) 182 } else { 183 if len(obj.Ctor) != 1 || obj.Ctor.Name() != "single" { 184 t.Errorf("Expected one contributor named single, got %#v", obj.Ctor.Name()) 185 } 186 } 187 // check MarshalJSON 188 jstring, err := json.Marshal(obj) 189 if err != nil { 190 t.Fatal(err) 191 } 192 if string(jstring) != singleText { 193 t.Errorf("Expected string equality, got %#v", string(jstring)) 194 } 195 196 const arrayOfText = `{"ctor":["single","double"]}` 197 if err := json.Unmarshal([]byte(arrayOfText), &obj); err != nil { 198 t.Fatal(err) 199 } else { 200 if len(obj.Ctor) != 2 || obj.Ctor[0].Name.Text() != "single" { 201 t.Errorf("Expected 2 contributors named single, got %#v", obj.Ctor) 202 } 203 } 204 // check MarshalJSON 205 jstring, err = json.Marshal(obj) 206 if err != nil { 207 t.Fatal(err) 208 } 209 if string(jstring) != arrayOfText { 210 t.Errorf("Expected string equality, got %#v", string(jstring)) 211 } 212 213 const singleObject = `{"ctor":{"name":"William Shakespeare","role":"author"}}` 214 if err := json.Unmarshal([]byte(singleObject), &obj); err != nil { 215 t.Fatal(err) 216 } else { 217 if len(obj.Ctor) != 1 || obj.Ctor[0].Name.Text() != "William Shakespeare" || obj.Ctor[0].Role != "author" { 218 t.Errorf("Expected 1 contributor (author) named William Shakespeare, got %#v", obj.Ctor[0].Name.Text()) 219 } 220 } 221 // check MarshalJSON 222 jstring, err = json.Marshal(obj) 223 if err != nil { 224 t.Fatal(err) 225 } 226 if string(jstring) != singleObject { 227 t.Errorf("Expected string equality, got %#v", string(jstring)) 228 } 229 230 const multilingualObject = `{"ctor":{"name":{"en":"Mikhail Bulgakov","fr":"Mikhaïl Boulgakov","ru":"Михаил Афанасьевич Булгаков"}}}` 231 if err := json.Unmarshal([]byte(multilingualObject), &obj); err != nil { 232 t.Fatal(err) 233 } else { 234 if len(obj.Ctor) != 1 || obj.Ctor[0].Name["fr"] != "Mikhaïl Boulgakov" { 235 t.Errorf("Expected 1 contributor (author) with a French named of Mikhaïl Boulgakov, got %#v", obj.Ctor) 236 } 237 } 238 // check MarshalJSON 239 jstring, err = json.Marshal(obj) 240 if err != nil { 241 t.Fatal(err) 242 } 243 // string equality is respected because localized names propertly ordered in the sample 244 if string(jstring) != multilingualObject { 245 t.Errorf("Expected string equality, got %#v", string(jstring)) 246 } 247 248 const arrayOfObjects = `{"ctor":[{"name":"William Shakespeare","role":"author"},{"name":"Virginia Wolfe","identifier":"12345"},"Jean-Jacques Rousseau"]}` 249 if err := json.Unmarshal([]byte(arrayOfObjects), &obj); err != nil { 250 t.Fatal(err) 251 } else { 252 if len(obj.Ctor) != 3 || obj.Ctor[0].Name.Text() != "William Shakespeare" || obj.Ctor[0].Role != "author" { 253 t.Errorf("Expected 3 contributors, got %#v", obj.Ctor) 254 } 255 } 256 // check MarshalJSON 257 jstring, err = json.Marshal(obj) 258 if err != nil { 259 t.Fatal(err) 260 } 261 if string(jstring) != arrayOfObjects { 262 t.Errorf("Expected string equality, got %#v", string(jstring)) 263 } 264 265 } 266 267 type subjectStruct struct { 268 Sbj Subjects `json:"dcterms:subject"` 269 } 270 271 func TestW3CSubjects(t *testing.T) { 272 var obj subjectStruct 273 274 // literal value 275 const singleText = `{"dcterms:subject":"single"}` 276 if err := json.Unmarshal([]byte(singleText), &obj); err != nil { 277 t.Fatal(err) 278 } else { 279 if len(obj.Sbj) != 1 || obj.Sbj[0].Name != "single" { 280 t.Errorf("Expected one subject named single, got %#v", obj.Sbj) 281 } 282 } 283 // check MarshalJSON 284 jstring, err := json.Marshal(obj) 285 if err != nil { 286 t.Fatal(err) 287 } 288 if string(jstring) != singleText { 289 t.Errorf("Expected string equality, got %#v", string(jstring)) 290 } 291 292 // array of literal values 293 const arrayOfText = `{"dcterms:subject":["single","double"]}` 294 if err := json.Unmarshal([]byte(arrayOfText), &obj); err != nil { 295 t.Fatal(err) 296 } else { 297 if len(obj.Sbj) != 2 || obj.Sbj[0].Name != "single" || obj.Sbj[1].Name != "double" { 298 t.Errorf("Expected 2 subjects named single and double, got %#v", obj.Sbj) 299 } 300 } 301 // check MarshalJSON 302 jstring, err = json.Marshal(obj) 303 if err != nil { 304 t.Fatal(err) 305 } 306 if string(jstring) != arrayOfText { 307 t.Errorf("Expected string equality, got %#v", string(jstring)) 308 } 309 310 // struct value 311 const singleObject = `{"dcterms:subject":{"name":"music","scheme":"art","code":"01"}}` 312 if err := json.Unmarshal([]byte(singleObject), &obj); err != nil { 313 t.Fatal(err) 314 } else { 315 if len(obj.Sbj) != 1 || obj.Sbj[0].Name != "music" || obj.Sbj[0].Scheme != "art" || obj.Sbj[0].Code != "01" || obj.Sbj[0].SortAs != "" { 316 t.Errorf("Expected 1 subject named music, got %#v", obj.Sbj) 317 } 318 } 319 // check MarshalJSON 320 jstring, err = json.Marshal(obj) 321 if err != nil { 322 t.Fatal(err) 323 } 324 if string(jstring) != singleObject { 325 t.Errorf("Expected string equality, got %#v", string(jstring)) 326 } 327 328 }