forked from baron/baron-sso
72 lines
2.6 KiB
Go
72 lines
2.6 KiB
Go
package repository
|
|
|
|
import (
|
|
"baron-sso-backend/internal/domain"
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestClearOrphanUserTenantMemberships(t *testing.T) {
|
|
ctx := context.Background()
|
|
repo := NewUserRepository(testDB)
|
|
tenantRepo := NewTenantRepository(testDB)
|
|
|
|
require.NoError(t, testDB.Exec("DELETE FROM user_login_ids").Error)
|
|
require.NoError(t, testDB.Exec("DELETE FROM users").Error)
|
|
require.NoError(t, testDB.Exec("DELETE FROM tenant_domains").Error)
|
|
require.NoError(t, testDB.Unscoped().Where("slug IN ?", []string{"orphan-active", "orphan-deleted"}).Delete(&domain.Tenant{}).Error)
|
|
|
|
activeTenant := &domain.Tenant{Name: "Active Tenant", Slug: "orphan-active", Type: domain.TenantTypeCompany}
|
|
deletedTenant := &domain.Tenant{Name: "Deleted Tenant", Slug: "orphan-deleted", Type: domain.TenantTypeCompany}
|
|
require.NoError(t, tenantRepo.Create(ctx, activeTenant))
|
|
require.NoError(t, tenantRepo.Create(ctx, deletedTenant))
|
|
require.NoError(t, testDB.Delete(&domain.Tenant{}, "id = ?", deletedTenant.ID).Error)
|
|
|
|
activeUser := &domain.User{
|
|
Email: "active-membership@example.com",
|
|
Name: "Active Membership",
|
|
Role: "user",
|
|
TenantID: &activeTenant.ID,
|
|
CompanyCode: activeTenant.Slug,
|
|
CompanyCodes: []string{activeTenant.Slug},
|
|
}
|
|
orphanUser := &domain.User{
|
|
Email: "orphan-membership@example.com",
|
|
Name: "Orphan Membership",
|
|
Role: "user",
|
|
TenantID: &deletedTenant.ID,
|
|
CompanyCode: deletedTenant.Slug,
|
|
CompanyCodes: []string{deletedTenant.Slug},
|
|
}
|
|
require.NoError(t, repo.Create(ctx, activeUser))
|
|
require.NoError(t, repo.Create(ctx, orphanUser))
|
|
|
|
count, err := CountOrphanUserTenantMemberships(ctx, testDB)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, int64(1), count)
|
|
|
|
affected, err := ClearOrphanUserTenantMemberships(ctx, testDB)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, int64(1), affected)
|
|
|
|
foundActive, err := repo.FindByEmail(ctx, activeUser.Email)
|
|
require.NoError(t, err)
|
|
require.NotNil(t, foundActive.TenantID)
|
|
assert.Equal(t, activeTenant.ID, *foundActive.TenantID)
|
|
assert.Equal(t, activeTenant.Slug, foundActive.CompanyCode)
|
|
assert.Equal(t, []string{activeTenant.Slug}, []string(foundActive.CompanyCodes))
|
|
|
|
foundOrphan, err := repo.FindByEmail(ctx, orphanUser.Email)
|
|
require.NoError(t, err)
|
|
assert.Nil(t, foundOrphan.TenantID)
|
|
assert.Empty(t, foundOrphan.CompanyCode)
|
|
assert.Empty(t, foundOrphan.CompanyCodes)
|
|
|
|
count, err = CountOrphanUserTenantMemberships(ctx, testDB)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, int64(0), count)
|
|
}
|