public async Task PostToDoItem_CreatedANewToDoItemAsync()
        {
            var user = new ApiClient.User();

            using (var client = await ApiClient.CreateHttpClient(user, ApiVersion))
            {
                var todo = new ToDoItem
                {
                    Name       = "TODO 1",
                    IsComplete = false
                };
                var response = await client.PostAsJsonAsync("todos", todo);

                response.StatusCode.Should().Be(HttpStatusCode.Created);
                response.Headers.Location.Should().NotBeNull();

                var getResponse = await client.GetAsync(response.Headers.Location);

                getResponse.StatusCode.Should().Be(HttpStatusCode.OK);

                var savedToDo = await getResponse.Content.ReadAsAsync <ToDoItem>();

                savedToDo.ToDoId.Should().NotBeEmpty();
                savedToDo.Name.Should().Be("TODO 1");
                savedToDo.IsComplete.Should().Be(false);
            }
        }
        public async void DeleteToDoItem_DeletesToDoItem()
        {
            var user = new ApiClient.User();

            using (var client = await ApiClient.CreateHttpClient(user, ApiVersion))
            {
                var todo = new ToDoItem
                {
                    Name       = "TODO 1",
                    IsComplete = false
                };

                var response = await client.PostAsJsonAsync("todos", todo);

                response.StatusCode.Should().Be(HttpStatusCode.Created);
                response.Headers.Location.Should().NotBeNull();

                var initialGetResponse = await client.GetAsync(response.Headers.Location);

                initialGetResponse.StatusCode.Should().Be(HttpStatusCode.OK);

                var deleteResponse = await client.DeleteAsync(response.Headers.Location);

                deleteResponse.StatusCode.Should().Be(HttpStatusCode.NoContent);

                var afterDeleteGetResponse = await client.GetAsync(response.Headers.Location);

                afterDeleteGetResponse.StatusCode.Should().Be(HttpStatusCode.NotFound);
            }
        }
        public async void GetSchedules_RequiresApiVersion3(string apiVersion, HttpStatusCode expectedResult)
        {
            var user = new ApiClient.User();

            using (var client = await ApiClient.CreateHttpClient(user, apiVersion))
            {
                var response = await client.GetAsync("todos");

                response.StatusCode.Should().Be(expectedResult);
            }
        }
        public async void GetNonExistentToDo_ReturnsNotFound()
        {
            var user = new ApiClient.User();

            using (var client = await ApiClient.CreateHttpClient(user, ApiVersion))
            {
                var response = await client.GetAsync("todos/12345678-abcd-1234-abcd-1234567890ab");

                response.StatusCode.Should().Be(HttpStatusCode.NotFound);
            }
        }
        public async Task PublishMessageMinimal()
        {
            var user = new ApiClient.User();

            using (var client = await ApiClient.CreateHttpClient(user, "3"))
            {
                var response = await client.PostAsJsonAsync("messaging/publishmessageminimal", new OtherExampleFooCreatedV1 { Foo = "test content" });

                response.StatusCode.Should().Be(HttpStatusCode.OK);
            }
        }
        public async Task Info_MissingInternalScope()
        {
            var user = new ApiClient.User();

            using (var client = await ApiClient.CreateHttpClient(user))
            {
                var response = await client.GetAsync("_info");

                response.StatusCode.Should().Be(HttpStatusCode.Forbidden);
            }
        }
        public async Task Info_MissingClaims(string claimToRemove)
        {
            var user = new ApiClient.User();

            user.Claims.Remove(claimToRemove);

            using (var client = await ApiClient.CreateHttpClient(user))
            {
                var response = await client.GetAsync("_info");

                response.StatusCode.Should().Be(HttpStatusCode.Forbidden);
            }
        }
        public async Task Info_MissingScope()
        {
            var user = new ApiClient.User {
                Scopes = new [] { "unknown-scope" }
            };

            using (var client = await ApiClient.CreateHttpClient(user))
            {
                var response = await client.GetAsync("_info");

                response.StatusCode.Should().Be(HttpStatusCode.Forbidden);
            }
        }
        public async void GetTodos_ReturnsEmptyList()
        {
            var user = new ApiClient.User();

            using (var client = await ApiClient.CreateHttpClient(user, ApiVersion))
            {
                var response = await client.GetAsync("todos");

                response.StatusCode.Should().Be(HttpStatusCode.OK);

                var content = await response.Content.ReadAsAsync <ToDoItem[]>();

                content.Should().HaveCount(0);
            }
        }
        public async Task PublishMessage()
        {
            var user = new ApiClient.User();

            using (var client = await ApiClient.CreateHttpClient(user, "3"))
            {
                var response = await client.PostAsJsonAsync(
                    "messaging/publish",
                    new SendMessageRequest
                {
                    MessageContent = new OtherExampleFooCreatedV1 {
                        Foo = "test content"
                    },
                    InteractionGuid     = Guid.NewGuid(),
                    AdditionalDebugInfo = "test debug info",
                    NumberOfTimesToSend = 3
                });

                response.StatusCode.Should().Be(HttpStatusCode.OK);
            }
        }
        public async Task Info_Ok(string oidcIssuer)
        {
            var user = new ApiClient.User
            {
                OidcIssuer = oidcIssuer,
                Scopes     = new [] { "dotnetgrpcservice-api", "internal" }
            };

            using (var client = await ApiClient.CreateHttpClient(user))
            {
                var response = await client.GetAsync("_info");

                response.StatusCode.Should().Be(HttpStatusCode.OK);

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

                var jToken = JToken.Parse(content);
                jToken["version"].ToString().Should().NotBeNullOrEmpty();
                jToken["hostname"].ToString().Should().NotBeNullOrEmpty();
            }
        }