using FluentAssertions; using Microsoft.AspNetCore.Mvc.Testing; using System; using System.Net; using System.Threading.Tasks; using Timeline.Controllers; using Timeline.Models; using Timeline.Tests.Helpers; using Timeline.Tests.Helpers.Authentication; using Timeline.Tests.Mock.Data; using Xunit; namespace Timeline.Tests.IntegratedTests { public class UserDetailTest : IClassFixture>, IDisposable { private readonly TestApplication _testApp; private readonly WebApplicationFactory _factory; public UserDetailTest(WebApplicationFactory factory) { _testApp = new TestApplication(factory); _factory = _testApp.Factory; } public void Dispose() { _testApp.Dispose(); } [Fact] public async Task TestAsUser() { using (var client = await _factory.CreateClientAsUser()) { { var res = await client.GetAsync($"users/usernotexist/nickname"); res.Should().HaveStatusCode(404) .And.Should().HaveCommonBody().Which.Code.Should().Be(UserDetailController.ErrorCodes.GetNickname_UserNotExist); } { var res = await client.GetAsync($"users/usernotexist/details"); res.Should().HaveStatusCode(404) .And.Should().HaveCommonBody().Which.Code.Should().Be(UserDetailController.ErrorCodes.Get_UserNotExist); } async Task GetAndTest(UserDetail d) { var res = await client.GetAsync($"users/{MockUser.User.Username}/details"); res.Should().HaveStatusCode(200) .And.Should().HaveJsonBody() .Which.Should().BeEquivalentTo(d); } await GetAndTest(new UserDetail()); { var res = await client.PatchAsJsonAsync($"users/{MockUser.Admin.Username}/details", new UserDetail()); res.Should().HaveStatusCode(HttpStatusCode.Forbidden) .And.Should().HaveCommonBody().Which.Code.Should().Be(UserDetailController.ErrorCodes.Patch_Forbid); } { var res = await client.PatchAsJsonAsync($"users/{MockUser.User.Username}/details", new UserDetail { Nickname = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", QQ = "aaaaaaa", Email = "aaaaaa", PhoneNumber = "aaaaaaaa" }); var body = res.Should().HaveStatusCode(HttpStatusCode.BadRequest) .And.Should().HaveCommonBody().Which; body.Code.Should().Be(ErrorCodes.Http.Common.InvalidModel); foreach (var key in new string[] { "nickname", "qq", "email", "phonenumber" }) { body.Message.Should().ContainEquivalentOf(key); } } var detail = new UserDetail { Nickname = "aaa", QQ = "1234567", Email = "aaaa@aaa.net", Description = "aaaaaaaaa" }; { var res = await client.PatchAsJsonAsync($"users/{MockUser.User.Username}/details", detail); res.Should().HaveStatusCode(200); await GetAndTest(detail); } { var res = await client.GetAsync($"users/{MockUser.User.Username}/nickname"); res.Should().HaveStatusCode(200).And.Should().HaveJsonBody() .Which.Should().BeEquivalentTo(new UserDetail { Nickname = detail.Nickname }); } var detail2 = new UserDetail { QQ = "", PhoneNumber = "12345678910", Description = "bbbbbbbb" }; { var res = await client.PatchAsJsonAsync($"users/{MockUser.User.Username}/details", detail2); res.Should().HaveStatusCode(200); await GetAndTest(new UserDetail { Nickname = detail.Nickname, QQ = null, Email = detail.Email, PhoneNumber = detail2.PhoneNumber, Description = detail2.Description }); } } } [Fact] public async Task TestAsAdmin() { using (var client = await _factory.CreateClientAsAdmin()) { { var res = await client.PatchAsJsonAsync($"users/{MockUser.User.Username}/details", new UserDetail()); res.Should().HaveStatusCode(200); } { var res = await client.PatchAsJsonAsync($"users/usernotexist/details", new UserDetail()); res.Should().HaveStatusCode(404) .And.Should().HaveCommonBody().Which.Code.Should().Be(UserDetailController.ErrorCodes.Patch_UserNotExist); } } } } }