From 58986da4a5bfe519af44e5834edfbe8d4651b51c Mon Sep 17 00:00:00 2001 From: 杨宇千 Date: Fri, 9 Aug 2019 15:39:58 +0800 Subject: Add UserController unit tests. --- Timeline.Tests/UserUnitTest.cs | 187 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 179 insertions(+), 8 deletions(-) (limited to 'Timeline.Tests/UserUnitTest.cs') diff --git a/Timeline.Tests/UserUnitTest.cs b/Timeline.Tests/UserUnitTest.cs index 7935dd9a..c5c91d34 100644 --- a/Timeline.Tests/UserUnitTest.cs +++ b/Timeline.Tests/UserUnitTest.cs @@ -1,9 +1,10 @@ using Microsoft.AspNetCore.Mvc.Testing; -using Newtonsoft.Json; -using System.Linq; using System.Net; +using System.Net.Http; using System.Threading.Tasks; +using Timeline.Controllers; using Timeline.Models; +using Timeline.Models.Http; using Timeline.Tests.Helpers; using Timeline.Tests.Helpers.Authentication; using Timeline.Tests.Mock.Data; @@ -22,15 +23,185 @@ namespace Timeline.Tests } [Fact] - public async Task UserTest() + public async Task Get_Users_List() { using (var client = await _factory.CreateClientAsAdmin()) { - var res1 = await client.GetAsync("users"); - Assert.Equal(HttpStatusCode.OK, res1.StatusCode); - var users = JsonConvert.DeserializeObject(await res1.Content.ReadAsStringAsync()).ToList(); - users.Sort(UserInfoComparers.Comparer); - Assert.Equal(MockUsers.UserInfos, users, UserInfoComparers.EqualityComparer); + var res = await client.GetAsync("users"); + Assert.Equal(HttpStatusCode.OK, res.StatusCode); + + // Because tests are running asyncronized. So database may be modified and + // we can't check the exact user lists at this point. So only check the format. + + // var users = (await res.ReadBodyAsJson()).ToList(); + // users.Sort(UserInfoComparers.Comparer); + // Assert.Equal(MockUsers.UserInfos, users, UserInfoComparers.EqualityComparer); + await res.ReadBodyAsJson(); + } + } + + [Fact] + public async Task Get_Users_User() + { + using (var client = await _factory.CreateClientAsAdmin()) + { + var res = await client.GetAsync("users/" + MockUsers.UserUsername); + res.AssertOk(); + var user = await res.ReadBodyAsJson(); + Assert.Equal(MockUsers.UserUserInfo, user, UserInfoComparers.EqualityComparer); + } + } + + [Fact] + public async Task Get_Users_404() + { + using (var client = await _factory.CreateClientAsAdmin()) + { + var res = await client.GetAsync("users/usernotexist"); + res.AssertNotFound(); + var body = await res.ReadBodyAsJson(); + Assert.Equal(UserController.ErrorCodes.Get_NotExist, body.Code); + } + } + + [Fact] + public async Task Put_Patch_Delete_User() + { + using (var client = await _factory.CreateClientAsAdmin()) + { + const string username = "putpatchdeleteuser"; + const string password = "password"; + const string url = "users/" + username; + + // Put Invalid Model + await InvalidModelTestHelpers.TestPutInvalidModel(client, url, new UserPutRequest { Password = null, Administrator = false }); + await InvalidModelTestHelpers.TestPutInvalidModel(client, url, new UserPutRequest { Password = password, Administrator = null }); + + async Task CheckAdministrator(bool administrator) + { + var res = await client.GetAsync(url); + res.AssertOk(); + var body = await res.ReadBodyAsJson(); + Assert.Equal(administrator, body.Administrator); + } + + { + // Put Created. + var res = await client.PutAsJsonAsync(url, new UserPutRequest + { + Password = password, + Administrator = false + }); + await res.AssertIsPutCreated(); + await CheckAdministrator(false); + } + + { + // Put Modified. + var res = await client.PutAsJsonAsync(url, new UserPutRequest + { + Password = password, + Administrator = true + }); + await res.AssertIsPutModified(); + await CheckAdministrator(true); + } + + // Patch Not Exist + { + var res = await client.PatchAsJsonAsync("users/usernotexist", new UserPatchRequest { }); + res.AssertNotFound(); + var body = await res.ReadBodyAsJson(); + Assert.Equal(UserController.ErrorCodes.Patch_NotExist, body.Code); + } + + // Patch Success + { + var res = await client.PatchAsJsonAsync(url, new UserPatchRequest { Administrator = false }); + res.AssertOk(); + await CheckAdministrator(false); + } + + // Delete Deleted + { + var res = await client.DeleteAsync(url); + await res.AssertIsDeleteDeleted(); + + var res2 = await client.GetAsync(url); + res2.AssertNotFound(); + } + + // Delete Not Exist + { + var res = await client.DeleteAsync(url); + await res.AssertIsDeleteNotExist(); + } + } + } + + + public class ChangePasswordUnitTest : IClassFixture> + { + private const string url = "userop/changepassword"; + + private readonly WebApplicationFactory _factory; + + public ChangePasswordUnitTest(MyWebApplicationFactory factory, ITestOutputHelper outputHelper) + { + _factory = factory.WithTestLogging(outputHelper); + } + + + [Fact] + public async Task InvalidModel_OldPassword() + { + using (var client = await _factory.CreateClientAsUser()) + { + await InvalidModelTestHelpers.TestPostInvalidModel(client, url, new ChangePasswordRequest { OldPassword = null, NewPassword = "???" }); + } + } + + [Fact] + public async Task InvalidModel_NewPassword() + { + using (var client = await _factory.CreateClientAsUser()) + { + await InvalidModelTestHelpers.TestPostInvalidModel(client, url, new ChangePasswordRequest { OldPassword = "???", NewPassword = null }); + } + } + + [Fact] + public async Task BadOldPassword() + { + using (var client = await _factory.CreateClientAsUser()) + { + var res = await client.PostAsJsonAsync(url, new ChangePasswordRequest { OldPassword = "???", NewPassword = "???" }); + res.AssertBadRequest(); + var body = await res.ReadBodyAsJson(); + Assert.Equal(UserController.ErrorCodes.ChangePassword_BadOldPassword, body.Code); + } + } + + [Fact] + public async Task Success() + { + const string username = "changepasswordtest"; + const string password = "password"; + + // create a new user to avoid interference + using (var client = await _factory.CreateClientAsAdmin()) + { + var res = await client.PutAsJsonAsync("users/" + username, new UserPutRequest { Password = password, Administrator = false }); + Assert.Equal(HttpStatusCode.Created, res.StatusCode); + } + + using (var client = await _factory.CreateClientWithCredential(username, password)) + { + const string newPassword = "new"; + var res = await client.PostAsJsonAsync(url, new ChangePasswordRequest { OldPassword = password, NewPassword = newPassword }); + res.AssertOk(); + await client.CreateUserTokenAsync(username, newPassword); + } } } } -- cgit v1.2.3