package storage import ( "context" "crypto/rand" "encoding/base64" "testing" ) func testMongoNew(t *testing.T) *Mongo { b := make([]byte, 5) rand.Read(b) m, err := NewMongo(10, base64.URLEncoding.EncodeToString(b), "mongodb://localhost:27017") if err != nil { t.Fatal(err) } return m } func TestMongoNew(t *testing.T) { if err := testMongoNew(t).Close(); err != nil { t.Fatal(err) } } func TestMongoFind(t *testing.T) { m := testMongoNew(t) defer m.Close() c := m.Account() defer c.Drop(context.TODO()) 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 := testMongoNew(t) defer m.Close() c := m.Account() defer c.Drop(context.TODO()) 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) } }