public async Task Can_receive_event() { // Arrange var request = new AddSubscriptionRequest { Name = "foo" }; var addSubscription = await _client.PostAsJson(request, "hooks"); var addSubscriptionResponse = await addSubscription.Content.ReadAs <AddSubscriptionResponse>(); var eventName = "foo"; var messageId = Guid.NewGuid(); var json = "{ \"id\": 1 }"; var signature = PayloadSignature.CreateSignature(json, addSubscriptionResponse.Secret); var content = new StringContent(json, Encoding.UTF8, "application/json"); var postEventRequest = new HttpRequestMessage(HttpMethod.Post, addSubscription.Headers.Location) { Content = content }; SetCustomHeaders(postEventRequest, eventName, messageId, signature); // Act var response = await _client.SendAsync(postEventRequest); var streamMessage = (await _streamStore.ReadAllForwards(Position.Start, 10, true)) .Messages.Where(m => m.Type == eventName).SingleOrDefault(); // Assert response.StatusCode.ShouldBe(HttpStatusCode.OK); (await streamMessage.GetJsonData()).ShouldBe(json); streamMessage.MessageId.ShouldBe(messageId); }
public async Task DoesNotAppendEventWhenLastEventIsFromSameDay() { var now = new DateTime(2019, 12, 25, 12, 00, 00); var utcNow = now.ToUniversalTime(); var clockProviderStub = new ClockProviderStub(now); var inMemoryStreamStore = new InMemoryStreamStore(() => utcNow); var clockHasTicked = new ClockHasTicked(new DateTime(2019, 12, 25, 11, 00, 00)); var cancellationToken = CancellationToken.None; await inMemoryStreamStore.AppendToStream( streamId : new StreamId(ClockTickingService.ClockStreamId), expectedVersion : ExpectedVersion.Any, message : new NewStreamMessage( messageId: Guid.NewGuid(), type: _eventMapping.GetEventName(clockHasTicked.GetType()), jsonData: JsonConvert.SerializeObject(clockHasTicked)), cancellationToken : cancellationToken); var sut = new ClockTickingService(inMemoryStreamStore, clockProviderStub); await sut.StartAsync(cancellationToken); var forwards = await inMemoryStreamStore.ReadAllForwards(Position.Start, Int32.MaxValue, true, cancellationToken); forwards.Messages.Should().HaveCount(1); }
public async Task AppendsEventWhenStreamIsEmpty() { var now = new DateTime(2019, 12, 25, 12, 00, 00); var utcNow = now.ToUniversalTime(); var clockProviderStub = new ClockProviderStub(now); var inMemoryStreamStore = new InMemoryStreamStore(() => utcNow); var sut = new ClockTickingService(inMemoryStreamStore, clockProviderStub); var cancellationToken = CancellationToken.None; await sut.StartAsync(cancellationToken); var forwards = await inMemoryStreamStore.ReadAllForwards(Position.Start, Int32.MaxValue, true, cancellationToken); forwards.Messages.Should().HaveCount(1); var message = forwards.Messages[0]; message.StreamId.Should().Be(ClockTickingService.ClockStreamId); message.StreamVersion.Should().Be(StreamVersion.Start); var messageData = JsonConvert.DeserializeObject <ClockHasTicked>(await message.GetJsonData(cancellationToken)); messageData.DateTime.Should().Be(now); }
public async Task CanAppendToMultipleStreamsAndReadAllForward() { var streamStore = new InMemoryStreamStore(); var stream1 = new StreamId("test1"); var stream2 = new StreamId("test2"); var message1 = new NewStreamMessage(Guid.NewGuid(), "Test1", @"{ 'Hello': 'World1' }"); await streamStore.AppendToStream(stream1, ExpectedVersion.Any, message1); var message2 = new NewStreamMessage(Guid.NewGuid(), "Test2", @"{ 'Hello': 'World2' }"); await streamStore.AppendToStream(stream2, ExpectedVersion.Any, message2); var readStreamPage = await streamStore.ReadAllForwards(StreamVersion.Start, int.MaxValue, true); Assert.Equal(2, readStreamPage.Messages.Length); }
public async Task When_uploading_a_file_that_is_a_zip() { var client = new MemoryBlobClient(); var store = new InMemoryStreamStore(); var validator = new ZipArchiveValidator(Encoding.UTF8); var resolver = Resolve.WhenEqualToMessage( new RoadNetworkChangesArchiveCommandModule( client, store, new FakeRoadNetworkSnapshotReader(), validator, SystemClock.Instance ) ); var controller = new UploadController(Dispatch.Using(resolver), client) { ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext() } }; using (var sourceStream = new MemoryStream()) { using (var archive = new ZipArchive(sourceStream, ZipArchiveMode.Create, true, Encoding.UTF8)) { var entry = archive.CreateEntry("entry"); using (var entryStream = entry.Open()) { entryStream.Write(new byte[] { 1, 2, 3, 4 }); entryStream.Flush(); } } sourceStream.Position = 0; var formFile = new FormFile(sourceStream, 0L, sourceStream.Length, "name", "name") { Headers = new HeaderDictionary(new Dictionary <string, StringValues> { { "Content-Type", StringValues.Concat(StringValues.Empty, "application/zip") } }) }; var result = await controller.Post(formFile); Assert.IsType <OkResult>(result); var page = await store.ReadAllForwards(Position.Start, 1, true); var message = Assert.Single(page.Messages); Assert.Equal(nameof(Messages.RoadNetworkChangesArchiveUploaded), message.Type); var uploaded = JsonConvert.DeserializeObject <Messages.RoadNetworkChangesArchiveUploaded>( await message.GetJsonData()); Assert.True(await client.BlobExistsAsync(new BlobName(uploaded.ArchiveId))); var blob = await client.GetBlobAsync(new BlobName(uploaded.ArchiveId)); using (var openStream = await blob.OpenAsync()) { var resultStream = new MemoryStream(); openStream.CopyTo(resultStream); resultStream.Position = 0; sourceStream.Position = 0; Assert.Equal(sourceStream.ToArray(), resultStream.ToArray()); } } }