github.com/metacurrency/holochain@v0.1.0-alpha-26.0.20200915073418-5c83169c9b5b/entry_migrate_test.go (about) 1 package holochain 2 3 import ( 4 "testing" 5 . "github.com/smartystreets/goconvey/convey" 6 "fmt" 7 ) 8 9 func TestMigrateConstants(t *testing.T) { 10 Convey("migrate constants should have the right values", t, func() { 11 So(MigrateEntryType, ShouldEqual, "%migrate") 12 So(MigrateEntryTypeClose, ShouldEqual, "close") 13 So(MigrateEntryTypeOpen, ShouldEqual, "open") 14 }) 15 } 16 17 func TestMigrateEntryDef(t *testing.T) { 18 entry := MigrateEntry{} 19 Convey("validate MigrateEntryDef properties", t, func() { 20 So(entry.Def().Name, ShouldEqual, MigrateEntryType) 21 So(entry.Def().DataFormat, ShouldEqual, DataFormatJSON) 22 So(entry.Def().Sharing, ShouldEqual, Public) 23 }) 24 } 25 26 func TestMigrateEntrySysValidation(t *testing.T) { 27 d, _, h := PrepareTestChain("test") 28 defer CleanupTestChain(h, d) 29 30 Convey("validate MigrateEntry against JSON", t, func() { 31 toEntry := func (entry MigrateEntry) (e Entry) { 32 action := ActionMigrate{entry: entry} 33 return action.Entry() 34 } 35 var err error 36 entry := MigrateEntry{} 37 38 err = sysValidateEntry(h, entry.Def(), toEntry(entry), nil) 39 So(err, ShouldNotBeNil) 40 So(err.Error(), ShouldEqual, "Validation Failed: Error (input isn't valid multihash) when decoding DNAHash value ''") 41 42 dnaHash, err := genTestStringHash() 43 key, err := genTestStringHash() 44 So(err, ShouldBeNil) 45 46 migrateType := randomSliceItem([]string{MigrateEntryTypeOpen, MigrateEntryTypeClose}) 47 data, err := genTestString() 48 So(err, ShouldBeNil) 49 50 entry.DNAHash = dnaHash 51 52 err = sysValidateEntry(h, entry.Def(), toEntry(entry), nil) 53 So(err, ShouldNotBeNil) 54 So(err.Error(), ShouldEqual, "Validation Failed: Error (input isn't valid multihash) when decoding Key value ''") 55 56 entry.Key = key 57 err = sysValidateEntry(h, entry.Def(), toEntry(entry), nil) 58 So(err, ShouldNotBeNil) 59 So(err.Error(), ShouldEqual, "Validation Failed: Type value '' must be either 'open' or 'close'") 60 61 entry.Type = migrateType 62 So(sysValidateEntry(h, entry.Def(), toEntry(entry), nil), ShouldBeNil) 63 64 entry.Data = data 65 So(sysValidateEntry(h, entry.Def(), toEntry(entry), nil), ShouldBeNil) 66 67 emptyString := &GobEntry{C: ""} 68 err = sysValidateEntry(h, MigrateEntryDef, emptyString, nil) 69 So(err, ShouldNotBeNil) 70 So(err.Error(), ShouldEqual, "unexpected end of JSON input") 71 72 missingType := &GobEntry{C: "{\"DNAHash\":\"" + dnaHash.String() + "\",\"Key\":\"" + key.String() + "\",\"Data\":\"" + data + "\"}"} 73 err = sysValidateEntry(h, MigrateEntryDef, missingType, nil) 74 So(err, ShouldNotBeNil) 75 So(err.Error(), ShouldEqual, "Validation Failed: validator %migrate failed: object property 'Type' is required") 76 77 missingDNAHash := &GobEntry{C: "{\"Type\":\"" + migrateType + "\",\"Key\":\"" + key.String() + "\",\"Data\":\"" + data + "\"}"} 78 err = sysValidateEntry(h, MigrateEntryDef, missingDNAHash, nil) 79 So(err, ShouldNotBeNil) 80 So(err.Error(), ShouldEqual, "Validation Failed: validator %migrate failed: object property 'DNAHash' is required") 81 82 missingKey := &GobEntry{C: "{\"Type\":\"" + migrateType + "\",\"DNAHash\":\"" + dnaHash.String() + "\",\"Data\":\"" + data + "\"}"} 83 err = sysValidateEntry(h, MigrateEntryDef, missingKey, nil) 84 So(err, ShouldNotBeNil) 85 So(err.Error(), ShouldEqual, "Validation Failed: validator %migrate failed: object property 'Key' is required") 86 87 brokenDNAHash := &GobEntry{C: "{\"Type\":\"" + migrateType + "\",\"DNAHash\":\"not-a-hash\",\"Key\":\"" + key.String() + "\",\"Data\":\"" + data + "\"}"} 88 err = sysValidateEntry(h, MigrateEntryDef, brokenDNAHash, nil) 89 So(err, ShouldNotBeNil) 90 So(err.Error(), ShouldEqual, "Validation Failed: Error (input isn't valid multihash) when decoding DNAHash value 'not-a-hash'") 91 92 brokenKey := &GobEntry{C: "{\"Type\":\"" + migrateType + "\",\"Key\":\"not-a-hash\",\"DNAHash\":\"" + dnaHash.String() + "\",\"Data\":\"" + data + "\"}"} 93 err = sysValidateEntry(h, MigrateEntryDef, brokenKey, nil) 94 So(err, ShouldNotBeNil) 95 So(err.Error(), ShouldEqual, "Validation Failed: Error (input isn't valid multihash) when decoding Key value 'not-a-hash'") 96 }) 97 } 98 99 func TestMigrateEntryFromJSON(t *testing.T) { 100 Convey("MigrateEntry should be unserializable from JSON", t, func() { 101 dnaHash, err := genTestStringHash() 102 So(err, ShouldBeNil) 103 104 key, err := genTestStringHash() 105 So(err, ShouldBeNil) 106 107 data, err := genTestString() 108 So(err, ShouldBeNil) 109 110 migrateType := randomSliceItem([]string{MigrateEntryTypeOpen, MigrateEntryTypeClose}) 111 112 jsonString := "{\"Type\":\"" + migrateType + "\",\"DNAHash\":\"" + dnaHash.String() + "\",\"Key\":\"" + key.String() + "\",\"Data\":\"" + data + "\"}" 113 entry, err := MigrateEntryFromJSON(jsonString) 114 So(err, ShouldBeNil) 115 116 So(err, ShouldBeNil) 117 So(entry.DNAHash, ShouldEqual, dnaHash) 118 So(entry.Key, ShouldEqual, key) 119 So(entry.Data, ShouldEqual, data) 120 So(entry.Type, ShouldEqual, migrateType) 121 }) 122 } 123 124 func TestMigrateEntryToJSON(t *testing.T) { 125 Convey("MigrateEntry should convert to JSON and roundtrip safely", t, func() { 126 var j string 127 var err error 128 entry, err := genTestMigrateEntry() 129 So(err, ShouldBeNil) 130 131 j, err = entry.ToJSON() 132 So(err, ShouldBeNil) 133 134 So(err, ShouldBeNil) 135 So(j, ShouldEqual, fmt.Sprintf(`{"Type":"open","DNAHash":"%s","Key":"%s","Data":"%s"}`, entry.DNAHash, entry.Key, entry.Data)) 136 137 roundtrip, err := MigrateEntryFromJSON(j) 138 So(err, ShouldBeNil) 139 So(roundtrip, ShouldResemble, entry) 140 }) 141 }