Files
zitadel/backend/v3/api/instance/v2/convert/domain_test.go
T
b339a3e696 feat: instance domain APIs with relational tables (#11051)
# Which Problems Are Solved

This PR implements the endpoints listed in
https://github.com/zitadel/zitadel/issues/10444 .

# How the Problems Are Solved

The implementation follows the same pattern as the Instance one. The
`Add` and `Remove` are implementing the `Commander` interface, while
`List` Domains endpoints are implementing the `Querier` interace.

The PR adds also some forgotten calls to the relational logic for the
Instance API. The commits are identifiable by the label `instance:`
prepended to them. This is the complete list: bafce01b0 , 6fe7257ab ,
e27bc9c34 , 8133ede73 , fde667953 , a3e1135ed , ee1a6f9c1

# Additional Context

- Closes #10444

---------

Co-authored-by: Elio Bischof <[email protected]>
Co-authored-by: Lebogang Phoshoko <[email protected]>
Co-authored-by: Wim Van Laer <[email protected]>
Co-authored-by: Max Peintner <[email protected]>
Co-authored-by: Gayathri Vijayan <[email protected]>
2025-12-17 12:01:09 +01:00

427 lines
12 KiB
Go

package convert
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
"google.golang.org/protobuf/types/known/timestamppb"
"github.com/zitadel/zitadel/backend/v3/domain"
filter_v2 "github.com/zitadel/zitadel/pkg/grpc/filter/v2"
filter_v2beta "github.com/zitadel/zitadel/pkg/grpc/filter/v2beta"
instance_v2 "github.com/zitadel/zitadel/pkg/grpc/instance/v2"
instance_v2beta "github.com/zitadel/zitadel/pkg/grpc/instance/v2beta"
"github.com/zitadel/zitadel/pkg/grpc/object/v2"
)
func TestListCustomDomainsBetaRequestToV2Request(t *testing.T) {
t.Parallel()
tt := []struct {
testName string
inputRequest *instance_v2beta.ListCustomDomainsRequest
expectedRequest *instance_v2.ListCustomDomainsRequest
}{
{
testName: "with all fields",
inputRequest: &instance_v2beta.ListCustomDomainsRequest{
InstanceId: "instance1",
Pagination: &filter_v2beta.PaginationRequest{
Offset: 0,
Limit: 10,
Asc: true,
},
SortingColumn: instance_v2beta.DomainFieldName_DOMAIN_FIELD_NAME_DOMAIN,
Queries: []*instance_v2beta.DomainSearchQuery{
{
Query: &instance_v2beta.DomainSearchQuery_DomainQuery{
DomainQuery: &instance_v2beta.DomainQuery{
Domain: "test.com",
Method: object.TextQueryMethod_TEXT_QUERY_METHOD_EQUALS,
},
},
},
{
Query: &instance_v2beta.DomainSearchQuery_GeneratedQuery{
GeneratedQuery: &instance_v2beta.DomainGeneratedQuery{
Generated: true,
},
},
},
{
Query: &instance_v2beta.DomainSearchQuery_PrimaryQuery{
PrimaryQuery: &instance_v2beta.DomainPrimaryQuery{
Primary: true,
},
},
},
},
},
expectedRequest: &instance_v2.ListCustomDomainsRequest{
InstanceId: "instance1",
Pagination: &filter_v2.PaginationRequest{
Offset: 0,
Limit: 10,
Asc: true,
},
SortingColumn: instance_v2.DomainFieldName_DOMAIN_FIELD_NAME_DOMAIN,
Filters: []*instance_v2.CustomDomainFilter{
{
Filter: &instance_v2.CustomDomainFilter_DomainFilter{
DomainFilter: &instance_v2.DomainFilter{
Domain: "test.com",
Method: object.TextQueryMethod_TEXT_QUERY_METHOD_EQUALS,
},
},
},
{
Filter: &instance_v2.CustomDomainFilter_GeneratedFilter{
GeneratedFilter: true,
},
},
{
Filter: &instance_v2.CustomDomainFilter_PrimaryFilter{
PrimaryFilter: true,
},
},
},
},
},
{
testName: "empty request",
inputRequest: &instance_v2beta.ListCustomDomainsRequest{},
expectedRequest: &instance_v2.ListCustomDomainsRequest{
Pagination: &filter_v2.PaginationRequest{},
Filters: []*instance_v2.CustomDomainFilter{},
},
},
{
testName: "with sorting only",
inputRequest: &instance_v2beta.ListCustomDomainsRequest{
SortingColumn: instance_v2beta.DomainFieldName_DOMAIN_FIELD_NAME_CREATION_DATE,
},
expectedRequest: &instance_v2.ListCustomDomainsRequest{
Pagination: &filter_v2.PaginationRequest{},
SortingColumn: instance_v2.DomainFieldName_DOMAIN_FIELD_NAME_CREATION_DATE,
Filters: []*instance_v2.CustomDomainFilter{},
},
},
}
for _, tc := range tt {
t.Run(tc.testName, func(t *testing.T) {
t.Parallel()
got := ListCustomDomainsBetaRequestToV2Request(tc.inputRequest)
assert.Equal(t, tc.expectedRequest, got)
})
}
}
func Test_listCustomDomainsBetaSortingColToV2Request(t *testing.T) {
t.Parallel()
tt := []struct {
testName string
inputFieldName instance_v2beta.DomainFieldName
expecteFieldName instance_v2.DomainFieldName
}{
{
testName: "creation date",
inputFieldName: instance_v2beta.DomainFieldName_DOMAIN_FIELD_NAME_CREATION_DATE,
expecteFieldName: instance_v2.DomainFieldName_DOMAIN_FIELD_NAME_CREATION_DATE,
},
{
testName: "domain",
inputFieldName: instance_v2beta.DomainFieldName_DOMAIN_FIELD_NAME_DOMAIN,
expecteFieldName: instance_v2.DomainFieldName_DOMAIN_FIELD_NAME_DOMAIN,
},
{
testName: "generated",
inputFieldName: instance_v2beta.DomainFieldName_DOMAIN_FIELD_NAME_GENERATED,
expecteFieldName: instance_v2.DomainFieldName_DOMAIN_FIELD_NAME_GENERATED,
},
{
testName: "primary",
inputFieldName: instance_v2beta.DomainFieldName_DOMAIN_FIELD_NAME_PRIMARY,
expecteFieldName: instance_v2.DomainFieldName_DOMAIN_FIELD_NAME_PRIMARY,
},
{
testName: "unspecified",
inputFieldName: instance_v2beta.DomainFieldName_DOMAIN_FIELD_NAME_UNSPECIFIED,
expecteFieldName: instance_v2.DomainFieldName_DOMAIN_FIELD_NAME_UNSPECIFIED,
},
{
testName: "default",
inputFieldName: instance_v2beta.DomainFieldName(99),
expecteFieldName: instance_v2.DomainFieldName_DOMAIN_FIELD_NAME_UNSPECIFIED,
},
}
for _, tc := range tt {
t.Run(tc.testName, func(t *testing.T) {
t.Parallel()
got := listCustomDomainsBetaSortingColToV2Request(tc.inputFieldName)
assert.Equal(t, tc.expecteFieldName, got)
})
}
}
func TestListTrustedDomainsBetaRequestToV2Request(t *testing.T) {
t.Parallel()
tt := []struct {
testName string
inputRequest *instance_v2beta.ListTrustedDomainsRequest
expectedRequest *instance_v2.ListTrustedDomainsRequest
}{
{
testName: "with all fields",
inputRequest: &instance_v2beta.ListTrustedDomainsRequest{
InstanceId: "instance1",
Pagination: &filter_v2beta.PaginationRequest{
Offset: 0,
Limit: 10,
Asc: true,
},
SortingColumn: instance_v2beta.TrustedDomainFieldName_TRUSTED_DOMAIN_FIELD_NAME_DOMAIN,
Queries: []*instance_v2beta.TrustedDomainSearchQuery{
{
Query: &instance_v2beta.TrustedDomainSearchQuery_DomainQuery{
DomainQuery: &instance_v2beta.DomainQuery{
Domain: "test.com",
Method: object.TextQueryMethod_TEXT_QUERY_METHOD_EQUALS,
},
},
},
},
},
expectedRequest: &instance_v2.ListTrustedDomainsRequest{
InstanceId: "instance1",
Pagination: &filter_v2.PaginationRequest{
Offset: 0,
Limit: 10,
Asc: true,
},
SortingColumn: instance_v2.TrustedDomainFieldName_TRUSTED_DOMAIN_FIELD_NAME_DOMAIN,
Filters: []*instance_v2.TrustedDomainFilter{
{
Filter: &instance_v2.TrustedDomainFilter_DomainFilter{
DomainFilter: &instance_v2.DomainFilter{
Domain: "test.com",
Method: object.TextQueryMethod_TEXT_QUERY_METHOD_EQUALS,
},
},
},
},
},
},
{
testName: "empty request",
inputRequest: &instance_v2beta.ListTrustedDomainsRequest{},
expectedRequest: &instance_v2.ListTrustedDomainsRequest{
Pagination: &filter_v2.PaginationRequest{},
Filters: []*instance_v2.TrustedDomainFilter{},
},
},
{
testName: "with sorting only",
inputRequest: &instance_v2beta.ListTrustedDomainsRequest{
SortingColumn: instance_v2beta.TrustedDomainFieldName_TRUSTED_DOMAIN_FIELD_NAME_CREATION_DATE,
},
expectedRequest: &instance_v2.ListTrustedDomainsRequest{
Pagination: &filter_v2.PaginationRequest{},
SortingColumn: instance_v2.TrustedDomainFieldName_TRUSTED_DOMAIN_FIELD_NAME_CREATION_DATE,
Filters: []*instance_v2.TrustedDomainFilter{},
},
},
}
for _, tc := range tt {
t.Run(tc.testName, func(t *testing.T) {
t.Parallel()
got := ListTrustedDomainsBetaRequestToV2Request(tc.inputRequest)
assert.Equal(t, tc.expectedRequest, got)
})
}
}
func Test_listTrustedDomainsBetaSortingColToV2Request(t *testing.T) {
t.Parallel()
tt := []struct {
testName string
inputFieldName instance_v2beta.TrustedDomainFieldName
expecteFieldName instance_v2.TrustedDomainFieldName
}{
{
testName: "creation date",
inputFieldName: instance_v2beta.TrustedDomainFieldName_TRUSTED_DOMAIN_FIELD_NAME_CREATION_DATE,
expecteFieldName: instance_v2.TrustedDomainFieldName_TRUSTED_DOMAIN_FIELD_NAME_CREATION_DATE,
},
{
testName: "domain",
inputFieldName: instance_v2beta.TrustedDomainFieldName_TRUSTED_DOMAIN_FIELD_NAME_DOMAIN,
expecteFieldName: instance_v2.TrustedDomainFieldName_TRUSTED_DOMAIN_FIELD_NAME_DOMAIN,
},
{
testName: "unspecified",
inputFieldName: instance_v2beta.TrustedDomainFieldName_TRUSTED_DOMAIN_FIELD_NAME_UNSPECIFIED,
expecteFieldName: instance_v2.TrustedDomainFieldName_TRUSTED_DOMAIN_FIELD_NAME_UNSPECIFIED,
},
{
testName: "default",
inputFieldName: instance_v2beta.TrustedDomainFieldName(99),
expecteFieldName: instance_v2.TrustedDomainFieldName_TRUSTED_DOMAIN_FIELD_NAME_UNSPECIFIED,
},
}
for _, tc := range tt {
t.Run(tc.testName, func(t *testing.T) {
t.Parallel()
got := listTrustedDomainsBetaSortingColToV2Request(tc.inputFieldName)
assert.Equal(t, tc.expecteFieldName, got)
})
}
}
func TestTrustedDomainInstanceDomainListModelToGRPCBetaResponse(t *testing.T) {
t.Parallel()
testTime := time.Now()
tt := []struct {
name string
input []*domain.InstanceDomain
expected []*instance_v2beta.TrustedDomain
}{
{
name: "single domain",
input: []*domain.InstanceDomain{
{
InstanceID: "instance1",
CreatedAt: testTime,
Domain: "test.com",
},
},
expected: []*instance_v2beta.TrustedDomain{
{
InstanceId: "instance1",
CreationDate: timestamppb.New(testTime),
Domain: "test.com",
},
},
},
{
name: "multiple domains",
input: []*domain.InstanceDomain{
{
InstanceID: "instance1",
CreatedAt: testTime,
Domain: "test1.com",
},
{
InstanceID: "instance2",
CreatedAt: testTime,
Domain: "test2.com",
},
},
expected: []*instance_v2beta.TrustedDomain{
{
InstanceId: "instance1",
CreationDate: timestamppb.New(testTime),
Domain: "test1.com",
},
{
InstanceId: "instance2",
CreationDate: timestamppb.New(testTime),
Domain: "test2.com",
},
},
},
{
name: "empty list",
input: []*domain.InstanceDomain{},
expected: []*instance_v2beta.TrustedDomain{},
},
}
for _, tc := range tt {
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
got := TrustedDomainInstanceDomainListModelToGRPCBetaResponse(tc.input)
assert.Equal(t, tc.expected, got)
})
}
}
func TestTrustedDomainInstanceDomainListModelToGRPCResponse(t *testing.T) {
t.Parallel()
testTime := time.Now()
tt := []struct {
name string
input []*domain.InstanceDomain
expected []*instance_v2.TrustedDomain
}{
{
name: "single domain",
input: []*domain.InstanceDomain{
{
InstanceID: "instance1",
CreatedAt: testTime,
Domain: "test.com",
},
},
expected: []*instance_v2.TrustedDomain{
{
InstanceId: "instance1",
CreationDate: timestamppb.New(testTime),
Domain: "test.com",
},
},
},
{
name: "multiple domains",
input: []*domain.InstanceDomain{
{
InstanceID: "instance1",
CreatedAt: testTime,
Domain: "test1.com",
},
{
InstanceID: "instance2",
CreatedAt: testTime,
Domain: "test2.com",
},
},
expected: []*instance_v2.TrustedDomain{
{
InstanceId: "instance1",
CreationDate: timestamppb.New(testTime),
Domain: "test1.com",
},
{
InstanceId: "instance2",
CreationDate: timestamppb.New(testTime),
Domain: "test2.com",
},
},
},
{
name: "empty list",
input: []*domain.InstanceDomain{},
expected: []*instance_v2.TrustedDomain{},
},
}
for _, tc := range tt {
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
got := TrustedDomainInstanceDomainListModelToGRPCResponse(tc.input)
assert.Equal(t, tc.expected, got)
})
}
}