diff --git a/indexedDb/channels/implementation.go b/indexedDb/channels/implementation.go index 721021de5aa3d2100d33e089d1f31d90e72575c2..f867e4b2f4ff590cc206562a5bdff87d40fbe03a 100644 --- a/indexedDb/channels/implementation.go +++ b/indexedDb/channels/implementation.go @@ -288,6 +288,8 @@ func (w *wasmModel) UpdateSentStatus(uuid uint64, // Use the key to get the existing Message currentMsg, err := indexedDb.Get(w.db, messageStoreName, key) if err != nil { + jww.ERROR.Printf("%+v", errors.WithMessagef(parentErr, + "Unable to get message: %+v", err)) return } @@ -295,8 +297,11 @@ func (w *wasmModel) UpdateSentStatus(uuid uint64, newMessage := &Message{} err = json.Unmarshal([]byte(utils.JsToJson(currentMsg)), newMessage) if err != nil { + jww.ERROR.Printf("%+v", errors.WithMessagef(parentErr, + "Could not JSON unmarshal message: %+v", err)) return } + newMessage.Status = uint8(status) if !messageID.Equals(cryptoChannel.MessageID{}) { newMessage.MessageID = messageID.Bytes() diff --git a/indexedDb/utils.go b/indexedDb/utils.go index e11c8e10a75e8187f55d4a2e13c7a9a4c765db5e..dc5186632c4d6bdcd8c99c0c17ae2e39338a9253 100644 --- a/indexedDb/utils.go +++ b/indexedDb/utils.go @@ -61,6 +61,9 @@ func Get(db *idb.Database, objectStoreName string, key js.Value) (js.Value, erro if err != nil { return js.Undefined(), errors.WithMessagef(parentErr, "Unable to get from ObjectStore: %+v", err) + } else if resultObj.IsUndefined() { + return js.Undefined(), errors.WithMessage(parentErr, + "Unable to get from ObjectStore: result is undefined") } // Process result into string diff --git a/indexedDb/utils_test.go b/indexedDb/utils_test.go new file mode 100644 index 0000000000000000000000000000000000000000..d5ca7ae6f83ee646c633b4f617913091038b9766 --- /dev/null +++ b/indexedDb/utils_test.go @@ -0,0 +1,59 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2022 xx foundation // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file. // +//////////////////////////////////////////////////////////////////////////////// + +package indexedDb + +import ( + "github.com/hack-pad/go-indexeddb/idb" + "strings" + "syscall/js" + "testing" +) + +// Error path: Tests that Get returns an error when trying to get a message that +// does not exist. +func TestGet_NoMessageError(t *testing.T) { + db := newTestDB("messages", t) + + _, err := Get(db, "messages", js.ValueOf(5)) + if err == nil || !strings.Contains(err.Error(), "undefined") { + t.Errorf("Did not get expected error when getting a message that "+ + "does not exist: %+v", err) + } +} + +// newTestDB creates a new idb.Database for testing. +func newTestDB(messageStoreName string, t *testing.T) *idb.Database { + // Attempt to open database object + ctx, cancel := NewContext() + defer cancel() + openRequest, err := idb.Global().Open(ctx, "databaseName", 0, + func(db *idb.Database, _ uint, _ uint) error { + storeOpts := idb.ObjectStoreOptions{ + KeyPath: js.ValueOf("id"), + AutoIncrement: true, + } + + // Build Message ObjectStore and Indexes + _, err := db.CreateObjectStore(messageStoreName, storeOpts) + if err != nil { + return err + } + return nil + }) + if err != nil { + t.Fatal(err) + } + + // Wait for database open to finish + db, err := openRequest.Await(ctx) + if err != nil { + t.Fatal(err) + } + + return db +}