114 lines
2.7 KiB
Go
114 lines
2.7 KiB
Go
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)
|
|
})
|
|
}
|