package persist import ( "os" "testing" "context" "fmt" "github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go/modules/mongodb" "go.mongodb.org/mongo-driver/v2/bson" "git.gsuntres.com/general/mongo" ) 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) mongo.Start(&mongo.MongoStartProps{ MongoUri: endpoint, MongoUser: user, MongoPass: pass, }) // 3. Run tests code := m.Run() // 4. Teardown: Clean up resources mongo.Stop() _ = testcontainers.TerminateContainer(mongoContainer) os.Exit(code) } func TestSaveUser_Valid(t *testing.T) { p := NewPersist(&PersistProps{ MongoSysDb: "test_boxtep_sys", }) data := &User{ Fullname: "King Long Too", Firstname: "Too", Username: "toolong", Password: "mypass", Email: "too@long.test", } user, err := p.SaveUser(context.TODO(), data) if err != nil { t.Fatalf("Should have saved user %#v", err) } data.Id = user.Id dataMap, _ := mongo.ToMap(data) userMap, _ := mongo.ToMap(user) mongo.AssertSubset(t, dataMap, userMap, "Should have been equal") } func TestSaveUser_RequireUsername(t *testing.T) { p := NewPersist(&PersistProps{ MongoSysDb: "test_boxtep_sys", }) data := &User{ Fullname: "King Long Too", Firstname: "Too", Password: "mypass", Email: "too@long.test", } _, err := p.SaveUser(context.TODO(), data) if err == nil || err.Error() != `properties/Username: value "" too short for "minLength" argument 3` { t.Fatal("Should require username") } } func TestSaveUser_RequirePassword(t *testing.T) { p := NewPersist(&PersistProps{ MongoSysDb: "test_boxtep_sys", }) data := &User{ Fullname: "King Long Too", Firstname: "Too", Username: "toolong", Email: "too@long.test", } _, err := p.SaveUser(context.TODO(), data) if err == nil || err.Error() != `properties/Password: value "" too short for "minLength" argument 1` { t.Fatal("Should require password") } } func TestSaveUser_UsesSysDb(t *testing.T) { db := "test_boxtep_sys" p := NewPersist(&PersistProps{ MongoSysDb: db, }) data := &User{ Fullname: "King Long Too", Firstname: "Too", Username: "toolong", Password: "1", Email: "too@long.test", } _, err := p.SaveUser(context.TODO(), data) if err != nil { t.Fatalf("Should have saved user %#v", err) } // check if user is saved client := mongo.GetMongoClient() collection := client.GetCollection(db, USER_COLLECTION) var found bson.M filter := bson.M{"username": "toolong"} if err := collection.FindOne(context.Background(), filter).Decode(&found); err != nil { t.Fatalf("Should have found user %#v", err) } delete(found, "_id") delete(found, "password") delete(found, "created_at") delete(found, "updated_at") d, _ := mongo.ToMap(data) mongo.AssertSubset(t, found, d, "Should have been equal") } func TestAuthUser_UsingUsername(t *testing.T) { db := "test_boxtep_sys" p := NewPersist(&PersistProps{ MongoSysDb: db, }) data := &User{ Fullname: "King Long Too", Firstname: "Too", Username: "toolong_test1", Password: "1", Email: "too@long.test", } _, err := p.SaveUser(context.TODO(), data) if err != nil { t.Fatalf("Should have saved user %#v", err) } user, err := p.CheckUser(context.TODO(), "toolong_test1", "1") if err != nil { t.Fatalf("Should have checked %#v", err) } d, _ := mongo.ToMap(data) u, _ := mongo.ToMap(user) delete(u, "_id") mongo.AssertSubset(t, u, d, "Wrong user") }