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  }