public async Task GetVenueUploadStatusUpdates_EmitsChangedStatus() { var uploadProcessor = new TriggerableVenueUploadStatusUpdatesFileUploadProcessor( SqlQueryDispatcherFactory, Clock, new RegionCache(SqlQueryDispatcherFactory), new ExecuteImmediatelyBackgroundWorkScheduler(Fixture.ServiceScopeFactory)); var provider = await TestData.CreateProvider(); var user = await TestData.CreateUser(providerId : provider.ProviderId); var(venueUpload, _) = await TestData.CreateVenueUpload(provider.ProviderId, user, UploadStatus.Created); var statusUpdates = uploadProcessor.GetVenueUploadStatusUpdatesForProvider(provider.ProviderId); var results = new List <UploadStatus>(); using var cts = new CancellationTokenSource(); // Act cts.CancelAfter(500); var completed = statusUpdates.ForEachAsync(v => results.Add(v), cts.Token); await uploadProcessor.ReleaseUploadStatusCheck(); // Created await UpdateStatusAndReleaseStatusCheck(uploadProcessor, venueUpload.VenueUploadId, UploadStatus.Processing, user); await UpdateStatusAndReleaseStatusCheck(uploadProcessor, venueUpload.VenueUploadId, UploadStatus.ProcessedSuccessfully, user); uploadProcessor.OnComplete(); await completed; // Assert results.Should().BeEquivalentTo(new[] { UploadStatus.Created, UploadStatus.Processing, UploadStatus.ProcessedSuccessfully }); }
public async Task GetVenueUploadStatusUpdates_EmitsInitialStatus() { // Arrange var uploadProcessor = new TriggerableVenueUploadStatusUpdatesFileUploadProcessor( SqlQueryDispatcherFactory, Clock, new RegionCache(SqlQueryDispatcherFactory), new ExecuteImmediatelyBackgroundWorkScheduler(Fixture.ServiceScopeFactory)); var provider = await TestData.CreateProvider(); var user = await TestData.CreateUser(providerId : provider.ProviderId); await TestData.CreateVenueUpload(provider.ProviderId, user, UploadStatus.Created); var statusUpdates = uploadProcessor.GetVenueUploadStatusUpdatesForProvider(provider.ProviderId); var results = new List <UploadStatus>(); using var cts = new CancellationTokenSource(); // Act cts.CancelAfter(500); var completed = statusUpdates.ForEachAsync(v => results.Add(v), cts.Token); await uploadProcessor.ReleaseUploadStatusCheck(); uploadProcessor.OnComplete(); await completed; // Assert results.First().Should().Be(UploadStatus.Created); }
public async Task MatchRowsToExistingVenues_MatchesOnName() { // Arrange var provider = await TestData.CreateProvider(); var user = await TestData.CreateUser(providerId : provider.ProviderId); var venue1 = await TestData.CreateVenue(provider.ProviderId, createdBy : user, venueName : "name", providerVenueRef : string.Empty); var rows = new[] { new CsvVenueRow() { VenueName = "NAME" } }.ToDataUploadRowCollection(); var existingVenues = new[] { venue1 }.Select(v => v.Adapt <VenueMatchInfo>()); var uploadProcessor = new TriggerableVenueUploadStatusUpdatesFileUploadProcessor( SqlQueryDispatcherFactory, Clock, new RegionCache(SqlQueryDispatcherFactory), new ExecuteImmediatelyBackgroundWorkScheduler(Fixture.ServiceScopeFactory)); // Act var result = uploadProcessor.MatchRowsToExistingVenues(rows, existingVenues); // Assert result[0].Should().Be(venue1.VenueId); }
private async Task UpdateStatusAndReleaseStatusCheck( TriggerableVenueUploadStatusUpdatesFileUploadProcessor uploadProcessor, Guid venueUploadId, UploadStatus uploadStatus, UserInfo user) { Clock.UtcNow += TimeSpan.FromMinutes(1); var updatedOn = Clock.UtcNow; if (uploadStatus == UploadStatus.Processing) { await WithSqlQueryDispatcher(dispatcher => dispatcher.ExecuteQuery(new SetVenueUploadProcessing() { VenueUploadId = venueUploadId, ProcessingStartedOn = updatedOn })); } else if (uploadStatus == UploadStatus.ProcessedSuccessfully) { await WithSqlQueryDispatcher(dispatcher => dispatcher.ExecuteQuery(new SetVenueUploadProcessed() { VenueUploadId = venueUploadId, ProcessingCompletedOn = updatedOn, IsValid = true })); } else if (uploadStatus == UploadStatus.ProcessedWithErrors) { await WithSqlQueryDispatcher(dispatcher => dispatcher.ExecuteQuery(new SetVenueUploadProcessed() { VenueUploadId = venueUploadId, ProcessingCompletedOn = updatedOn, IsValid = false })); } else if (uploadStatus == UploadStatus.Abandoned) { await WithSqlQueryDispatcher(dispatcher => dispatcher.ExecuteQuery(new SetVenueUploadAbandoned() { VenueUploadId = venueUploadId, AbandonedOn = updatedOn })); } else if (uploadStatus == UploadStatus.Published) { await WithSqlQueryDispatcher(dispatcher => dispatcher.ExecuteQuery(new PublishVenueUpload() { VenueUploadId = venueUploadId, PublishedBy = user, PublishedOn = updatedOn })); } else { throw new ArgumentException(); } await uploadProcessor.ReleaseUploadStatusCheck(); }
public async Task GetVenueUploadStatusUpdates_VenueUploadDoesNotExist_ReturnsArgumentException() { // Arrange var uploadProcessor = new TriggerableVenueUploadStatusUpdatesFileUploadProcessor( SqlQueryDispatcherFactory, Clock, new RegionCache(SqlQueryDispatcherFactory), new ExecuteImmediatelyBackgroundWorkScheduler(Fixture.ServiceScopeFactory)); var venueUploadId = Guid.NewGuid(); var statusUpdates = uploadProcessor.GetVenueUploadStatusUpdatesForProvider(venueUploadId); using var cts = new CancellationTokenSource(); // Act cts.CancelAfter(500); var completed = statusUpdates.ForEachAsync(v => { }, cts.Token); uploadProcessor.OnComplete(); var error = await Record.ExceptionAsync(() => completed); error.Should().BeOfType <InvalidStateException>().Subject.Reason.Should().Be(InvalidStateReason.NoUnpublishedVenueUpload); }