From 1b93136e14bb20d908a9b41d9307004e1fc7552a Mon Sep 17 00:00:00 2001 From: crupest Date: Fri, 8 Apr 2022 20:44:39 +0800 Subject: ... --- .../IntegratedTests2/TimelinePatchAndDeleteTest.cs | 109 --------------------- .../IntegratedTests2/TimelineTest2.cs | 109 +++++++++++++++++++++ .../IntegratedTests2/TimelineTest3.cs | 92 +++++++++++++++++ .../Timeline/Controllers/TimelineV2Controller.cs | 21 +++- 4 files changed, 220 insertions(+), 111 deletions(-) delete mode 100644 BackEnd/Timeline.Tests/IntegratedTests2/TimelinePatchAndDeleteTest.cs create mode 100644 BackEnd/Timeline.Tests/IntegratedTests2/TimelineTest2.cs create mode 100644 BackEnd/Timeline.Tests/IntegratedTests2/TimelineTest3.cs diff --git a/BackEnd/Timeline.Tests/IntegratedTests2/TimelinePatchAndDeleteTest.cs b/BackEnd/Timeline.Tests/IntegratedTests2/TimelinePatchAndDeleteTest.cs deleted file mode 100644 index 85308490..00000000 --- a/BackEnd/Timeline.Tests/IntegratedTests2/TimelinePatchAndDeleteTest.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System; -using System.Net; -using System.Net.Http; -using System.Threading.Tasks; -using FluentAssertions; -using Timeline.Models; -using Timeline.Models.Http; -using Xunit; -using Xunit.Abstractions; - -namespace Timeline.Tests.IntegratedTests2 -{ - public class TimelinePatchAndDeleteTest : IntegratedTestBase - { - - public TimelinePatchAndDeleteTest(ITestOutputHelper testOutput) : base(testOutput) - { - } - - protected override async Task OnInitializeAsync() - { - using var client = CreateClientAsUser(); - await client.TestJsonSendAsync(HttpMethod.Post, "v2/timelines", new HttpTimelineCreateRequest - { - Name = "hello" - }, expectedStatusCode: HttpStatusCode.Created); - } - - [Fact] - public async Task PatchTest() - { - using var client = CreateClientAsUser(); - var b = await client.TestJsonSendAsync(HttpMethod.Patch, "v2/timelines/user/hello", new HttpTimelinePatchRequest - { - Name = "hello2", - Title = "Hello", - Description = "A Description.", - Visibility = TimelineVisibility.Public, - Color = "#FFFFFF" - }); - - b.Name.Should().Be("hello2"); - b.Title.Should().Be("Hello"); - b.Description.Should().Be("A Description."); - b.Visibility.Should().Be(TimelineVisibility.Public); - b.Color.Should().Be("#FFFFFF"); - } - - [Fact] - public async Task PatchNotExist() - { - using var client = CreateClientAsUser(); - await client.TestJsonSendAsync(HttpMethod.Patch, "v2/timelines/user/notexist", new HttpTimelinePatchRequest(), - expectedStatusCode: HttpStatusCode.NotFound); - await client.TestJsonSendAsync(HttpMethod.Patch, "v2/timelines/notexist/notexist", new HttpTimelinePatchRequest(), - expectedStatusCode: HttpStatusCode.NotFound); - } - - [Fact] - public async Task PatchNotLogin() - { - using var client = CreateDefaultClient(); - await client.TestJsonSendAsync(HttpMethod.Patch, "v2/timelines/user/hello", new HttpTimelinePatchRequest(), - expectedStatusCode: HttpStatusCode.Unauthorized); - } - - [Fact] - public async Task PatchForbid() - { - await CreateUserAsync("user2", "user2pw"); - using var client = CreateClientWithToken(await CreateTokenWithCredentialAsync("user2", "user2pw")); - await client.TestJsonSendAsync(HttpMethod.Patch, "v2/timelines/user/hello", new HttpTimelinePatchRequest(), - expectedStatusCode: HttpStatusCode.Forbidden); - } - - [Fact] - public async Task DeleteTest() - { - using var client = CreateClientAsUser(); - await client.TestSendAsync(HttpMethod.Delete, "v2/timelines/user/hello", expectedStatusCode: HttpStatusCode.NoContent); - await client.TestSendAsync(HttpMethod.Get, "v2/timelines/user/hello", expectedStatusCode: HttpStatusCode.NotFound); - } - - [Fact] - public async Task DeleteNotExist() - { - using var client = CreateClientAsUser(); - await client.TestSendAsync(HttpMethod.Delete, "v2/timelines/user/notexist", expectedStatusCode: HttpStatusCode.NotFound); - await client.TestSendAsync(HttpMethod.Delete, "v2/timelines/notexist/notexist", expectedStatusCode: HttpStatusCode.NotFound); - } - - [Fact] - public async Task DeleteNotLogin() - { - using var client = CreateDefaultClient(); - await client.TestSendAsync(HttpMethod.Delete, "v2/timelines/user/hello", expectedStatusCode: HttpStatusCode.Unauthorized); - } - - [Fact] - public async Task DeleteForbid() - { - await CreateUserAsync("user2", "user2pw"); - using var client = CreateClientWithToken(await CreateTokenWithCredentialAsync("user2", "user2pw")); - await client.TestSendAsync(HttpMethod.Delete, "v2/timelines/user/hello", - expectedStatusCode: HttpStatusCode.Forbidden); - } - } -} - diff --git a/BackEnd/Timeline.Tests/IntegratedTests2/TimelineTest2.cs b/BackEnd/Timeline.Tests/IntegratedTests2/TimelineTest2.cs new file mode 100644 index 00000000..c3a19bbb --- /dev/null +++ b/BackEnd/Timeline.Tests/IntegratedTests2/TimelineTest2.cs @@ -0,0 +1,109 @@ +using System; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using FluentAssertions; +using Timeline.Models; +using Timeline.Models.Http; +using Xunit; +using Xunit.Abstractions; + +namespace Timeline.Tests.IntegratedTests2 +{ + public class TimelineTest2 : IntegratedTestBase + { + + public TimelineTest2(ITestOutputHelper testOutput) : base(testOutput) + { + } + + protected override async Task OnInitializeAsync() + { + using var client = CreateClientAsUser(); + await client.TestJsonSendAsync(HttpMethod.Post, "v2/timelines", new HttpTimelineCreateRequest + { + Name = "hello" + }, expectedStatusCode: HttpStatusCode.Created); + } + + [Fact] + public async Task PatchTest() + { + using var client = CreateClientAsUser(); + var b = await client.TestJsonSendAsync(HttpMethod.Patch, "v2/timelines/user/hello", new HttpTimelinePatchRequest + { + Name = "hello2", + Title = "Hello", + Description = "A Description.", + Visibility = TimelineVisibility.Public, + Color = "#FFFFFF" + }); + + b.Name.Should().Be("hello2"); + b.Title.Should().Be("Hello"); + b.Description.Should().Be("A Description."); + b.Visibility.Should().Be(TimelineVisibility.Public); + b.Color.Should().Be("#FFFFFF"); + } + + [Fact] + public async Task PatchNotExist() + { + using var client = CreateClientAsUser(); + await client.TestJsonSendAsync(HttpMethod.Patch, "v2/timelines/user/notexist", new HttpTimelinePatchRequest(), + expectedStatusCode: HttpStatusCode.NotFound); + await client.TestJsonSendAsync(HttpMethod.Patch, "v2/timelines/notexist/notexist", new HttpTimelinePatchRequest(), + expectedStatusCode: HttpStatusCode.NotFound); + } + + [Fact] + public async Task PatchNotLogin() + { + using var client = CreateDefaultClient(); + await client.TestJsonSendAsync(HttpMethod.Patch, "v2/timelines/user/hello", new HttpTimelinePatchRequest(), + expectedStatusCode: HttpStatusCode.Unauthorized); + } + + [Fact] + public async Task PatchForbid() + { + await CreateUserAsync("user2", "user2pw"); + using var client = CreateClientWithToken(await CreateTokenWithCredentialAsync("user2", "user2pw")); + await client.TestJsonSendAsync(HttpMethod.Patch, "v2/timelines/user/hello", new HttpTimelinePatchRequest(), + expectedStatusCode: HttpStatusCode.Forbidden); + } + + [Fact] + public async Task DeleteTest() + { + using var client = CreateClientAsUser(); + await client.TestSendAsync(HttpMethod.Delete, "v2/timelines/user/hello", expectedStatusCode: HttpStatusCode.NoContent); + await client.TestSendAsync(HttpMethod.Get, "v2/timelines/user/hello", expectedStatusCode: HttpStatusCode.NotFound); + } + + [Fact] + public async Task DeleteNotExist() + { + using var client = CreateClientAsUser(); + await client.TestSendAsync(HttpMethod.Delete, "v2/timelines/user/notexist", expectedStatusCode: HttpStatusCode.NotFound); + await client.TestSendAsync(HttpMethod.Delete, "v2/timelines/notexist/notexist", expectedStatusCode: HttpStatusCode.NotFound); + } + + [Fact] + public async Task DeleteNotLogin() + { + using var client = CreateDefaultClient(); + await client.TestSendAsync(HttpMethod.Delete, "v2/timelines/user/hello", expectedStatusCode: HttpStatusCode.Unauthorized); + } + + [Fact] + public async Task DeleteForbid() + { + await CreateUserAsync("user2", "user2pw"); + using var client = CreateClientWithToken(await CreateTokenWithCredentialAsync("user2", "user2pw")); + await client.TestSendAsync(HttpMethod.Delete, "v2/timelines/user/hello", + expectedStatusCode: HttpStatusCode.Forbidden); + } + } +} + diff --git a/BackEnd/Timeline.Tests/IntegratedTests2/TimelineTest3.cs b/BackEnd/Timeline.Tests/IntegratedTests2/TimelineTest3.cs new file mode 100644 index 00000000..05e01f95 --- /dev/null +++ b/BackEnd/Timeline.Tests/IntegratedTests2/TimelineTest3.cs @@ -0,0 +1,92 @@ +using System; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using FluentAssertions; +using Timeline.Models; +using Timeline.Models.Http; +using Xunit; +using Xunit.Abstractions; + +namespace Timeline.Tests.IntegratedTests2 +{ + public class TimelineTest3 : IntegratedTestBase + { + + public TimelineTest3(ITestOutputHelper testOutput) : base(testOutput) + { + } + + protected override async Task OnInitializeAsync() + { + using var client = CreateClientAsUser(); + await client.TestJsonSendAsync(HttpMethod.Post, "v2/timelines", new HttpTimelineCreateRequest + { + Name = "hello" + }, expectedStatusCode: HttpStatusCode.Created); + } + + [Fact] + public async Task MemberTest() + { + using var client = CreateClientAsUser(); + await client.TestSendAsync(HttpMethod.Put, "v2/timelines/user/hello/members/admin", expectedStatusCode: HttpStatusCode.NoContent); + + var t = await client.TestJsonSendAsync(HttpMethod.Get, "v2/timelines/user/hello"); + t.Members.Should().ContainSingle().Which.Username.Should().Be("admin"); + + await client.TestSendAsync(HttpMethod.Delete, "v2/timelines/user/hello/members/admin", expectedStatusCode: HttpStatusCode.NoContent); + + var b = await client.TestJsonSendAsync(HttpMethod.Get, "v2/timelines/user/hello"); + b.Members.Should().BeEmpty(); + } + + [Fact] + public async Task MemberPutNotExist() + { + using var client = CreateClientAsUser(); + await client.TestSendAsync(HttpMethod.Put, "v2/timelines/user/notexist/members/admin", + expectedStatusCode: HttpStatusCode.NotFound); + await client.TestSendAsync(HttpMethod.Put, "v2/timelines/notexist/notexist/members/admin", + expectedStatusCode: HttpStatusCode.NotFound); + } + + [Fact] + public async Task MemberDeleteNotExist() + { + using var client = CreateClientAsUser(); + await client.TestSendAsync(HttpMethod.Delete, "v2/timelines/user/notexist/members/admin", + expectedStatusCode: HttpStatusCode.NotFound); + await client.TestSendAsync(HttpMethod.Delete, "v2/timelines/notexist/notexist/members/admin", + expectedStatusCode: HttpStatusCode.NotFound); + } + + [Fact] + public async Task MemberModifyUserNotExist() + { + using var client = CreateClientAsUser(); + await client.TestSendAsync(HttpMethod.Put, "v2/timelines/user/hello/members/notexist", + expectedStatusCode: HttpStatusCode.UnprocessableEntity); + await client.TestSendAsync(HttpMethod.Delete, "v2/timelines/user/hello/members/notexist", + expectedStatusCode: HttpStatusCode.UnprocessableEntity); + } + + [Fact] + public async Task MemberNotLogin() + { + using var client = CreateDefaultClient(); + await client.TestSendAsync(HttpMethod.Put, "v2/timelines/user/hello/members/admin", expectedStatusCode: HttpStatusCode.Unauthorized); + await client.TestSendAsync(HttpMethod.Delete, "v2/timelines/user/hello/members/admin", expectedStatusCode: HttpStatusCode.Unauthorized); + } + + [Fact] + public async Task MemberForbid() + { + await CreateUserAsync("user2", "user2pw"); + using var client = CreateClientWithToken(await CreateTokenWithCredentialAsync("user2", "user2pw")); + await client.TestSendAsync(HttpMethod.Put, "v2/timelines/user/hello/members/admin", expectedStatusCode: HttpStatusCode.Forbidden); + await client.TestSendAsync(HttpMethod.Delete, "v2/timelines/user/hello/members/admin", expectedStatusCode: HttpStatusCode.Forbidden); + } + } +} + diff --git a/BackEnd/Timeline/Controllers/TimelineV2Controller.cs b/BackEnd/Timeline/Controllers/TimelineV2Controller.cs index 63beb357..9811cbed 100644 --- a/BackEnd/Timeline/Controllers/TimelineV2Controller.cs +++ b/BackEnd/Timeline/Controllers/TimelineV2Controller.cs @@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Mvc; using Timeline.Entities; using Timeline.Models.Http; using Timeline.Models.Validation; +using Timeline.Services; using Timeline.Services.Mapper; using Timeline.Services.Timeline; using Timeline.Services.User; @@ -91,7 +92,15 @@ namespace Timeline.Controllers return Forbid(); } - var userId = await _userService.GetUserIdByUsernameAsync(member); + long userId; + try + { + userId = await _userService.GetUserIdByUsernameAsync(member); + } + catch (EntityNotExistException e) when (e.EntityType.Equals(EntityTypes.User)) + { + return UnprocessableEntity(new CommonResponse(ErrorCodes.Common.InvalidModel, "Member username does not exist.")); + } await _timelineService.AddMemberAsync(timelineId, userId); return NoContent(); } @@ -111,7 +120,15 @@ namespace Timeline.Controllers return Forbid(); } - var userId = await _userService.GetUserIdByUsernameAsync(member); + long userId; + try + { + userId = await _userService.GetUserIdByUsernameAsync(member); + } + catch (EntityNotExistException e) when (e.EntityType.Equals(EntityTypes.User)) + { + return UnprocessableEntity(new CommonResponse(ErrorCodes.Common.InvalidModel, "Member username does not exist.")); + } await _timelineService.RemoveMemberAsync(timelineId, userId); return NoContent(); } -- cgit v1.2.3