aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-01-19 15:24:39 +0800
committercrupest <crupest@outlook.com>2021-01-19 15:24:39 +0800
commit9494c9717f0d9983ec1c8db092387fef7199b00d (patch)
treecea8e25b7bded0833b3e4c6a5c1c018785cd3c30
parent667f14149f32756a80018ead27102c63270644f4 (diff)
downloadtimeline-9494c9717f0d9983ec1c8db092387fef7199b00d.tar.gz
timeline-9494c9717f0d9983ec1c8db092387fef7199b00d.tar.bz2
timeline-9494c9717f0d9983ec1c8db092387fef7199b00d.zip
test: Add integrated tests for search api.
-rw-r--r--BackEnd/Timeline.Tests/IntegratedTests/BaseTimelineTest.cs2
-rw-r--r--BackEnd/Timeline.Tests/IntegratedTests/BookmarkTimelineTest.cs4
-rw-r--r--BackEnd/Timeline.Tests/IntegratedTests/HighlightTimelineTest.cs4
-rw-r--r--BackEnd/Timeline.Tests/IntegratedTests/HttpClientTestExtensions.cs5
-rw-r--r--BackEnd/Timeline.Tests/IntegratedTests/SearchTest.cs63
-rw-r--r--BackEnd/Timeline.Tests/IntegratedTests/TimelineTest.cs8
-rw-r--r--BackEnd/Timeline/Controllers/SearchController.cs14
-rw-r--r--BackEnd/Timeline/Controllers/TimelineController.cs2
-rw-r--r--BackEnd/Timeline/Models/Http/TimelineController.cs2
9 files changed, 93 insertions, 11 deletions
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<HttpTimeline>("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<HttpTimeline>("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<T>(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<T> TestPatchAsync<T>(this HttpClient client, string url, object? jsonBody = null, HttpStatusCode expectedStatusCode = HttpStatusCode.OK)
{
return await client.TestJsonSendAsync<T>(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<List<HttpTimeline>>("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<List<HttpTimeline>>("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<List<HttpUser>>("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<List<HttpUser>>("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<HttpTimeline>("timelines", new TimelineCreateRequest { Name = "aaa" });
+ var body = await client.TestPostAsync<HttpTimeline>("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;
}
+ /// <summary>
+ /// Search timelines whose name or title contains query string case-insensitively.
+ /// </summary>
+ /// <param name="query">The string to contain.</param>
+ /// <returns>Timelines with most related at first.</returns>
[HttpGet("timelines")]
+ [ProducesResponseType(200)]
+ [ProducesResponseType(400)]
public async Task<ActionResult<List<HttpTimeline>>> 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());
}
+ /// <summary>
+ /// Search users whose username or nick contains query string case-insensitively.
+ /// </summary>
+ /// <param name="query">The string to contain.</param>
+ /// <returns>Users with most related at first.</returns>
[HttpGet("users")]
+ [ProducesResponseType(200)]
+ [ProducesResponseType(400)]
public async Task<ActionResult<List<HttpUser>>> 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<ActionResult<HttpTimeline>> TimelineCreate([FromBody] TimelineCreateRequest body)
+ public async Task<ActionResult<HttpTimeline>> 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
/// <summary>
/// Create timeline request model.
/// </summary>
- public class TimelineCreateRequest
+ public class HttpTimelineCreateRequest
{
/// <summary>
/// Name of the new timeline. Must be a valid name.