package skate import ( "encoding/json" "fmt" "reflect" "testing" "github.com/nsf/jsondiff" ) // XXX: Work on JSON directly, as structs can get unwieldy. func TestOpenLibraryToRelease(t *testing.T) { var cases = []struct { work OpenLibraryWork release Release err error }{ { work: OpenLibraryWork{}, release: Release{ ExtIDs: struct { Arxiv string `json:"arxiv,omitempty"` Core string `json:"core,omitempty"` DOI string `json:"doi,omitempty"` ISBN []string `json:"isbn,omitempty"` Jstor string `json:"jstor,omitempty"` OLID string `json:"olid,omitempty"` PMCID string `json:"pmcid,omitempty"` PMID string `json:"pmid,omitempty"` WikidataQID string `json:"wikidata_qid,omitempty"` }{}, }, err: nil, }, { work: OpenLibraryWork{ Title: "Hello World", Isbn: []string{ "2844273386", "9782844273383", }, }, release: Release{ ExtIDs: struct { Arxiv string `json:"arxiv,omitempty"` Core string `json:"core,omitempty"` DOI string `json:"doi,omitempty"` ISBN []string `json:"isbn,omitempty"` Jstor string `json:"jstor,omitempty"` OLID string `json:"olid,omitempty"` PMCID string `json:"pmcid,omitempty"` PMID string `json:"pmid,omitempty"` WikidataQID string `json:"wikidata_qid,omitempty"` }{ ISBN: []string{"9782844273383"}, }, Title: "Hello World", }, err: nil, }, { work: OpenLibraryWork{ Key: "/works/OL10000003W", Title: "Hello World", Isbn: []string{ "2844273386", "9782844273383", }, HasFulltext: false, }, release: Release{ ExtIDs: struct { Arxiv string `json:"arxiv,omitempty"` Core string `json:"core,omitempty"` DOI string `json:"doi,omitempty"` ISBN []string `json:"isbn,omitempty"` Jstor string `json:"jstor,omitempty"` OLID string `json:"olid,omitempty"` PMCID string `json:"pmcid,omitempty"` PMID string `json:"pmid,omitempty"` WikidataQID string `json:"wikidata_qid,omitempty"` }{ ISBN: []string{"9782844273383"}, OLID: "OL10000003W", }, Title: "Hello World", Extra: struct { ContainerName string `json:"container_name,omitempty"` SubtitleValue interface{} `json:"subtitle,omitempty"` // []str or str Crossref struct { Type string `json:"type,omitempty"` } `json:"crossref,omitempty"` DataCite struct { MetadataVersion int `json:"metadataVersion,omitempty"` Relations []DataCiteRelation `json:"relations,omitempty"` } `json:"datacite,omitempty"` Skate struct { // Mark as converted (e.g. by setting status to "ref") Status string `json:"status,omitempty"` // Carry the ref index and key around. Ref struct { Index int64 `json:"index,omitempty"` Key string `json:"key,omitempty"` Locator string `json:"locator,omitempty"` } `json:"ref,omitempty"` ResearchGate struct { URL string `json:"url,omitempty"` } `json:"rg,omitempty"` } `json:"skate,omitempty"` OpenLibrary struct { HasFulltext bool `json:"has_fulltext,omitempty"` } `json:"ol,omitempty"` }{ OpenLibrary: struct { HasFulltext bool `json:"has_fulltext,omitempty"` }{ HasFulltext: false, }, }, }, err: nil, }, } for _, c := range cases { r, err := OpenLibraryToRelease(&c.work) if err != nil { t.Fatalf("got %v, want %v", err, c.err) } if !reflect.DeepEqual(r, &c.release) { t.Fatalf(prettyStructDiff(r, &c.release)) } } } func prettyStructDiff(s, t interface{}) string { b, err := json.MarshalIndent(s, "", " ") if err != nil { return fmt.Sprintf("diff failed: %v", err) } c, err := json.MarshalIndent(t, "", " ") if err != nil { return fmt.Sprintf("diff failed: %v", err) } opts := jsondiff.DefaultConsoleOptions() _, d := jsondiff.Compare(b, c, &opts) return d }