public async Task Given_messages_on_reduced_queue__When_reducer_is_invoked__Then_reduced_objects_are_retrieved()
        {
            // Arrange
            var config = new ConfigBuiler().Build();

            var queueClientMock = new QueueClientMockBuilder()
                                  .WithMessage(config.ReducedQueueName, $"{config.ReducedFolder}/reducedobject1")
                                  .WithMessage(config.ReducedQueueName, $"{config.ReducedFolder}/reducedobject2")
                                  .Build();

            var commandDispatcher = Substitute.For <ICommandDispatcher>();

            commandDispatcher.DispatchAsync(Arg.Any <RetrieveObjectCommand>())
            .ReturnsCommandResult(StreamHelper.NewEmptyStream);

            var reducer = ReducerFactory(config: config, queueClient: queueClientMock,
                                         commandDispatcher: commandDispatcher);

            // Act
            await reducer.InvokeAsync();

            // Assert
            await commandDispatcher.Received()
            .DispatchAsync(Arg.Is <RetrieveObjectCommand>(x =>
                                                          x.Key == $"{config.ReducedFolder}/reducedobject1"));

            await commandDispatcher.Received()
            .DispatchAsync(Arg.Is <RetrieveObjectCommand>(x =>
                                                          x.Key == $"{config.ReducedFolder}/reducedobject2"));
        }
        public async Task Given_a_message_on_mapped_and_reduced_queues__When_reducer_is_invoked__Then_both_messages_are_marked_processed()
        {
            // Arrange
            var config = new ConfigBuiler().Build();

            var queueClientMock = new QueueClientMockBuilder()
                                  .WithRandomMessages(config.MappedQueueName, 1)
                                  .WithRandomMessages(config.ReducedQueueName, 1)
                                  .Build();

            var commandDispatcher = Substitute.For <ICommandDispatcher>();

            commandDispatcher.DispatchAsync(Arg.Any <RetrieveObjectCommand>())
            .ReturnsCommandResult(StreamHelper.NewEmptyStream);

            var reducer = ReducerFactory(config: config, queueClient: queueClientMock, commandDispatcher: commandDispatcher);

            // Act
            await reducer.InvokeAsync();

            // Assert
            await queueClientMock.Received(1).MessageProcessed(Arg.Is(config.MappedQueueName), Arg.Any <string>());

            await queueClientMock.Received(1).MessageProcessed(Arg.Is(config.ReducedQueueName), Arg.Any <string>());
        }
Beispiel #3
0
        public async Task Given_no_messages_on_the_ingested_queue__When_mapper_is_invoked__Then_has_termined_is_recorded()
        {
            var config = new ConfigBuiler().Build();

            var queueClientMock = new QueueClientMockBuilder()
                                  .WithRandomMessages(config.IngestedQueueName, 0)
                                  .Build();

            var commandDispatcher = Substitute.For <ICommandDispatcher>();

            commandDispatcher.DispatchAsync(Arg.Any <RetrieveObjectCommand>())
            .ReturnsCommandResult(StreamHelper.NewEmptyStream());

            var workerRecordStoreServiceMock = Substitute.For <IWorkerRecordStoreService>();

            workerRecordStoreServiceMock.GenerateUniqueId().Returns("abc123");

            var mapper = MapperFactory(config: config, queueClient: queueClientMock, commandDispatcher: commandDispatcher, workerRecordStoreService: workerRecordStoreServiceMock);

            // Act
            await mapper.InvokeAsync();

            // Assert
            await workerRecordStoreServiceMock.Received().RecordHasTerminated(Arg.Is("mapper"), Arg.Is("abc123"));
        }
Beispiel #4
0
        public async Task Given_there_are_no_workers_running_and_there_is_one_item_in_the_reduced_queue__When_worker_manager_is_run__Then_the_final_reduver_is_invoked()
        {
            // Arrange
            var commandDispatcherMock = Substitute.For <ICommandDispatcher>();

            var configMock = new ConfigBuiler()
                             .With(reducedQueueName: "reducedQ")
                             .Build();

            var queueClientMock = new QueueClientMockBuilder()
                                  .WithRandomMessages(configMock.ReducedQueueName, 1)
                                  .Build();

            var workerRecordStoreServiceMock = new WorkerRecordStoreServiceMockBuilder()
                                               .Build();

            var workerManager = WorkerManagerFactory(
                commandDispatcher: commandDispatcherMock,
                config: configMock,
                queueClient: queueClientMock,
                workerRecordStoreService: workerRecordStoreServiceMock);

            // Act
            await workerManager.InvokeAsync();

            // Assert
            await commandDispatcherMock.Received().DispatchAsync(Arg.Any <FinalReducerCommand>());
        }
Beispiel #5
0
        public async Task Given_something_in_ingested_queue_and_a_mapper_has_stopped_responding__When_worker_manager_is_run__Then_a_mapper_is_invoked()
        {
            // Arrange
            var commandDispatcherMock = Substitute.For <ICommandDispatcher>();

            var configMock = new ConfigBuiler().Build();

            var queueClientMock = new QueueClientMockBuilder()
                                  .WithRandomMessages(configMock.IngestedQueueName, 1)
                                  .Build();

            var timeMock = Substitute.For <ITime>();

            timeMock.UtcNow.Returns(DateTime.Parse("2018-02-27 12:00"));

            var workerRecordStoreServiceMock = new WorkerRecordStoreServiceMockBuilder()
                                               .WithWorkerRecord("mapper", DateTime.Parse("2018-02-27 11:59"))
                                               .Build();

            var workerManager = WorkerManagerFactory(
                commandDispatcher: commandDispatcherMock,
                config: configMock,
                queueClient: queueClientMock,
                workerRecordStoreService: workerRecordStoreServiceMock,
                time: timeMock);

            // Act
            await workerManager.InvokeAsync();

            // Assert
            await commandDispatcherMock.Received().DispatchAsync(Arg.Any <MapperCommand>());
        }
Beispiel #6
0
        public async Task Given_there_are_x_message_on_the_ingested_queue_and_y_running_mappers__When_worker_manager_is_run__Then_z_new_mappers_are_invoked(
            int inputQueueItemsPerRunningWorker,
            int inputNoOfMessages,
            int inputNoOfRunningIngesters,
            int outputExpectedNewIngestersInvoked)
        {
            // Arrange
            var commandDispatcherMock = Substitute.For <ICommandDispatcher>();

            var configMock = new ConfigBuiler()
                             .With(
                ingestedQueueName: "ingestedQ",
                queueItemsPerRunningWorker: inputQueueItemsPerRunningWorker)
                             .Build();

            var timeMock = Substitute.For <ITime>();

            timeMock.UtcNow.Returns(DateTime.Parse("2000-01-01 12:00"));

            var queueClientMock = new QueueClientMockBuilder()
                                  .WithRandomMessages(configMock.IngestedQueueName, inputNoOfMessages)
                                  .Build();

            var workerRecordStoreServiceMock = new WorkerRecordStoreServiceMockBuilder()
                                               .WithWorkerRecords(inputNoOfRunningIngesters, "mapper", timeMock.UtcNow)
                                               .Build();

            var workerManager = WorkerManagerFactory(
                commandDispatcher: commandDispatcherMock,
                config: configMock,
                queueClient: queueClientMock,
                workerRecordStoreService: workerRecordStoreServiceMock,
                time: timeMock);

            // Act
            await workerManager.InvokeAsync();

            // Assert
            await commandDispatcherMock.Received(outputExpectedNewIngestersInvoked)
            .DispatchAsync(Arg.Any <MapperCommand>());
        }
        public async Task Given_0_messages_on_mapped_0_on_reduced_queues__When_reducer_is_invoked__Then_no_work_is_done()
        {
            // Arrange
            var config = new ConfigBuiler().Build();

            var queueClientMock = new QueueClientMockBuilder()
                                  .WithRandomMessages(config.MappedQueueName, 0)
                                  .WithRandomMessages(config.ReducedQueueName, 0)
                                  .Build();

            var commandDispatcher = Substitute.For <ICommandDispatcher>();

            commandDispatcher.DispatchAsync(Arg.Any <RetrieveObjectCommand>())
            .ReturnsCommandResult(StreamHelper.NewEmptyStream);

            var reducer = ReducerFactory(config: config, queueClient: queueClientMock, commandDispatcher: commandDispatcher);

            // Act
            await reducer.InvokeAsync();

            // Assert
            await commandDispatcher.DidNotReceiveWithAnyArgs().DispatchAsync(null);
        }