mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-12 03:07:31 +00:00
208 lines
6.3 KiB
Go
208 lines
6.3 KiB
Go
package readmodel
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/Masterminds/squirrel"
|
|
"github.com/DATA-DOG/go-sqlmock"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/zitadel/zitadel/internal/domain"
|
|
v2domain "github.com/zitadel/zitadel/internal/v2/domain"
|
|
"github.com/zitadel/zitadel/internal/v2/database"
|
|
)
|
|
|
|
func TestDomainRepository_AddInstanceDomain(t *testing.T) {
|
|
db, mock, err := sqlmock.New()
|
|
require.NoError(t, err)
|
|
defer db.Close()
|
|
|
|
repo := NewDomainRepository(db)
|
|
|
|
instanceID := "test-instance-id"
|
|
domainName := "test.example.com"
|
|
expectedID := "domain-id-123"
|
|
|
|
mock.ExpectQuery(`INSERT INTO zitadel\.domains`).
|
|
WithArgs(instanceID, domainName, true, false, sqlmock.AnyArg(), sqlmock.AnyArg()).
|
|
WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(expectedID))
|
|
|
|
result, err := repo.AddInstanceDomain(context.Background(), instanceID, domainName)
|
|
|
|
require.NoError(t, err)
|
|
assert.Equal(t, expectedID, result.ID)
|
|
assert.Equal(t, instanceID, result.InstanceID)
|
|
assert.Nil(t, result.OrganizationID)
|
|
assert.Equal(t, domainName, result.Domain)
|
|
assert.True(t, result.IsVerified)
|
|
assert.False(t, result.IsPrimary)
|
|
assert.Nil(t, result.ValidationType)
|
|
|
|
assert.NoError(t, mock.ExpectationsWereMet())
|
|
}
|
|
|
|
func TestDomainRepository_AddOrganizationDomain(t *testing.T) {
|
|
db, mock, err := sqlmock.New()
|
|
require.NoError(t, err)
|
|
defer db.Close()
|
|
|
|
repo := NewDomainRepository(db)
|
|
|
|
instanceID := "test-instance-id"
|
|
orgID := "test-org-id"
|
|
domainName := "test.example.com"
|
|
validationType := domain.OrgDomainValidationTypeHTTP
|
|
expectedID := "domain-id-456"
|
|
|
|
mock.ExpectQuery(`INSERT INTO zitadel\.domains`).
|
|
WithArgs(instanceID, orgID, domainName, false, false, int(validationType), sqlmock.AnyArg(), sqlmock.AnyArg()).
|
|
WillReturnRows(sqlmock.NewRows([]string{"id"}).AddRow(expectedID))
|
|
|
|
result, err := repo.AddOrganizationDomain(context.Background(), instanceID, orgID, domainName, validationType)
|
|
|
|
require.NoError(t, err)
|
|
assert.Equal(t, expectedID, result.ID)
|
|
assert.Equal(t, instanceID, result.InstanceID)
|
|
assert.Equal(t, orgID, *result.OrganizationID)
|
|
assert.Equal(t, domainName, result.Domain)
|
|
assert.False(t, result.IsVerified)
|
|
assert.False(t, result.IsPrimary)
|
|
assert.Equal(t, validationType, *result.ValidationType)
|
|
|
|
assert.NoError(t, mock.ExpectationsWereMet())
|
|
}
|
|
|
|
func TestDomainRepository_SetInstanceDomainPrimary(t *testing.T) {
|
|
db, mock, err := sqlmock.New()
|
|
require.NoError(t, err)
|
|
defer db.Close()
|
|
|
|
repo := NewDomainRepository(db)
|
|
|
|
instanceID := "test-instance-id"
|
|
domainName := "test.example.com"
|
|
|
|
// Mock transaction begin
|
|
mock.ExpectBegin()
|
|
|
|
// Mock unset existing primary
|
|
mock.ExpectExec(`UPDATE zitadel\.domains SET.*is_primary.*=.*false`).
|
|
WillReturnResult(sqlmock.NewResult(0, 0))
|
|
|
|
// Mock set new primary
|
|
mock.ExpectExec(`UPDATE zitadel\.domains SET.*is_primary.*=.*true`).
|
|
WithArgs(sqlmock.AnyArg(), true, instanceID, nil, domainName).
|
|
WillReturnResult(sqlmock.NewResult(0, 1))
|
|
|
|
// Mock transaction commit
|
|
mock.ExpectCommit()
|
|
|
|
err = repo.SetInstanceDomainPrimary(context.Background(), instanceID, domainName)
|
|
|
|
require.NoError(t, err)
|
|
assert.NoError(t, mock.ExpectationsWereMet())
|
|
}
|
|
|
|
func TestDomainRepository_Get(t *testing.T) {
|
|
db, mock, err := sqlmock.New()
|
|
require.NoError(t, err)
|
|
defer db.Close()
|
|
|
|
repo := NewDomainRepository(db)
|
|
|
|
instanceID := "test-instance-id"
|
|
domainName := "test.example.com"
|
|
now := time.Now()
|
|
|
|
criteria := v2domain.DomainSearchCriteria{
|
|
InstanceID: &instanceID,
|
|
Domain: &domainName,
|
|
}
|
|
|
|
rows := sqlmock.NewRows([]string{
|
|
"id", "instance_id", "org_id", "domain", "is_verified", "is_primary", "validation_type", "created_at", "updated_at", "deleted_at",
|
|
}).AddRow("domain-123", instanceID, nil, domainName, true, false, nil, now, now, nil)
|
|
|
|
mock.ExpectQuery(`SELECT .* FROM zitadel\.domains`).
|
|
WithArgs(domainName, instanceID).
|
|
WillReturnRows(rows)
|
|
|
|
result, err := repo.Get(context.Background(), criteria)
|
|
|
|
require.NoError(t, err)
|
|
assert.Equal(t, "domain-123", result.ID)
|
|
assert.Equal(t, instanceID, result.InstanceID)
|
|
assert.Nil(t, result.OrganizationID)
|
|
assert.Equal(t, domainName, result.Domain)
|
|
assert.True(t, result.IsVerified)
|
|
assert.False(t, result.IsPrimary)
|
|
|
|
assert.NoError(t, mock.ExpectationsWereMet())
|
|
}
|
|
|
|
func TestDomainRepository_List(t *testing.T) {
|
|
db, mock, err := sqlmock.New()
|
|
require.NoError(t, err)
|
|
defer db.Close()
|
|
|
|
repo := NewDomainRepository(db)
|
|
|
|
instanceID := "test-instance-id"
|
|
now := time.Now()
|
|
|
|
criteria := v2domain.DomainSearchCriteria{
|
|
InstanceID: &instanceID,
|
|
}
|
|
|
|
pagination := v2domain.DomainPagination{
|
|
Limit: 10,
|
|
Offset: 0,
|
|
SortBy: v2domain.DomainSortFieldDomain,
|
|
Order: database.SortOrderAsc,
|
|
}
|
|
|
|
// Mock count query
|
|
countRows := sqlmock.NewRows([]string{"count"}).AddRow(2)
|
|
mock.ExpectQuery(`SELECT COUNT\(\*\) FROM zitadel\.domains`).
|
|
WithArgs(instanceID).
|
|
WillReturnRows(countRows)
|
|
|
|
// Mock data query
|
|
rows := sqlmock.NewRows([]string{
|
|
"id", "instance_id", "org_id", "domain", "is_verified", "is_primary", "validation_type", "created_at", "updated_at", "deleted_at",
|
|
}).
|
|
AddRow("domain-instance", instanceID, nil, "instance.example.com", true, true, nil, now, now, nil).
|
|
AddRow("domain-org", instanceID, "org-id", "org.example.com", false, false, int(domain.OrgDomainValidationTypeHTTP), now, now, nil)
|
|
|
|
mock.ExpectQuery(`SELECT .* FROM zitadel\.domains.*ORDER BY domain ASC.*LIMIT 10`).
|
|
WithArgs(instanceID).
|
|
WillReturnRows(rows)
|
|
|
|
result, err := repo.List(context.Background(), criteria, pagination)
|
|
|
|
require.NoError(t, err)
|
|
assert.Equal(t, uint64(2), result.TotalCount)
|
|
assert.Len(t, result.Domains, 2)
|
|
|
|
// Check first domain (instance domain)
|
|
assert.Equal(t, "domain-instance", result.Domains[0].ID)
|
|
assert.Equal(t, instanceID, result.Domains[0].InstanceID)
|
|
assert.Nil(t, result.Domains[0].OrganizationID)
|
|
assert.Equal(t, "instance.example.com", result.Domains[0].Domain)
|
|
assert.True(t, result.Domains[0].IsVerified)
|
|
assert.True(t, result.Domains[0].IsPrimary)
|
|
|
|
// Check second domain (org domain)
|
|
assert.Equal(t, "domain-org", result.Domains[1].ID)
|
|
assert.Equal(t, instanceID, result.Domains[1].InstanceID)
|
|
assert.Equal(t, "org-id", *result.Domains[1].OrganizationID)
|
|
assert.Equal(t, "org.example.com", result.Domains[1].Domain)
|
|
assert.False(t, result.Domains[1].IsVerified)
|
|
assert.False(t, result.Domains[1].IsPrimary)
|
|
|
|
assert.NoError(t, mock.ExpectationsWereMet())
|
|
} |