public async Task RunAsync(
            [ServiceBusTrigger(
                 "%" + Settings.MarketParticipantTopicNameKey + "%",
                 "%" + Settings.MarketParticipantSubscriptionNameKey + "%",
                 Connection = Settings.MarketParticipantConnectionStringKey)]
            byte[] message)
        {
            _logger.LogInformation("Begins processing MarketParticipantSyncFunction.");

            var integrationEvent = _sharedIntegrationEventParser.Parse(message);

            if (integrationEvent is ActorUpdatedIntegrationEvent actorUpdated)
            {
                if (actorUpdated.Status is ActorStatus.Active or ActorStatus.Passive &&
                    actorUpdated.ExternalActorId.HasValue)
                {
                    var command = new UpdateActorCommand(
                        actorUpdated.ActorId,
                        actorUpdated.ExternalActorId.Value);

                    await _mediator.Send(command).ConfigureAwait(false);
                }
                else
                {
                    var command = new DeleteActorCommand(actorUpdated.ActorId);
                    await _mediator.Send(command).ConfigureAwait(false);
                }
            }
Example #2
0
    public async Task DeleteActorCommand_HasActor_DeletesActor()
    {
        // Arrange
        await using var host = await OperationsIntegrationHost
                               .InitializeAsync()
                               .ConfigureAwait(false);

        await using var scope = host.BeginScope();
        var mediator = scope.GetInstance <IMediator>();

        var actorId    = Guid.NewGuid();
        var externalId = Guid.NewGuid();

        var initialCommand = new UpdateActorCommand(actorId, externalId);
        await mediator.Send(initialCommand).ConfigureAwait(false);

        var command = new DeleteActorCommand(actorId);

        // Act
        await mediator.Send(command).ConfigureAwait(false);

        // Assert
        var actorRepository = scope.GetInstance <IActorRepository>();

        var actualUsingId = await actorRepository.GetActorAsync(new ActorId(actorId)).ConfigureAwait(false);

        Assert.Null(actualUsingId);

        var actualUsingExternalId = await actorRepository.GetActorAsync(new ExternalActorId(externalId)).ConfigureAwait(false);

        Assert.Null(actualUsingExternalId);
    }
    public async Task Validate_ValidActorId_ValidatesProperty()
    {
        // Arrange
        const string propertyName = nameof(DeleteActorCommand.ActorId);

        var target  = new DeleteActorCommandRuleSet();
        var command = new DeleteActorCommand(Guid.NewGuid());

        // Act
        var result = await target.ValidateAsync(command).ConfigureAwait(false);

        // Assert
        Assert.True(result.IsValid);
        Assert.DoesNotContain(propertyName, result.Errors.Select(x => x.PropertyName));
    }
Example #4
0
    public async Task DeleteActorCommand_NoActor_DoesNothing()
    {
        // Arrange
        await using var host = await OperationsIntegrationHost
                               .InitializeAsync()
                               .ConfigureAwait(false);

        await using var scope = host.BeginScope();
        var mediator = scope.GetInstance <IMediator>();

        var actorId = Guid.NewGuid();
        var command = new DeleteActorCommand(actorId);

        // Act + Assert
        await mediator.Send(command).ConfigureAwait(false);
    }
Example #5
0
    public async Task DeleteActorCommandHandle_WithoutActor_DoesNothing()
    {
        // Arrange
        var repository = new Mock <IActorRepository>();
        var target     = new ActorUpdatedHandler(repository.Object, new Mock <ILogger>().Object);

        var actorId = new ActorId(Guid.NewGuid());

        repository
        .Setup(r => r.GetActorAsync(It.Is <ActorId>(id => id == actorId)))
        .ReturnsAsync((Actor?)null);

        var deleteActorCommand = new DeleteActorCommand(Guid.Parse(actorId.Value));

        // Act + Assert
        await target.Handle(deleteActorCommand, CancellationToken.None).ConfigureAwait(false);
    }
Example #6
0
    public async Task DeleteActorCommand_InvalidCommand_ThrowsException()
    {
        // Arrange
        await using var host = await OperationsIntegrationHost
                               .InitializeAsync()
                               .ConfigureAwait(false);

        await using var scope = host.BeginScope();
        var mediator = scope.GetInstance <IMediator>();

        var command = new DeleteActorCommand(Guid.Empty);

        // Act + Assert
        await Assert
        .ThrowsAsync <ValidationException>(() => mediator.Send(command))
        .ConfigureAwait(false);
    }
    public async Task <Unit> Handle(DeleteActorCommand request, CancellationToken cancellationToken)
    {
        ArgumentNullException.ThrowIfNull(request, nameof(request));

        _logger.LogInformation("Delete actor with ActorId: {ActorId}.", request.ActorId);

        var actorId = new ActorId(request.ActorId);

        var actor = await _actorRepository.GetActorAsync(actorId).ConfigureAwait(false);

        if (actor != null)
        {
            await _actorRepository.DeleteAsync(actor).ConfigureAwait(false);
        }

        return(Unit.Value);
    }
Example #8
0
    public async Task DeleteActorCommandHandle_WithActor_DeletesActor()
    {
        // Arrange
        var repository = new Mock <IActorRepository>();
        var target     = new ActorUpdatedHandler(repository.Object, new Mock <ILogger>().Object);

        var actorId    = new ActorId(Guid.NewGuid());
        var externalId = new ExternalActorId(Guid.NewGuid());
        var actor      = new Actor(actorId, externalId);

        repository
        .Setup(r => r.GetActorAsync(It.Is <ActorId>(id => id == actorId)))
        .ReturnsAsync(actor);

        var deleteActorCommand = new DeleteActorCommand(Guid.Parse(actorId.Value));

        // Act
        await target.Handle(deleteActorCommand, CancellationToken.None).ConfigureAwait(false);

        // Assert
        repository.Verify(r => r.DeleteAsync(actor), Times.Once);
    }