package testutil import ( "context" "os" "path/filepath" "testing" "entgo.io/ent/dialect" "github.com/mattn/go-sqlite3" "github.com/stretchr/testify/require" "tss-rocks-be/ent" ) // SetupTestDB creates a new test database and returns a client func SetupTestDB(t *testing.T) *ent.Client { // Create a temporary SQLite database for testing dir := t.TempDir() dbPath := filepath.Join(dir, "test.db") client, err := ent.Open(dialect.SQLite, "file:"+dbPath+"?mode=memory&cache=shared&_fk=1") require.NoError(t, err) // Run the auto migration tool err = client.Schema.Create(context.Background()) require.NoError(t, err) // Clean up the database after the test t.Cleanup(func() { client.Close() os.Remove(dbPath) }) return client } // CleanupTestDB removes all data from the test database func CleanupTestDB(t *testing.T, client *ent.Client) { ctx := context.Background() // Delete all data in reverse order of dependencies _, err := client.Permission.Delete().Exec(ctx) require.NoError(t, err) _, err = client.Role.Delete().Exec(ctx) require.NoError(t, err) _, err = client.User.Delete().Exec(ctx) require.NoError(t, err) } // IsSQLiteConstraintError checks if the error is a SQLite constraint error func IsSQLiteConstraintError(err error) bool { sqliteErr, ok := err.(sqlite3.Error) return ok && sqliteErr.Code == sqlite3.ErrConstraint }