196 lines
4.1 KiB
Go
196 lines
4.1 KiB
Go
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",
|
|
}
|
|
SetRelaxed()
|
|
user, err := p.SaveUser(context.TODO(), data)
|
|
SetStrict()
|
|
|
|
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, "createdAt")
|
|
delete(found, "updatedAt")
|
|
|
|
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")
|
|
}
|