public async Task Delete_WithUserId_RemovesUsers()
        {
            using WebApplicationFactory factory = new();
            TestableUsersClient usersClient = factory.Client;
            await usersClient.PostAsync(new Web.Api.User
            {
                Id        = 42,
                FirstName = "John",
                LastName  = "Smith"
            });

            HttpClient client = factory.CreateClient();

            var values = new Dictionary <string?, string?>
            {
                { nameof(UserViewModel.Id), "42" }
            };

            using FormUrlEncodedContent content = new(values);
            HttpResponseMessage response = await client.PostAsync("/users/delete", content);

            response.EnsureSuccessStatusCode();
            Assert.AreEqual(1, usersClient.DeleteInvocationCount);
            Assert.IsNull(await usersClient.GetAsync(42));
        }
        public async Task Create_WithValidModel_CreatesUser()
        {
            using WebApplicationFactory factory = new();
            TestableUsersClient usersClient = factory.Client;

            HttpClient client = factory.CreateClient();

            var values = new Dictionary <string?, string?>
            {
                { nameof(UserViewModel.Id), "42" },
                { nameof(UserViewModel.FirstName), "John" },
                { nameof(UserViewModel.LastName), "Smith" },
            };

            using FormUrlEncodedContent content = new(values);

            HttpResponseMessage response = await client.PostAsync("/users/create", content);

            response.EnsureSuccessStatusCode();
            Web.Api.User?createdUser = await usersClient.GetAsync(42);

            Assert.AreEqual(42, createdUser.Id);
            Assert.AreEqual("John", createdUser.FirstName);
            Assert.AreEqual("Smith", createdUser.LastName);
            Assert.AreEqual(1, usersClient.PostInvocationCount);
        }
        public async Task Edit_WithInvalidModel_DoesNotUpdateUser()
        {
            using WebApplicationFactory factory = new();
            TestableUsersClient usersClient = factory.Client;
            await usersClient.PostAsync(new Web.Api.User
            {
                Id        = 42,
                FirstName = "John",
                LastName  = "Smith"
            });

            HttpClient client = factory.CreateClient();

            var values = new Dictionary <string?, string?>
            {
                { nameof(UserViewModel.Id), "42" },
                { nameof(UserViewModel.FirstName), "" }
            };

            using FormUrlEncodedContent content = new(values);
            HttpResponseMessage response = await client.PostAsync("/users/edit", content);

            response.EnsureSuccessStatusCode();
            Assert.AreEqual(0, usersClient.PutInvocationCount);
        }
        public async Task Edit_WithUserId_RetrievesUser()
        {
            using WebApplicationFactory factory = new();
            TestableUsersClient usersClient = factory.Client;
            await usersClient.PostAsync(new Web.Api.User
            {
                Id        = 42,
                FirstName = "John",
                LastName  = "Smith"
            });

            HttpClient client = factory.CreateClient();

            HttpResponseMessage response = await client.GetAsync("/users/edit/42");

            response.EnsureSuccessStatusCode();
            Assert.AreEqual(1, usersClient.GetInvocationCount);
        }