github.com/readium/readium-lcp-server@v0.0.0-20240509124024-799e77a0bbd6/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  }