Пример #1
0
        public async Task CanSendStructuredCloudEvent_WithContentType()
        {
            using (var factory = new AppWebApplicationFactory())
            {
                var httpClient = factory.CreateClient();

                var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/register-user")
                {
                    Content = new StringContent(
                        JsonSerializer.Serialize(
                            new
                    {
                        data = new
                        {
                            name = "jimmy",
                        },
                        datacontenttype = "text/json",
                    }),
                        Encoding.UTF8)
                };
                request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/cloudevents+json");

                var response = await httpClient.SendAsync(request);

                response.EnsureSuccessStatusCode();

                var userInfo = await JsonSerializer.DeserializeAsync <UserInfo>(await response.Content.ReadAsStreamAsync(), this.options);

                userInfo.Name.Should().Be("jimmy");
            }
        }
        public async Task SubscribeEndpoint_ReportsTopics()
        {
            using (var factory = new AppWebApplicationFactory())
            {
                var httpClient = factory.CreateClient();

                var request  = new HttpRequestMessage(HttpMethod.Get, "http://localhost/dapr/subscribe");
                var response = await httpClient.SendAsync(request);

                response.EnsureSuccessStatusCode();

                using (var stream = await response.Content.ReadAsStreamAsync())
                {
                    var json = await JsonSerializer.DeserializeAsync <JsonElement>(stream);

                    json.ValueKind.Should().Be(JsonValueKind.Array);
                    json.GetArrayLength().Should().Be(3);
                    var topics = new List <string>();
                    var routes = new List <string>();
                    foreach (var element in json.EnumerateArray())
                    {
                        topics.Add(element.GetProperty("topic").GetString());
                        routes.Add(element.GetProperty("route").GetString());
                    }

                    topics.Should().Contain("A");
                    topics.Should().Contain("B");
                    topics.Should().Contain("register-user");

                    routes.Should().Contain("B");
                    routes.Should().Contain("topic-a");
                    routes.Should().Contain("register-user");
                }
            }
        }
Пример #3
0
        public async Task CanSendStructuredCloudEvent_WithNonJsonContentType()
        {
            using (var factory = new AppWebApplicationFactory())
            {
                var httpClient = factory.CreateClient();

                var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/register-user-plaintext")
                {
                    Content = new StringContent(
                        JsonSerializer.Serialize(
                            new
                    {
                        data            = "jimmy \"the cool guy\" smith",
                        datacontenttype = "text/plain",
                    }),
                        Encoding.UTF8)
                };
                request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/cloudevents+json");

                var response = await httpClient.SendAsync(request);

                response.EnsureSuccessStatusCode();

                var user = await response.Content.ReadAsStringAsync();

                user.Should().Be("jimmy \"the cool guy\" smith");
            }
        }
Пример #4
0
        public async Task SubscribeEndpoint_ReportsTopics()
        {
            using (var factory = new AppWebApplicationFactory())
            {
                var httpClient = factory.CreateClient();

                var request  = new HttpRequestMessage(HttpMethod.Get, "http://localhost/dapr/subscribe");
                var response = await httpClient.SendAsync(request);

                response.EnsureSuccessStatusCode();

                using (var stream = await response.Content.ReadAsStreamAsync())
                {
                    var json = await JsonSerializer.DeserializeAsync <JsonElement>(stream);

                    json.ValueKind.Should().Be(JsonValueKind.Array);
                    json.GetArrayLength().Should().Be(5);
                    var metadata = new List <(string PubsubName, string Topic, string Route)>();
                    foreach (var element in json.EnumerateArray())
                    {
                        var pubsubName = element.GetProperty("pubsubName").GetString();
                        var topic      = element.GetProperty("topic").GetString();
                        var route      = element.GetProperty("route").GetString();
                        metadata.Add((pubsubName, topic, route));
                    }

                    metadata.Should().Contain(("testpubsub", "A", "topic-a"));
                    metadata.Should().Contain(("pubsub", "B", "B"));
                    metadata.Should().Contain(("custom-pubsub", "custom-C", "C"));
                    metadata.Should().Contain(("pubsub", "register-user", "register-user"));
                    metadata.Should().Contain(("pubsub", "register-user-plaintext", "register-user-plaintext"));
                }
            }
        }
Пример #5
0
        public async Task ModelBinder_CanGetOutOfTheWayWhenTheresNoBinding()
        {
            using (var factory = new AppWebApplicationFactory())
            {
                var httpClient = factory.CreateClient();
                var daprClient = factory.DaprClient;

                var request  = new HttpRequestMessage(HttpMethod.Post, "http://localhost/echo-user?name=jimmy");
                var response = await httpClient.SendAsync(request);

                response.EnsureSuccessStatusCode();
            }
        }
        public async Task CanSendEmptyStructuredCloudEvent()
        {
            using (var factory = new AppWebApplicationFactory())
            {
                var httpClient = factory.CreateClient();

                var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/B");
                request.Content = new StringContent("{}", Encoding.UTF8);
                request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/cloudevents+json");

                var response = await httpClient.SendAsync(request);

                response.EnsureSuccessStatusCode();
            }
        }
Пример #7
0
        public async Task ModelBinder_GetFromStateEntryWithKeyNotInStateStore_ReturnsNull()
        {
            using (var factory = new AppWebApplicationFactory())
            {
                var httpClient = factory.CreateClient();
                var daprClient = factory.DaprClient;

                var request  = new HttpRequestMessage(HttpMethod.Get, "http://localhost/controllerwithoutstateentry/test");
                var response = await httpClient.SendAsync(request);

                response.EnsureSuccessStatusCode();
                var responseContent = await response.Content.ReadAsStringAsync();

                var responseWidget = JsonConvert.DeserializeObject <Widget>(responseContent);
                Assert.Null(responseWidget);
            }
        }
Пример #8
0
        public async Task CanSendEmptyFormURLEncodedPost()
        {
            using (var factory = new AppWebApplicationFactory())
            {
                var httpClient = factory.CreateClient();

                var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/formurlencoded")
                {
                    Content = new StringContent("", Encoding.UTF8)
                };
                request.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaTypeHeaderValue);

                var response = await httpClient.SendAsync(request);

                response.EnsureSuccessStatusCode();
            }
        }
Пример #9
0
        public async Task InvalidToken_ShouldBeUnauthorized()
        {
            using (var factory = new AppWebApplicationFactory())
            {
                var userInfo = new UserInfo
                {
                    Name = "jimmy"
                };
                var httpClient = factory.CreateClient();
                var request    = new HttpRequestMessage(HttpMethod.Post, "http://localhost/requires-api-token")
                {
                    Content = new StringContent(JsonConvert.SerializeObject(userInfo), Encoding.UTF8, "application/json")
                };
                request.Headers.Add("Dapr-Api-Token", "asdfgh");
                var response = await httpClient.SendAsync(request);

                response.StatusCode.Should().Be(HttpStatusCode.Unauthorized);
            }
        }
Пример #10
0
        public async Task StateClient_CanBindFromState()
        {
            using (var factory = new AppWebApplicationFactory())
            {
                var httpClient  = factory.CreateClient();
                var stateClient = factory.StateClient;

                await stateClient.SaveStateAsync("testStore", "test", new Widget()
                {
                    Size = "small", Count = 17,
                });

                var request  = new HttpRequestMessage(HttpMethod.Post, "http://localhost/routingwithstateentry/test");
                var response = await httpClient.SendAsync(request);

                response.EnsureSuccessStatusCode();

                var widget = await stateClient.GetStateAsync <Widget>("testStore", "test");

                widget.Count.Should().Be(18);
            }
        }
Пример #11
0
        public async Task ModelBinder_CanBindFromState_WithStateEntryAndCustomKey()
        {
            using (var factory = new AppWebApplicationFactory())
            {
                var httpClient = factory.CreateClient();
                var daprClient = factory.DaprClient;

                await daprClient.SaveStateAsync("testStore", "test", new Widget()
                {
                    Size = "small", Count = 17,
                });

                var request  = new HttpRequestMessage(HttpMethod.Post, "http://localhost/controllerwithstateentryandcustomkey/test");
                var response = await httpClient.SendAsync(request);

                response.EnsureSuccessStatusCode();

                var widget = await daprClient.GetStateAsync <Widget>("testStore", "test");

                widget.Count.Should().Be(18);
            }
        }
Пример #12
0
        public async Task CanSendVoiceRequestFromTwilio()
        {
            using (var factory = new AppWebApplicationFactory())
            {
                var httpClient = factory.CreateClient();

                var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/formurlencoded")
                {
                    Content = new StringContent(formURLEncodedContent, Encoding.UTF8)
                };
                request.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaTypeHeaderValue);

                var response = await httpClient.SendAsync(request);

                response.EnsureSuccessStatusCode();

                var widget = await JsonSerializer.DeserializeAsync <FormURLEncodingPayload>(await response.Content.ReadAsStreamAsync(), this.options);

                widget.FieldA.Should().Be("stringInfoA");
                widget.FieldB.Should().Be("stringInfoB");
                widget.FieldC.Should().Be("stringInfoC");
            }
        }
Пример #13
0
        public async Task ValidToken_ShouldBeAuthenticatedAndAuthorized()
        {
            using (var factory = new AppWebApplicationFactory())
            {
                var userInfo = new UserInfo
                {
                    Name = "jimmy"
                };
                var httpClient = factory.CreateClient();
                var request    = new HttpRequestMessage(HttpMethod.Post, "http://localhost/requires-api-token")
                {
                    Content = new StringContent(JsonConvert.SerializeObject(userInfo), Encoding.UTF8, "application/json")
                };
                request.Headers.Add("Dapr-Api-Token", "abcdefg");
                var response = await httpClient.SendAsync(request);

                response.EnsureSuccessStatusCode();
                var responseContent = await response.Content.ReadAsStringAsync();

                var responseUserInfo = JsonConvert.DeserializeObject <UserInfo>(responseContent);
                responseUserInfo.Name.Should().Be(userInfo.Name);
            }
        }
Пример #14
0
        public async Task ModelBinder_GetFromStateEntryWithKeyPresentInStateStore_ReturnsStateValue()
        {
            using (var factory = new AppWebApplicationFactory())
            {
                var httpClient = factory.CreateClient();
                var daprClient = factory.DaprClient;

                var widget = new Widget()
                {
                    Size = "small", Count = 17,
                };
                await daprClient.SaveStateAsync("testStore", "test", widget);

                var request  = new HttpRequestMessage(HttpMethod.Get, "http://localhost/controllerwithoutstateentry/test");
                var response = await httpClient.SendAsync(request);

                response.EnsureSuccessStatusCode();
                var responseContent = await response.Content.ReadAsStringAsync();

                var responseWidget = JsonConvert.DeserializeObject <Widget>(responseContent);
                responseWidget.Size.Should().Be(widget.Size);
                responseWidget.Count.Should().Be(widget.Count);
            }
        }
Пример #15
0
        public async Task SubscribeEndpoint_ReportsTopics()
        {
            using (var factory = new AppWebApplicationFactory())
            {
                var httpClient = factory.CreateClient();

                var request  = new HttpRequestMessage(HttpMethod.Get, "http://localhost/dapr/subscribe");
                var response = await httpClient.SendAsync(request);

                response.EnsureSuccessStatusCode();

                using (var stream = await response.Content.ReadAsStreamAsync())
                {
                    var json = await JsonSerializer.DeserializeAsync <JsonElement>(stream);

                    json.ValueKind.Should().Be(JsonValueKind.Array);
                    json.GetArrayLength().Should().Be(12);
                    var subscriptions = new List <(string PubsubName, string Topic, string Route, string rawPayload, string match)>();
                    foreach (var element in json.EnumerateArray())
                    {
                        var pubsubName = element.GetProperty("pubsubName").GetString();
                        var topic      = element.GetProperty("topic").GetString();
                        var rawPayload = string.Empty;
                        if (element.TryGetProperty("metadata", out JsonElement metadata))
                        {
                            rawPayload = metadata.GetProperty("rawPayload").GetString();
                        }

                        if (element.TryGetProperty("route", out JsonElement route))
                        {
                            subscriptions.Add((pubsubName, topic, route.GetString(), rawPayload, string.Empty));
                        }
                        else if (element.TryGetProperty("routes", out JsonElement routes))
                        {
                            if (routes.TryGetProperty("rules", out JsonElement rules))
                            {
                                foreach (var rule in rules.EnumerateArray())
                                {
                                    var match = rule.GetProperty("match").GetString();
                                    var path  = rule.GetProperty("path").GetString();
                                    subscriptions.Add((pubsubName, topic, path, rawPayload, match));
                                }
                            }
                            if (routes.TryGetProperty("default", out JsonElement defaultProperty))
                            {
                                subscriptions.Add((pubsubName, topic, defaultProperty.GetString(), rawPayload, string.Empty));
                            }
                        }
                    }

                    subscriptions.Should().Contain(("testpubsub", "A", "topic-a", string.Empty, string.Empty));
                    subscriptions.Should().Contain(("testpubsub", "A.1", "topic-a", string.Empty, string.Empty));
                    subscriptions.Should().Contain(("pubsub", "B", "B", string.Empty, string.Empty));
                    subscriptions.Should().Contain(("custom-pubsub", "custom-C", "C", string.Empty, string.Empty));
                    subscriptions.Should().Contain(("pubsub", "register-user", "register-user", string.Empty, string.Empty));
                    subscriptions.Should().Contain(("pubsub", "register-user-plaintext", "register-user-plaintext", string.Empty, string.Empty));
                    subscriptions.Should().Contain(("pubsub", "D", "D", "true", string.Empty));
                    subscriptions.Should().Contain(("pubsub", "E", "E", string.Empty, string.Empty));
                    subscriptions.Should().Contain(("pubsub", "E", "E-Critical", string.Empty, "event.type == \"critical\""));
                    subscriptions.Should().Contain(("pubsub", "E", "E-Important", string.Empty, "event.type == \"important\""));
                    subscriptions.Should().Contain(("pubsub", "F", "multiTopicAttr", string.Empty, string.Empty));
                    subscriptions.Should().Contain(("pubsub", "F.1", "multiTopicAttr", "true", string.Empty));
                    subscriptions.Should().Contain(("pubsub", "splitTopicBuilder", "splitTopics", string.Empty, string.Empty));
                    subscriptions.Should().Contain(("pubsub", "splitTopicAttr", "splitTopics", "true", string.Empty));

                    // Test priority route sorting
                    var eTopic = subscriptions.FindAll(e => e.Topic == "E");
                    eTopic.Count.Should().Be(3);
                    eTopic[0].Route.Should().Be("E-Critical");
                    eTopic[1].Route.Should().Be("E-Important");
                    eTopic[2].Route.Should().Be("E");
                }
            }
        }