porting all github actions from bluesky-social/indigo to tangled CI
at main 2.8 kB view raw
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}