package storage import ( "context" "crypto/rand" "encoding/base64" "testing" "time" ) func testMongoNew(t *testing.T) (*Mongo, func()) { b := make([]byte, 5) rand.Read(b) ns := "gotest_" + base64.URLEncoding.EncodeToString(b) m, err := NewMongo(10, ns, "mongodb://localhost:27017") if err != nil { t.Fatal(err) } return m, func() { ctx, can := context.WithTimeout(context.Background(), time.Second*30) defer can() m.client.Database(ns).Drop(ctx) m.Close() } } func TestMongoNew(t *testing.T) { _, can := testMongoNew(t) can() } func TestMongoFind(t *testing.T) { m, can := testMongoNew(t) defer can() c := m.Account() if _, err := c.InsertMany(context.TODO(), []interface{}{ map[string]interface{}{"_id": "1", "a": "b"}, map[string]interface{}{"_id": "2", "a": "b", "c": "d"}, map[string]interface{}{"_id": "3", "c": "d"}, }); err != nil { t.Fatal(err) } cnt := 0 inc := func() interface{} { cnt += 1 var v interface{} return &v } if err := m.Find(c, map[string]interface{}{"a": "b"}, inc); err != nil { t.Fatal(err) } else if cnt != 2 { t.Fatal(cnt) } cnt = 0 if err := m.Find(c, map[string]interface{}{"_id": "1"}, inc); err != nil { t.Fatal(err) } else if cnt != 1 { t.Fatal(cnt) } cnt = 0 if err := m.Find(c, map[string]interface{}{}, inc); err != nil { t.Fatal(err) } else if cnt != 3 { t.Fatal(cnt) } } func TestMongoUpsert(t *testing.T) { m, can := testMongoNew(t) defer can() c := m.Account() if _, err := c.InsertMany(context.TODO(), []interface{}{ map[string]interface{}{"_id": "1", "a": "b"}, map[string]interface{}{"_id": "2", "a": "b", "c": "d"}, map[string]interface{}{"_id": "3", "c": "d"}, }); err != nil { t.Fatal(err) } if n, err := c.EstimatedDocumentCount(context.TODO()); err != nil { t.Fatal(err) } else if n != 3 { t.Fatal(n) } if err := m.Upsert(c, map[string]interface{}{"_id": "1"}, map[string]interface{}{"$set": map[string]interface{}{"c": "d"}}); err != nil { t.Fatal(err) } mapped := map[string]string{} if err := c.FindOne(context.TODO(), map[string]interface{}{"_id": "1"}).Decode(&mapped); err != nil { t.Fatal(err) } else if mapped["c"] != "d" { t.Fatal(mapped) } }