package tenant_test import ( "context" "os" "testing" "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/techxcar/backend/internal/tenant" "github.com/techxcar/backend/pkg/database" ) func setupDB(t *testing.T) *database.DB { t.Helper() url := os.Getenv("TEST_DATABASE_URL") if url == "" { t.Skip("TEST_DATABASE_URL not set, skipping integration test") } db, err := database.New(url) require.NoError(t, err) t.Cleanup(db.Close) return db } func TestGetSuperAdminByEmail_notFound(t *testing.T) { db := setupDB(t) repo := tenant.NewRepository(db) admin, err := repo.GetSuperAdminByEmail(context.Background(), "nobody@example.com") require.NoError(t, err) assert.Nil(t, admin) } func TestCreateAndGetSuperAdmin(t *testing.T) { db := setupDB(t) repo := tenant.NewRepository(db) ctx := context.Background() email := "sa_" + time.Now().Format("20060102150405") + "@example.com" admin, err := repo.CreateSuperAdmin(ctx, email, "hash123") require.NoError(t, err) require.NotNil(t, admin) assert.NotEmpty(t, admin.ID) assert.Equal(t, email, admin.Email) found, err := repo.GetSuperAdminByEmail(ctx, email) require.NoError(t, err) require.NotNil(t, found) assert.Equal(t, admin.ID, found.ID) t.Cleanup(func() { db.Pool.Exec(ctx, "DELETE FROM super_admins WHERE id = $1", admin.ID) }) } func TestCreateAndListTenants(t *testing.T) { db := setupDB(t) repo := tenant.NewRepository(db) ctx := context.Background() slug := "test-" + time.Now().Format("20060102150405") ten, err := repo.CreateTenant(ctx, slug, "Test Workshop") require.NoError(t, err) require.NotNil(t, ten) assert.NotEmpty(t, ten.ID) assert.Equal(t, slug, ten.Slug) assert.Equal(t, "active", ten.Status) list, err := repo.ListTenants(ctx) require.NoError(t, err) found := false for _, v := range list { if v.ID == ten.ID { found = true } } assert.True(t, found) t.Cleanup(func() { db.Pool.Exec(ctx, "DELETE FROM tenants WHERE id = $1", ten.ID) }) } func TestCreateAndUseInvite(t *testing.T) { db := setupDB(t) repo := tenant.NewRepository(db) ctx := context.Background() invite, err := repo.CreateInvite(ctx, nil, 24*time.Hour) require.NoError(t, err) require.NotNil(t, invite) assert.NotEmpty(t, invite.Token) assert.Nil(t, invite.UsedAt) assert.True(t, invite.ExpiresAt.After(time.Now())) found, err := repo.GetInviteByToken(ctx, invite.Token) require.NoError(t, err) require.NotNil(t, found) assert.Equal(t, invite.ID, found.ID) err = repo.UseInvite(ctx, invite.ID) require.NoError(t, err) used, err := repo.GetInviteByToken(ctx, invite.Token) require.NoError(t, err) assert.NotNil(t, used.UsedAt) t.Cleanup(func() { db.Pool.Exec(ctx, "DELETE FROM invites WHERE id = $1", invite.ID) }) }