From b38390e63b6df26e732db78fc8f2274c1ab18159 Mon Sep 17 00:00:00 2001 From: Phil Schneider Date: Tue, 6 Aug 2024 08:15:20 +0200 Subject: [PATCH] fix(connector): adjust sd doc validation for connector creation (#894) Refs: #894 Co-authored-by: Norbert Truchsess Reviewed-by: Norbert Truchsess Reviewed-By: Evelyn Gurschler --- .../BusinessLogic/ConnectorsBusinessLogic.cs | 23 +++++++------- ...istrationConnectorErrorMessageContainer.cs | 2 -- .../ConnectorsBusinessLogicTests.cs | 31 +++++++++++++++++-- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/administration/Administration.Service/BusinessLogic/ConnectorsBusinessLogic.cs b/src/administration/Administration.Service/BusinessLogic/ConnectorsBusinessLogic.cs index f69e9f7f89..99fea42295 100644 --- a/src/administration/Administration.Service/BusinessLogic/ConnectorsBusinessLogic.cs +++ b/src/administration/Administration.Service/BusinessLogic/ConnectorsBusinessLogic.cs @@ -105,18 +105,15 @@ private async Task CreateConnectorInternalAsync(ConnectorInputModel connec throw UnexpectedConditionException.Create(AdministrationConnectorErrors.CONNECTOR_UNEXPECTED_NO_BPN_ASSIGNED, new ErrorParameter[] { new("companyId", companyId.ToString()) }); } - if (result.SelfDescriptionDocumentId is null) - { - throw UnexpectedConditionException.Create(AdministrationConnectorErrors.CONNECTOR_UNEXPECTED_NO_DESCRIPTION, new ErrorParameter[] { new("companyId", companyId.ToString()) }); - } await ValidateTechnicalUser(technicalUserId, companyId).ConfigureAwait(ConfigureAwaitOptions.None); var connectorRequestModel = new ConnectorRequestModel(name, connectorUrl, ConnectorTypeId.COMPANY_CONNECTOR, location, companyId, companyId, technicalUserId); return await CreateAndRegisterConnectorAsync( connectorRequestModel, result.Bpn, - result.SelfDescriptionDocumentId.Value, + result.SelfDescriptionDocumentId, null, + companyId, cancellationToken).ConfigureAwait(ConfigureAwaitOptions.None); } @@ -151,11 +148,6 @@ private async Task CreateManagedConnectorInternalAsync(ManagedConnectorInp throw ConflictException.Create(AdministrationConnectorErrors.CONNECTOR_CONFLICT_STATUS_ACTIVE_OR_PENDING, new ErrorParameter[] { new("offerSubscriptionStatusIdActive", OfferSubscriptionStatusId.ACTIVE.ToString()), new("offerSubscriptionStatusIdPending", OfferSubscriptionStatusId.PENDING.ToString()) }); } - if (result.SelfDescriptionDocumentId is null) - { - throw ConflictException.Create(AdministrationConnectorErrors.CONNECTOR_CONFLICT_NO_DESCRIPTION, new ErrorParameter[] { new("companyId", result.CompanyId.ToString()) }); - } - if (string.IsNullOrWhiteSpace(result.ProviderBpn)) { throw ConflictException.Create(AdministrationConnectorErrors.CONNECTOR_CONFLICT_SET_BPN, new ErrorParameter[] { new("companyId", result.CompanyId.ToString()) }); @@ -167,8 +159,9 @@ private async Task CreateManagedConnectorInternalAsync(ManagedConnectorInp return await CreateAndRegisterConnectorAsync( connectorRequestModel, result.ProviderBpn, - result.SelfDescriptionDocumentId!.Value, + result.SelfDescriptionDocumentId, subscriptionId, + result.CompanyId, cancellationToken).ConfigureAwait(ConfigureAwaitOptions.None); } @@ -198,10 +191,16 @@ private async Task ValidateTechnicalUser(Guid? technicalUserId, Guid companyId) private async Task CreateAndRegisterConnectorAsync( ConnectorRequestModel connectorInputModel, string businessPartnerNumber, - Guid selfDescriptionDocumentId, + Guid? selfDescriptionDocumentId, Guid? subscriptionId, + Guid companyId, CancellationToken cancellationToken) { + if (selfDescriptionDocumentId is null && !_settings.ClearinghouseConnectDisabled) + { + throw ConflictException.Create(AdministrationConnectorErrors.CONNECTOR_CONFLICT_NO_DESCRIPTION, [new("companyId", companyId.ToString())]); + } + var (name, connectorUrl, type, location, provider, host, technicalUserId) = connectorInputModel; var connectorsRepository = portalRepositories.GetInstance(); diff --git a/src/administration/Administration.Service/ErrorHandling/AdministrationConnectorErrorMessageContainer.cs b/src/administration/Administration.Service/ErrorHandling/AdministrationConnectorErrorMessageContainer.cs index 1308302f82..4380fd2687 100644 --- a/src/administration/Administration.Service/ErrorHandling/AdministrationConnectorErrorMessageContainer.cs +++ b/src/administration/Administration.Service/ErrorHandling/AdministrationConnectorErrorMessageContainer.cs @@ -28,7 +28,6 @@ public class AdministrationConnectorErrorMessageContainer : IErrorMessageContain { AdministrationConnectorErrors.CONNECTOR_NOT_FOUND, "connector {connectorId} does not exist" }, { AdministrationConnectorErrors.CONNECTOR_NOT_PROVIDER_COMPANY,"company {companyId} is not provider of connector {connectorId}"}, { AdministrationConnectorErrors.CONNECTOR_UNEXPECTED_NO_BPN_ASSIGNED, "provider company {companyId} has no businessPartnerNumber assigned" }, - { AdministrationConnectorErrors.CONNECTOR_UNEXPECTED_NO_DESCRIPTION, "provider company {companyId} has no self description document" }, { AdministrationConnectorErrors.CONNECTOR_NOT_OFFERSUBSCRIPTION_EXIST,"OfferSubscription {subscriptionId} does not exist"}, { AdministrationConnectorErrors.CONNECTOR_NOT_PROVIDER_COMPANY_OFFER,"Company is not the provider of the offer"}, { AdministrationConnectorErrors.CONNECTOR_CONFLICT_OFFERSUBSCRIPTION_LINKED,"OfferSubscription is already linked to a connector"}, @@ -56,7 +55,6 @@ public enum AdministrationConnectorErrors CONNECTOR_NOT_FOUND, CONNECTOR_NOT_PROVIDER_COMPANY, CONNECTOR_UNEXPECTED_NO_BPN_ASSIGNED, - CONNECTOR_UNEXPECTED_NO_DESCRIPTION, CONNECTOR_NOT_OFFERSUBSCRIPTION_EXIST, CONNECTOR_NOT_PROVIDER_COMPANY_OFFER, CONNECTOR_CONFLICT_OFFERSUBSCRIPTION_LINKED, diff --git a/tests/administration/Administration.Service.Tests/BusinessLogic/ConnectorsBusinessLogicTests.cs b/tests/administration/Administration.Service.Tests/BusinessLogic/ConnectorsBusinessLogicTests.cs index 4f96886675..d8ab8c4361 100644 --- a/tests/administration/Administration.Service.Tests/BusinessLogic/ConnectorsBusinessLogicTests.cs +++ b/tests/administration/Administration.Service.Tests/BusinessLogic/ConnectorsBusinessLogicTests.cs @@ -201,6 +201,33 @@ public async Task CreateConnectorAsync_WithClientIdNull_DoesntSaveData() _connectors.Should().HaveCount(1); } + [Fact] + public async Task CreateConnectorAsync_WithoutSelfDescriptionDocumentAndSdConnectionDisabled_CallsExpected() + { + // Arrange + var sut = new ConnectorsBusinessLogic(_portalRepositories, Options.Create(new ConnectorsSettings + { + MaxPageSize = 15, + ValidCertificationContentTypes = new[] + { + "application/x-pem-file", + "application/x-x509-ca-cert", + "application/pkix-cert" + }, + ClearinghouseConnectDisabled = true + }), _sdFactoryBusinessLogic, _identityService, A.Fake>()); + + var connectorInput = new ConnectorInputModel("connectorName", "https://test.de", "de", null); + A.CallTo(() => _identity.CompanyId).Returns(CompanyIdWithoutSdDocument); + + // Act + await sut.CreateConnectorAsync(connectorInput, CancellationToken.None); + + // Assert + A.CallTo(() => _connectorsRepository.CreateConnector(A._, A._, A._, A>._)).MustHaveHappenedOnceExactly(); + A.CallTo(() => _sdFactoryBusinessLogic.RegisterConnectorAsync(A._, A._, A._, A._)).MustNotHaveHappened(); + } + [Fact] public async Task CreateConnectorAsync_WithoutSelfDescriptionDocument_ThrowsUnexpectedException() { @@ -212,8 +239,8 @@ public async Task CreateConnectorAsync_WithoutSelfDescriptionDocument_ThrowsUnex async Task Act() => await _logic.CreateConnectorAsync(connectorInput, CancellationToken.None); // Assert - var exception = await Assert.ThrowsAsync(Act); - exception.Message.Should().Be(AdministrationConnectorErrors.CONNECTOR_UNEXPECTED_NO_DESCRIPTION.ToString()); + var exception = await Assert.ThrowsAsync(Act); + exception.Message.Should().Be(AdministrationConnectorErrors.CONNECTOR_CONFLICT_NO_DESCRIPTION.ToString()); } [Fact]