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>()); }
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")); }
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>()); }
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>()); }
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); }