package convert import ( "fmt" "net/url" "testing" "github.com/muhlemmer/gu" "github.com/stretchr/testify/assert" "github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/eventstore/v1/models" "github.com/zitadel/zitadel/internal/integration" "github.com/zitadel/zitadel/internal/query" "github.com/zitadel/zitadel/pkg/grpc/application/v2" ) func samlMetadataGen(entityID string) []byte { str := fmt.Sprintf(` urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified `, entityID) return []byte(str) } func TestCreateSAMLAppRequestToDomain(t *testing.T) { t.Parallel() genMetaForValidRequest := samlMetadataGen(integration.URL()) tt := []struct { testName string appName string projectID string req *application.CreateSAMLApplicationRequest expectedResponse *domain.SAMLApp expectedError error }{ { testName: "login version error", appName: "test-application", projectID: "proj-1", req: &application.CreateSAMLApplicationRequest{ Metadata: &application.CreateSAMLApplicationRequest_MetadataXml{ MetadataXml: samlMetadataGen(integration.URL()), }, LoginVersion: &application.LoginVersion{ Version: &application.LoginVersion_LoginV2{ LoginV2: &application.LoginV2{BaseUri: gu.Ptr("%+o")}, }, }, }, expectedError: &url.Error{ URL: "%+o", Op: "parse", Err: url.EscapeError("%+o"), }, }, { testName: "valid request", appName: "test-application", projectID: "proj-1", req: &application.CreateSAMLApplicationRequest{ Metadata: &application.CreateSAMLApplicationRequest_MetadataXml{ MetadataXml: genMetaForValidRequest, }, LoginVersion: nil, }, expectedResponse: &domain.SAMLApp{ ObjectRoot: models.ObjectRoot{AggregateID: "proj-1"}, AppName: "test-application", Metadata: genMetaForValidRequest, MetadataURL: gu.Ptr(""), LoginVersion: gu.Ptr(domain.LoginVersionUnspecified), LoginBaseURI: gu.Ptr(""), State: 0, }, }, { testName: "nil request", appName: "test-application", projectID: "proj-1", req: nil, expectedResponse: &domain.SAMLApp{ AppName: "test-application", ObjectRoot: models.ObjectRoot{AggregateID: "proj-1"}, MetadataURL: gu.Ptr(""), LoginVersion: gu.Ptr(domain.LoginVersionUnspecified), LoginBaseURI: gu.Ptr(""), }, }, } for _, tc := range tt { t.Run(tc.testName, func(t *testing.T) { t.Parallel() // When res, err := CreateSAMLAppRequestToDomain(tc.appName, tc.projectID, tc.req) // Then assert.Equal(t, tc.expectedError, err) assert.Equal(t, tc.expectedResponse, res) }) } } func TestUpdateSAMLAppConfigRequestToDomain(t *testing.T) { t.Parallel() genMetaForValidRequest := samlMetadataGen(integration.URL()) tt := []struct { testName string appID string projectID string req *application.UpdateSAMLApplicationConfigurationRequest expectedResponse *domain.SAMLApp expectedError error }{ { testName: "login version error", appID: "application-1", projectID: "proj-1", req: &application.UpdateSAMLApplicationConfigurationRequest{ Metadata: &application.UpdateSAMLApplicationConfigurationRequest_MetadataXml{ MetadataXml: samlMetadataGen(integration.URL()), }, LoginVersion: &application.LoginVersion{ Version: &application.LoginVersion_LoginV2{ LoginV2: &application.LoginV2{BaseUri: gu.Ptr("%+o")}, }, }, }, expectedError: &url.Error{ URL: "%+o", Op: "parse", Err: url.EscapeError("%+o"), }, }, { testName: "valid request", appID: "application-1", projectID: "proj-1", req: &application.UpdateSAMLApplicationConfigurationRequest{ Metadata: &application.UpdateSAMLApplicationConfigurationRequest_MetadataXml{ MetadataXml: genMetaForValidRequest, }, LoginVersion: nil, }, expectedResponse: &domain.SAMLApp{ ObjectRoot: models.ObjectRoot{AggregateID: "proj-1"}, AppID: "application-1", Metadata: genMetaForValidRequest, LoginVersion: gu.Ptr(domain.LoginVersionUnspecified), LoginBaseURI: gu.Ptr(""), }, }, { testName: "nil request", appID: "application-1", projectID: "proj-1", req: nil, expectedResponse: &domain.SAMLApp{ ObjectRoot: models.ObjectRoot{AggregateID: "proj-1"}, AppID: "application-1", LoginVersion: gu.Ptr(domain.LoginVersionUnspecified), LoginBaseURI: gu.Ptr(""), }, }, } for _, tc := range tt { t.Run(tc.testName, func(t *testing.T) { t.Parallel() // When res, err := UpdateSAMLAppConfigRequestToDomain(tc.appID, tc.projectID, tc.req) // Then assert.Equal(t, tc.expectedError, err) assert.Equal(t, tc.expectedResponse, res) }) } } func TestAppSAMLConfigToPb(t *testing.T) { t.Parallel() metadata := samlMetadataGen(integration.URL()) tt := []struct { name string inputSAMLApp *query.SAMLApp expectedPbApp application.IsApplicationConfiguration }{ { name: "valid conversion", inputSAMLApp: &query.SAMLApp{ Metadata: metadata, LoginVersion: domain.LoginVersion2, LoginBaseURI: gu.Ptr("https://example.com"), }, expectedPbApp: &application.Application_SamlConfiguration{ SamlConfiguration: &application.SAMLConfiguration{ MetadataXml: metadata, LoginVersion: &application.LoginVersion{ Version: &application.LoginVersion_LoginV2{ LoginV2: &application.LoginV2{BaseUri: gu.Ptr("https://example.com")}, }, }, }, }, }, { name: "nil saml application", inputSAMLApp: nil, expectedPbApp: &application.Application_SamlConfiguration{ SamlConfiguration: &application.SAMLConfiguration{ LoginVersion: &application.LoginVersion{}, }, }, }, } for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { t.Parallel() // When got := appSAMLConfigToPb(tc.inputSAMLApp) // Then assert.Equal(t, tc.expectedPbApp, got) }) } }