public void MerchantAggregate_AssignOperator_OperatorAlreadyAssigned_ErrorThrown() { MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); aggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber); Should.Throw <InvalidOperationException>(() => { aggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber); }); }
public async Task AssignOperatorToMerchant(Guid estateId, Guid merchantId, Guid operatorId, String merchantNumber, String terminalNumber, CancellationToken cancellationToken) { MerchantAggregate merchantAggregate = await this.MerchantAggregateRepository.GetLatestVersion(merchantId, cancellationToken); // Check merchant has been created if (merchantAggregate.IsCreated == false) { throw new InvalidOperationException($"Merchant Id {merchantId} has not been created"); } // Estate Id is a valid estate EstateAggregate estateAggregate = await this.EstateAggregateRepository.GetLatestVersion(estateId, cancellationToken); if (estateAggregate.IsCreated == false) { throw new InvalidOperationException($"Estate Id {estateId} has not been created"); } // Is the operator valid for this estate Estate estate = estateAggregate.GetEstate(); Operator @operator = estate.Operators?.SingleOrDefault(o => o.OperatorId == operatorId); if (@operator == null) { throw new InvalidOperationException($"Operator Id {operatorId} is not supported on Estate [{estate.Name}]"); } // Operator has been validated, now check the rules of the operator against the passed in data if (@operator.RequireCustomMerchantNumber) { // requested addition must have a merchant number supplied if (String.IsNullOrEmpty(merchantNumber)) { throw new InvalidOperationException($"Operator Id {operatorId} requires that a merchant number is provided"); } } if (@operator.RequireCustomTerminalNumber) { // requested addition must have a terminal number supplied if (String.IsNullOrEmpty(terminalNumber)) { throw new InvalidOperationException($"Operator Id {operatorId} requires that a terminal number is provided"); } } // Assign the operator merchantAggregate.AssignOperator(operatorId, @operator.Name, merchantNumber, terminalNumber); await this.MerchantAggregateRepository.SaveChanges(merchantAggregate, cancellationToken); }
public void MerchantAggregate_AssignOperator_OperatorIsAssigned() { MerchantAggregate aggregate = MerchantAggregate.Create(TestData.MerchantId); aggregate.Create(TestData.EstateId, TestData.MerchantName, TestData.DateMerchantCreated); aggregate.AssignOperator(TestData.OperatorId, TestData.OperatorName, TestData.OperatorMerchantNumber, TestData.OperatorTerminalNumber); Merchant merchantModel = aggregate.GetMerchant(); merchantModel.Operators.ShouldHaveSingleItem(); Models.Merchant.Operator operatorModel = merchantModel.Operators.Single(); operatorModel.OperatorId.ShouldBe(TestData.OperatorId); operatorModel.Name.ShouldBe(TestData.OperatorName); operatorModel.MerchantNumber.ShouldBe(TestData.OperatorMerchantNumber); operatorModel.TerminalNumber.ShouldBe(TestData.OperatorTerminalNumber); }