Bladeren bron

lib/ur: Zero our the value before unmarshal (#6790)

* lib/ur: Zero our the value before unmarshal

* Comment

* Complete rewrite
Audrius Butkevicius 5 jaren geleden
bovenliggende
commit
bb76311ec6
2 gewijzigde bestanden met toevoegingen van 28 en 0 verwijderingen
  1. 4 0
      lib/ur/contract/contract.go
  2. 24 0
      lib/ur/contract/contract_test.go

+ 4 - 0
lib/ur/contract/contract.go

@@ -379,6 +379,10 @@ func (r Report) Value() (driver.Value, error) {
 }
 
 func (r *Report) Scan(value interface{}) error {
+	// Zero out the previous value
+	// JSON un-marshaller does not touch fields that are not in the payload, so we carry over values from a previous
+	// scan.
+	*r = Report{}
 	b, ok := value.([]byte)
 	if !ok {
 		return errors.New("type assertion to []byte failed")

+ 24 - 0
lib/ur/contract/contract_test.go

@@ -128,3 +128,27 @@ func expect(t *testing.T, since int, b interface{}) {
 		t.Errorf("%#v != %#v", x, b)
 	}
 }
+
+func TestMarshallingBehaviour(t *testing.T) {
+	r := Report{}
+
+	if err := r.Scan([]byte(`{"folderUses":{"sendonly": 100}}`)); err != nil {
+		t.Fatal(err)
+	}
+
+	if r.FolderUses.SendOnly != 100 {
+		t.Errorf("%d != 100", r.FolderUses.SendOnly)
+	}
+
+	if err := r.Scan([]byte(`{"folderUses":{"sendreceive": 200}}`)); err != nil {
+		t.Fatal(err)
+	}
+
+	if r.FolderUses.SendReceive != 200 {
+		t.Errorf("%d != 200", r.FolderUses.SendReceive)
+	}
+
+	if r.FolderUses.SendOnly != 0 {
+		t.Errorf("%d != 0", r.FolderUses.SendOnly)
+	}
+}