From 9494c9717f0d9983ec1c8db092387fef7199b00d Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 19 Jan 2021 15:24:39 +0800 Subject: test: Add integrated tests for search api. --- .../IntegratedTests/BaseTimelineTest.cs | 2 +- .../IntegratedTests/BookmarkTimelineTest.cs | 4 +- .../IntegratedTests/HighlightTimelineTest.cs | 4 +- .../IntegratedTests/HttpClientTestExtensions.cs | 5 ++ .../Timeline.Tests/IntegratedTests/SearchTest.cs | 63 ++++++++++++++++++++++ .../Timeline.Tests/IntegratedTests/TimelineTest.cs | 8 +-- BackEnd/Timeline/Controllers/SearchController.cs | 14 +++++ BackEnd/Timeline/Controllers/TimelineController.cs | 2 +- BackEnd/Timeline/Models/Http/TimelineController.cs | 2 +- 9 files changed, 93 insertions(+), 11 deletions(-) create mode 100644 BackEnd/Timeline.Tests/IntegratedTests/SearchTest.cs diff --git a/BackEnd/Timeline.Tests/IntegratedTests/BaseTimelineTest.cs b/BackEnd/Timeline.Tests/IntegratedTests/BaseTimelineTest.cs index 0bf3b2b2..006b5128 100644 --- a/BackEnd/Timeline.Tests/IntegratedTests/BaseTimelineTest.cs +++ b/BackEnd/Timeline.Tests/IntegratedTests/BaseTimelineTest.cs @@ -15,7 +15,7 @@ namespace Timeline.Tests.IntegratedTests for (int i = 0; i <= 3; i++) { using var client = await CreateClientAs(i); - await client.TestPostAsync("timelines", new TimelineCreateRequest { Name = $"t{i}" }); + await client.TestPostAsync("timelines", new HttpTimelineCreateRequest { Name = $"t{i}" }); } } diff --git a/BackEnd/Timeline.Tests/IntegratedTests/BookmarkTimelineTest.cs b/BackEnd/Timeline.Tests/IntegratedTests/BookmarkTimelineTest.cs index 99cf6d3a..23d67d44 100644 --- a/BackEnd/Timeline.Tests/IntegratedTests/BookmarkTimelineTest.cs +++ b/BackEnd/Timeline.Tests/IntegratedTests/BookmarkTimelineTest.cs @@ -34,7 +34,7 @@ namespace Timeline.Tests.IntegratedTests public async Task ShouldWork() { using var client = await CreateClientAsUser(); - await client.TestPostAsync("timelines", new TimelineCreateRequest { Name = "t1" }); + await client.TestPostAsync("timelines", new HttpTimelineCreateRequest { Name = "t1" }); { @@ -88,7 +88,7 @@ namespace Timeline.Tests.IntegratedTests public async Task TimelineGet_IsBookmarkField_ShouldWork() { using var client = await CreateClientAsUser(); - await client.TestPostAsync("timelines", new TimelineCreateRequest { Name = "t" }); + await client.TestPostAsync("timelines", new HttpTimelineCreateRequest { Name = "t" }); { var t = await client.TestGetAsync("timelines/t"); diff --git a/BackEnd/Timeline.Tests/IntegratedTests/HighlightTimelineTest.cs b/BackEnd/Timeline.Tests/IntegratedTests/HighlightTimelineTest.cs index 440759f4..cfc41468 100644 --- a/BackEnd/Timeline.Tests/IntegratedTests/HighlightTimelineTest.cs +++ b/BackEnd/Timeline.Tests/IntegratedTests/HighlightTimelineTest.cs @@ -35,7 +35,7 @@ namespace Timeline.Tests.IntegratedTests { { using var client1 = await CreateClientAsUser(); - await client1.TestPostAsync("timelines", new TimelineCreateRequest { Name = "t1" }); + await client1.TestPostAsync("timelines", new HttpTimelineCreateRequest { Name = "t1" }); } using var client = await CreateClientAsAdministrator(); @@ -91,7 +91,7 @@ namespace Timeline.Tests.IntegratedTests public async Task TimelineGet_IsHighlighField_Should_Work() { using var client = await CreateClientAsAdministrator(); - await client.TestPostAsync("timelines", new TimelineCreateRequest { Name = "t" }); + await client.TestPostAsync("timelines", new HttpTimelineCreateRequest { Name = "t" }); { var t = await client.TestGetAsync("timelines/t"); diff --git a/BackEnd/Timeline.Tests/IntegratedTests/HttpClientTestExtensions.cs b/BackEnd/Timeline.Tests/IntegratedTests/HttpClientTestExtensions.cs index b219f092..9848564f 100644 --- a/BackEnd/Timeline.Tests/IntegratedTests/HttpClientTestExtensions.cs +++ b/BackEnd/Timeline.Tests/IntegratedTests/HttpClientTestExtensions.cs @@ -78,6 +78,11 @@ namespace Timeline.Tests.IntegratedTests return await client.TestJsonSendAsync(HttpMethod.Put, url, jsonBody, expectedStatusCode: expectedStatusCode); } + public static async Task TestPatchAsync(this HttpClient client, string url, object? jsonBody = null, HttpStatusCode expectedStatusCode = HttpStatusCode.OK) + { + await client.TestJsonSendAsync(HttpMethod.Patch, url, jsonBody, expectedStatusCode: expectedStatusCode); + } + public static async Task TestPatchAsync(this HttpClient client, string url, object? jsonBody = null, HttpStatusCode expectedStatusCode = HttpStatusCode.OK) { return await client.TestJsonSendAsync(HttpMethod.Patch, url, jsonBody, expectedStatusCode: expectedStatusCode); diff --git a/BackEnd/Timeline.Tests/IntegratedTests/SearchTest.cs b/BackEnd/Timeline.Tests/IntegratedTests/SearchTest.cs new file mode 100644 index 00000000..f96acfea --- /dev/null +++ b/BackEnd/Timeline.Tests/IntegratedTests/SearchTest.cs @@ -0,0 +1,63 @@ +using FluentAssertions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Timeline.Models.Http; +using Xunit; + +namespace Timeline.Tests.IntegratedTests +{ + public class SearchTest : IntegratedTestBase + { + [Fact] + public async Task TimelineSearch_Should_Work() + { + var client = await CreateClientAsUser(); + + { + await client.TestPostAsync("timelines", new HttpTimelineCreateRequest { Name = "hahaha" }); + await client.TestPostAsync("timelines", new HttpTimelineCreateRequest { Name = "bababa" }); + await client.TestPatchAsync("timelines/bababa", new HttpTimelinePatchRequest { Title = "hahaha" }); + await client.TestPostAsync("timelines", new HttpTimelineCreateRequest { Name = "gagaga" }); + } + + { + var res = await client.TestGetAsync>("search/timelines?q=hah"); + res.Should().HaveCount(2); + res[0].Name.Should().Be("hahaha"); + res[1].Name.Should().Be("bababa"); + } + + { + var res = await client.TestGetAsync>("search/timelines?q=wuhu"); + res.Should().BeEmpty(); + } + } + + [Fact] + public async Task UserSearch_Should_Work() + { + var client = await CreateClientAsAdministrator(); + + { + await client.TestPostAsync("userop/createuser", new HttpCreateUserRequest { Username = "hahaha", Password = "p" }); + await client.TestPostAsync("userop/createuser", new HttpCreateUserRequest { Username = "bababa", Password = "p" }); + await client.TestPatchAsync("users/bababa", new HttpUserPatchRequest { Nickname = "hahaha" }); + await client.TestPostAsync("userop/createuser", new HttpCreateUserRequest { Username = "gagaga", Password = "p" }); + } + + { + var res = await client.TestGetAsync>("search/users?q=hah"); + res.Should().HaveCount(2); + res[0].Username.Should().Be("hahaha"); + res[1].Username.Should().Be("bababa"); + } + + { + var res = await client.TestGetAsync>("search/users?q=wuhu"); + res.Should().BeEmpty(); + } + } + } +} diff --git a/BackEnd/Timeline.Tests/IntegratedTests/TimelineTest.cs b/BackEnd/Timeline.Tests/IntegratedTests/TimelineTest.cs index 66261b36..4247e572 100644 --- a/BackEnd/Timeline.Tests/IntegratedTests/TimelineTest.cs +++ b/BackEnd/Timeline.Tests/IntegratedTests/TimelineTest.cs @@ -179,20 +179,20 @@ namespace Timeline.Tests.IntegratedTests { { using var client = await CreateDefaultClient(); - await client.TestPostAssertUnauthorizedAsync("timelines", new TimelineCreateRequest { Name = "aaa" }); + await client.TestPostAssertUnauthorizedAsync("timelines", new HttpTimelineCreateRequest { Name = "aaa" }); } { using var client = await CreateClientAsUser(); - await client.TestPostAssertInvalidModelAsync("timelines", new TimelineCreateRequest { Name = "!!!" }); + await client.TestPostAssertInvalidModelAsync("timelines", new HttpTimelineCreateRequest { Name = "!!!" }); { - var body = await client.TestPostAsync("timelines", new TimelineCreateRequest { Name = "aaa" }); + var body = await client.TestPostAsync("timelines", new HttpTimelineCreateRequest { Name = "aaa" }); body.Should().BeEquivalentTo(await client.GetTimelineAsync("aaa")); } - await client.TestPostAssertErrorAsync("timelines", new TimelineCreateRequest { Name = "aaa" }, errorCode: ErrorCodes.TimelineController.NameConflict); + await client.TestPostAssertErrorAsync("timelines", new HttpTimelineCreateRequest { Name = "aaa" }, errorCode: ErrorCodes.TimelineController.NameConflict); } } diff --git a/BackEnd/Timeline/Controllers/SearchController.cs b/BackEnd/Timeline/Controllers/SearchController.cs index 915938de..dec876b6 100644 --- a/BackEnd/Timeline/Controllers/SearchController.cs +++ b/BackEnd/Timeline/Controllers/SearchController.cs @@ -28,7 +28,14 @@ namespace Timeline.Controllers _userMapper = userMapper; } + /// + /// Search timelines whose name or title contains query string case-insensitively. + /// + /// The string to contain. + /// Timelines with most related at first. [HttpGet("timelines")] + [ProducesResponseType(200)] + [ProducesResponseType(400)] public async Task>> TimelineSearch([FromQuery(Name = "q"), Required(AllowEmptyStrings = false)] string query) { var searchResult = await _service.SearchTimeline(query); @@ -36,7 +43,14 @@ namespace Timeline.Controllers return await _timelineMapper.MapToHttp(timelines, Url, this.GetOptionalUserId()); } + /// + /// Search users whose username or nick contains query string case-insensitively. + /// + /// The string to contain. + /// Users with most related at first. [HttpGet("users")] + [ProducesResponseType(200)] + [ProducesResponseType(400)] public async Task>> UserSearch([FromQuery(Name = "q"), Required(AllowEmptyStrings = false)] string query) { var searchResult = await _service.SearchUser(query); diff --git a/BackEnd/Timeline/Controllers/TimelineController.cs b/BackEnd/Timeline/Controllers/TimelineController.cs index b2e37b15..5d484388 100644 --- a/BackEnd/Timeline/Controllers/TimelineController.cs +++ b/BackEnd/Timeline/Controllers/TimelineController.cs @@ -441,7 +441,7 @@ namespace Timeline.Controllers [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] - public async Task> TimelineCreate([FromBody] TimelineCreateRequest body) + public async Task> TimelineCreate([FromBody] HttpTimelineCreateRequest body) { var userId = this.GetUserId(); diff --git a/BackEnd/Timeline/Models/Http/TimelineController.cs b/BackEnd/Timeline/Models/Http/TimelineController.cs index f6039b35..257076f0 100644 --- a/BackEnd/Timeline/Models/Http/TimelineController.cs +++ b/BackEnd/Timeline/Models/Http/TimelineController.cs @@ -43,7 +43,7 @@ namespace Timeline.Models.Http /// /// Create timeline request model. /// - public class TimelineCreateRequest + public class HttpTimelineCreateRequest { /// /// Name of the new timeline. Must be a valid name. -- cgit v1.2.3