138 lines
2.8 KiB
Go
138 lines
2.8 KiB
Go
package mongo
|
|
|
|
import (
|
|
"os"
|
|
"time"
|
|
"reflect"
|
|
"testing"
|
|
"context"
|
|
"fmt"
|
|
"encoding/json"
|
|
|
|
"go.mongodb.org/mongo-driver/v2/mongo/options"
|
|
"go.mongodb.org/mongo-driver/v2/bson"
|
|
|
|
"github.com/testcontainers/testcontainers-go"
|
|
"github.com/testcontainers/testcontainers-go/modules/mongodb"
|
|
)
|
|
|
|
type Sample struct {
|
|
Id string `json:"id" bson:"_id,omitempty"`
|
|
Name string `json:"name" bson:"name"`
|
|
Age int32 `json:"age" bson:"age"`
|
|
CreatedAt time.Time `json:"created_at" bson:"created_at"`
|
|
}
|
|
|
|
func TestMain(m *testing.M) {
|
|
if os.Getenv("RUN_INTEGRATION") == "" {
|
|
fmt.Println("Skipping package tests: RUN_INTEGRATION is missing")
|
|
os.Exit(0) // Exit with success, but no tests ran
|
|
}
|
|
|
|
ctx := context.Background()
|
|
|
|
user := "admin"
|
|
pass := "1"
|
|
|
|
// 1. Setup: Start the MongoDB container
|
|
mongoContainer, err := mongodb.Run(ctx, "mongo:8",
|
|
testcontainers.WithEnv(map[string]string{
|
|
"MONGO_INITDB_ROOT_USERNAME": user,
|
|
"MONGO_INITDB_ROOT_PASSWORD": pass,
|
|
}),)
|
|
if err != nil {
|
|
panic("failed to start container")
|
|
}
|
|
|
|
// 2. Get the connection string dynamically
|
|
endpoint, _ := mongoContainer.ConnectionString(ctx)
|
|
|
|
mongoDebug := os.Getenv("DEBUG") != ""
|
|
|
|
Start(&MongoStartProps{
|
|
MongoUri: endpoint,
|
|
MongoUser: user,
|
|
MongoPass: pass,
|
|
MongoDebugQuery: mongoDebug,
|
|
})
|
|
|
|
// 3. Run tests
|
|
LoadTestSample()
|
|
|
|
code := m.Run()
|
|
|
|
// 4. Teardown: Clean up resources
|
|
Stop()
|
|
|
|
_ = testcontainers.TerminateContainer(mongoContainer)
|
|
|
|
os.Exit(code)
|
|
}
|
|
|
|
func TestApplySchema(t *testing.T) {
|
|
// prepare schema sample
|
|
schemaStr := `
|
|
{
|
|
"bsonType": "object",
|
|
"properties": {
|
|
"name": {
|
|
"bsonType": "string"
|
|
},
|
|
"active": {
|
|
"bsonType": "boolean"
|
|
}
|
|
},
|
|
"required": ["name"],
|
|
"additionalProperties": true
|
|
}
|
|
`
|
|
|
|
var result bson.M
|
|
err := json.Unmarshal([]byte(schemaStr), &result)
|
|
if err != nil {
|
|
t.Fatalf("%v", err)
|
|
}
|
|
|
|
cd := &CollectionDefinition{
|
|
Schema: result,
|
|
}
|
|
|
|
opts := options.CreateCollection()
|
|
|
|
ApplySchema(cd, opts)
|
|
|
|
options := &options.CreateCollectionOptions{}
|
|
|
|
for _, o := range opts.List() {
|
|
o(options)
|
|
}
|
|
|
|
expected := bson.M{"$jsonSchema":bson.M{"additionalProperties":true, "bsonType":"object", "properties":bson.D{bson.E{Key:"active", Value:bson.D{bson.E{Key:"bsonType", Value:"boolean"}}}, bson.E{Key:"name", Value:bson.D{bson.E{Key:"bsonType", Value:"string"}}}}, "required":bson.A{"name"}}}
|
|
|
|
aj, _ := json.Marshal(options.Validator)
|
|
ej, _ := json.Marshal(expected)
|
|
|
|
var am, em any
|
|
json.Unmarshal(aj, &am)
|
|
json.Unmarshal(ej, &em)
|
|
|
|
if !reflect.DeepEqual(am, em) {
|
|
t.Fatalf("Validator should have been set")
|
|
}
|
|
}
|
|
|
|
func TestGetCollection_Default(t *testing.T) {
|
|
c := GetMongoClient()
|
|
|
|
col := c.GetCollection("mydb", "mycol")
|
|
|
|
if col == nil {
|
|
t.Fatal("should have return collection")
|
|
}
|
|
|
|
if col.Name() != "mycol" {
|
|
t.Fatal("Wrong name")
|
|
}
|
|
|
|
}
|