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);
        }
示例#4
0
        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());
                }
            }
        }