1package data
2
3import (
4 "encoding/base64"
5 "encoding/json"
6 "io"
7 "os"
8 "testing"
9
10 "github.com/ipfs/go-cid"
11 "github.com/stretchr/testify/assert"
12)
13
14type DataModelFixture struct {
15 JSON json.RawMessage `json:"json"`
16 CBORBase64 string `json:"cbor_base64"`
17 CID string `json:"cid"`
18}
19
20func TestInteropDataModelFixtures(t *testing.T) {
21
22 f, err := os.Open("testdata/data-model-fixtures.json")
23 if err != nil {
24 t.Fatal(err)
25 }
26 defer func() { _ = f.Close() }()
27
28 fixBytes, err := io.ReadAll(f)
29 if err != nil {
30 t.Fatal(err)
31 }
32
33 var fixtures []DataModelFixture
34 if err := json.Unmarshal(fixBytes, &fixtures); err != nil {
35 t.Fatal(err)
36 }
37
38 for _, row := range fixtures {
39 testDataModelFixture(t, row)
40 }
41}
42
43func testDataModelFixture(t *testing.T, row DataModelFixture) {
44 assert := assert.New(t)
45
46 jsonBytes := []byte(row.JSON)
47 cborBytes, err := base64.RawStdEncoding.DecodeString(row.CBORBase64)
48 if err != nil {
49 t.Fatal(err)
50 }
51
52 jsonObj, err := UnmarshalJSON(jsonBytes)
53 assert.NoError(err)
54 cborObj, err := UnmarshalCBOR(cborBytes)
55 assert.NoError(err)
56
57 assert.Equal(jsonObj, cborObj)
58
59 cborFromJSON, err := MarshalCBOR(jsonObj)
60 assert.NoError(err)
61 cborFromCBOR, err := MarshalCBOR(cborObj)
62 assert.NoError(err)
63
64 cborObjAgain, err := UnmarshalCBOR(cborFromJSON)
65 assert.NoError(err)
66 assert.Equal(jsonObj, cborObjAgain)
67
68 assert.Equal(cborBytes, cborFromJSON)
69 assert.Equal(cborBytes, cborFromCBOR)
70
71 // 0x71 = dag-cbor, 0x12 = sha2-256, 0 = default length
72 cidBuilder := cid.V1Builder{Codec: 0x71, MhType: 0x12, MhLength: 0}
73 cidFromJSON, err := cidBuilder.Sum(cborFromJSON)
74 assert.NoError(err)
75 assert.Equal(row.CID, cidFromJSON.String())
76 cidFromCBOR, err := cidBuilder.Sum(cborFromCBOR)
77 assert.NoError(err)
78 assert.Equal(row.CID, cidFromCBOR.String())
79
80}
81
82type DataModelSimpleFixture struct {
83 JSON json.RawMessage `json:"json"`
84}
85
86func TestInteropDataModelValid(t *testing.T) {
87 assert := assert.New(t)
88
89 f, err := os.Open("testdata/data-model-valid.json")
90 if err != nil {
91 t.Fatal(err)
92 }
93 defer func() { _ = f.Close() }()
94
95 fixBytes, err := io.ReadAll(f)
96 if err != nil {
97 t.Fatal(err)
98 }
99
100 var fixtures []DataModelSimpleFixture
101 if err := json.Unmarshal(fixBytes, &fixtures); err != nil {
102 t.Fatal(err)
103 }
104
105 for _, row := range fixtures {
106 _, err := UnmarshalJSON(row.JSON)
107 assert.NoError(err)
108 }
109}
110
111func TestInteropDataModelInvalid(t *testing.T) {
112 assert := assert.New(t)
113
114 f, err := os.Open("testdata/data-model-invalid.json")
115 if err != nil {
116 t.Fatal(err)
117 }
118 defer func() { _ = f.Close() }()
119
120 fixBytes, err := io.ReadAll(f)
121 if err != nil {
122 t.Fatal(err)
123 }
124
125 var fixtures []DataModelSimpleFixture
126 if err := json.Unmarshal(fixBytes, &fixtures); err != nil {
127 t.Fatal(err)
128 }
129
130 for _, row := range fixtures {
131 _, err := UnmarshalJSON(row.JSON)
132 assert.Error(err)
133 }
134}