wip: Telem DB Document API and Tests
This commit is contained in:
parent
7a98f52542
commit
5b38daf74f
56
db.go
56
db.go
|
@ -314,18 +314,58 @@ func (tdb *TelemDb) GetValues(ctx context.Context, filter BusEventFilter,
|
||||||
return data, nil
|
return data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tdb *TelemDb) AddDocument(obj json.RawMessage) error {
|
// AddDocument inserts a new document to the store if it is unique and valid.
|
||||||
return nil
|
func (tdb *TelemDb) AddDocument(ctx context.Context, obj json.RawMessage) error {
|
||||||
|
const insertStmt = `INSERT INTO openmct_objects (data) VALUES (json(?))`
|
||||||
|
_, err := tdb.db.ExecContext(ctx, insertStmt, obj)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tdb *TelemDb) UpdateDocument(key string, obj json.RawMessage) error {
|
// UpdateDocument replaces the entire contents of a document matching
|
||||||
return nil
|
// the given key. Note that the key is derived from the document,
|
||||||
|
// and no checks are done to ensure that the new key is the same.
|
||||||
|
func (tdb *TelemDb) UpdateDocument(ctx context.Context, key string,
|
||||||
|
obj json.RawMessage) error {
|
||||||
|
|
||||||
|
const upd = `UPDATE openmct_objects SET data = json(?) WHERE key IS ?`
|
||||||
|
_, err := tdb.db.ExecContext(ctx, upd, obj, key)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tdb *TelemDb) GetDocument(key string) (json.RawMessage, error) {
|
// GetDocument gets the document matching the corresponding key.
|
||||||
return nil, nil
|
func (tdb *TelemDb) GetDocument(ctx context.Context, key string) (json.RawMessage, error) {
|
||||||
|
const get = `SELECT data FROM openmct_objects WHERE key IS ?`
|
||||||
|
|
||||||
|
row := tdb.db.QueryRowxContext(ctx, get, key)
|
||||||
|
|
||||||
|
var res []byte // VERY important, json.RawMessage won't work here
|
||||||
|
// since the scan function does not look at underlying types.
|
||||||
|
row.Scan(&res)
|
||||||
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tdb *TelemDb) DeleteDocument(key string) error {
|
// GetAllDocuments returns all documents in the database.
|
||||||
return nil
|
func (tdb *TelemDb) GetAllDocuments(ctx context.Context) ([]json.RawMessage, error) {
|
||||||
|
const getall = `SELECT data FROM openmct_objects`;
|
||||||
|
|
||||||
|
rows, err := tdb.db.QueryxContext(ctx, getall)
|
||||||
|
defer rows.Close()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
docs := make([]json.RawMessage, 0)
|
||||||
|
for rows.Next() {
|
||||||
|
var j json.RawMessage
|
||||||
|
rows.Scan(&j)
|
||||||
|
docs = append(docs, j)
|
||||||
|
}
|
||||||
|
return docs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteDocument removes a document from the store, or errors
|
||||||
|
// if it does not exist.
|
||||||
|
func (tdb *TelemDb) DeleteDocument(ctx context.Context, key string) error {
|
||||||
|
const del = `DELETE FROM openmct_objects WHERE key IS ?`
|
||||||
|
_, err := tdb.db.ExecContext(ctx, del, key)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
81
db_test.go
81
db_test.go
|
@ -3,7 +3,10 @@ package gotelem
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math/rand"
|
||||||
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
@ -85,7 +88,6 @@ func MakeMockDatabase(name string) *TelemDb {
|
||||||
|
|
||||||
func TestTelemDb(t *testing.T) {
|
func TestTelemDb(t *testing.T) {
|
||||||
|
|
||||||
|
|
||||||
t.Run("test opening database", func(t *testing.T) {
|
t.Run("test opening database", func(t *testing.T) {
|
||||||
// create our mock
|
// create our mock
|
||||||
tdb := MakeMockDatabase(t.Name())
|
tdb := MakeMockDatabase(t.Name())
|
||||||
|
@ -154,3 +156,80 @@ func TestTelemDb(t *testing.T) {
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func MockDocument(key string) json.RawMessage {
|
||||||
|
var v = make(map[string]interface{})
|
||||||
|
|
||||||
|
v["identifier"] = map[string]string{"key": key}
|
||||||
|
v["randomdata"] = rand.Int()
|
||||||
|
res, err := json.Marshal(v)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestDbDocuments(t *testing.T) {
|
||||||
|
|
||||||
|
t.Run("test inserting a document", func(t *testing.T) {
|
||||||
|
tdb := MakeMockDatabase(t.Name())
|
||||||
|
tdb.db.Ping()
|
||||||
|
ctx := context.Background()
|
||||||
|
err := tdb.AddDocument(ctx, MockDocument("hi"))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("AddDocument expected no error, got err=%v", err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("test inserting duplicate documents", func(t *testing.T) {
|
||||||
|
tdb := MakeMockDatabase(t.Name())
|
||||||
|
tdb.db.Ping()
|
||||||
|
ctx := context.Background()
|
||||||
|
doc := MockDocument("hi")
|
||||||
|
err := tdb.AddDocument(ctx, doc)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("AddDocument expected no error, got err=%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = tdb.AddDocument(ctx, doc)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("AddDocument expected duplicate key error, got nil")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
t.Run("test inserting bad document", func(t *testing.T) {
|
||||||
|
tdb := MakeMockDatabase(t.Name())
|
||||||
|
tdb.db.Ping()
|
||||||
|
ctx := context.Background()
|
||||||
|
var badDoc = map[string]string{"bad":"duh"}
|
||||||
|
msg, err := json.Marshal(badDoc)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
err = tdb.AddDocument(ctx, msg)
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf("AddDocument expected error, got nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("test getting document", func(t *testing.T) {
|
||||||
|
tdb := MakeMockDatabase(t.Name())
|
||||||
|
tdb.db.Ping()
|
||||||
|
ctx := context.Background()
|
||||||
|
doc := MockDocument("hi")
|
||||||
|
err := tdb.AddDocument(ctx, doc)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("AddDocument expected no error, got err=%v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
res, err := tdb.GetDocument(ctx, "hi")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("GetDocument expected no error, got err=%v", err)
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(res, doc) {
|
||||||
|
t.Fatalf("GetDocument did not return identical document")
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue