Skip to content

Commit 40f67cc

Browse files
authored
Merge pull request #290 from sixwaaaay/keyed
feat: recommendation
2 parents 9cbcf95 + 2b754b2 commit 40f67cc

File tree

14 files changed

+256
-452
lines changed

14 files changed

+256
-452
lines changed

sharp/content.Tests/domainservice/MessageDomainTest.cs

Lines changed: 0 additions & 67 deletions
This file was deleted.
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
using content.domainservice;
2+
using content.repository;
3+
using Moq;
4+
using Qdrant.Client;
5+
using Qdrant.Client.Grpc;
6+
7+
public class HistoryServiceTests
8+
{
9+
[Fact]
10+
public async Task GetHistory_ReturnsVideos()
11+
{
12+
// Arrange
13+
var mockHistoryRepo = new Mock<HistoryRepository>(null!);
14+
var mockClient = new Mock<QdrantClient>("localhost",default!,default!,default!,default!,default!);
15+
var mockDomainService = new Mock<IDomainService>();
16+
var userId = 1L;
17+
var historyList = new List<long> { 1L, 2L };
18+
var videoDtos = new List<VideoDto> { new VideoDto(), new VideoDto() };
19+
20+
mockHistoryRepo.Setup(x => x.GetHistorys(userId, It.IsAny<long>(), It.IsAny<int>())).ReturnsAsync(historyList);
21+
mockDomainService.Setup(x => x.FindAllByIds(historyList)).ReturnsAsync(videoDtos);
22+
23+
var service = new HistoryService(mockHistoryRepo.Object, mockClient.Object, mockDomainService.Object);
24+
25+
// Act
26+
var result = await service.GetHistory(userId);
27+
28+
// Assert
29+
Assert.Equal(videoDtos, result.Items);
30+
}
31+
32+
[Fact]
33+
public async Task AddHistory_ReturnsTrue()
34+
{
35+
// Arrange
36+
var mockHistoryRepo = new Mock<HistoryRepository>(null!);
37+
var mockClient = new Mock<QdrantClient>("localhost",default!,default!,default!,default!,default!);
38+
var mockDomainService = new Mock<IDomainService>();
39+
40+
var userId = 1L;
41+
var videoId = 2L;
42+
43+
mockHistoryRepo.Setup(x => x.AddHistory(userId, videoId)).Returns(Task.FromResult(1L));
44+
45+
var service = new HistoryService(mockHistoryRepo.Object, mockClient.Object, mockDomainService.Object);
46+
47+
// Act
48+
var result = await service.AddHistory(userId, videoId);
49+
50+
// Assert
51+
Assert.True(result);
52+
}
53+
54+
/* [Fact]
55+
public async Task Recommendation_ReturnsPagination()
56+
{
57+
// Arrange
58+
var mockHistoryRepo = new Mock<HistoryRepository>(null!);
59+
var mockClient = new Mock<QdrantClient>("localhost",default!,default!,default!,default!,default!);
60+
var mockDomainService = new Mock<IDomainService>();
61+
62+
var userId = 1L;
63+
var page = 0UL;
64+
var size = 10UL;
65+
var historyList = new List<long> { 1L, 2L };
66+
var recommendationResults = new List<ScoredPoint> { new ScoredPoint { Id = new PointId { Num = 1 } }, new ScoredPoint { Id = new PointId { Num = 2 } } };
67+
var videoIds = recommendationResults.Select(x => (long)x.Id.Num).ToList();
68+
var videoDtos = new List<VideoDto> { new (), new () };
69+
70+
mockHistoryRepo.Setup(x => x.GetHistorys(userId, It.IsAny<long?>(), It.IsAny<int?>())).ReturnsAsync(historyList);
71+
mockClient.Setup(x => x.RecommendAsync(
72+
It.IsAny<string>(),
73+
It.IsAny<IReadOnlyList<ulong>>(),
74+
It.IsAny<IReadOnlyList<ulong>?>(),
75+
It.IsAny<ReadOnlyMemory<Vector>?>(),
76+
It.IsAny<ReadOnlyMemory<Vector>?>(),
77+
It.IsAny<RecommendStrategy?>(),
78+
It.IsAny<Filter?>(),
79+
It.IsAny<SearchParams?>(),
80+
It.IsAny<ulong>(),
81+
It.IsAny<ulong>(),
82+
It.IsAny<WithPayloadSelector?>(),
83+
It.IsAny<WithVectorsSelector?>(),
84+
It.IsAny<float?>(),
85+
It.IsAny<string?>(),
86+
It.IsAny<LookupLocation?>(),
87+
It.IsAny<ReadConsistency?>(),
88+
It.IsAny<ShardKeySelector?>(),
89+
It.IsAny<TimeSpan?>(),
90+
It.IsAny<CancellationToken>()
91+
)).ReturnsAsync(recommendationResults);
92+
mockDomainService.Setup(x => x.FindAllByIds(videoIds)).ReturnsAsync(videoDtos);
93+
94+
var service = new HistoryService(mockHistoryRepo.Object, mockClient.Object, mockDomainService.Object);
95+
96+
// Act
97+
var result = await service.Recommendation(userId, page, size);
98+
99+
// Assert
100+
Assert.NotNull(result);
101+
Assert.Equal(videoDtos, result.Items);
102+
Assert.Equal((page + 1).ToString(), result.NextPage);
103+
} */
104+
}

sharp/content.Tests/endpoints/EndpointsTest.cs

Lines changed: 1 addition & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,7 @@ public class EndpointsTests
2424
{
2525
private readonly Mock<IDomainService> _mockService = new();
2626

27-
private readonly ClaimsPrincipal _user = new(new ClaimsIdentity(new Claim[]
28-
{
29-
new("id", "1"),
30-
}));
27+
private readonly ClaimsPrincipal _user = new(new ClaimsIdentity([new("id", "1")]));
3128

3229
[Fact]
3330
public async Task UserVideos_ReturnsExpectedVideos()
@@ -114,50 +111,6 @@ public async Task CreateVideo_CallsServiceWithExpectedVideo()
114111
1L == _user.UserId())), Times.Once);
115112
}
116113

117-
private readonly Mock<IMessageDomain> _mockMessageDomain = new();
118-
119-
[Fact]
120-
public async Task FindMessages_ReturnsCorrectPagination_WhenMessagesExist()
121-
{
122-
// Arrange
123-
var expectedMessages = new Pagination<MessageDto>
124-
{
125-
Items = [new MessageDto { Id = 1 }, new MessageDto { Id = 2 }],
126-
AllCount = 2
127-
};
128-
_mockMessageDomain.Setup(s =>
129-
s.FindMessages(It.IsAny<long>(), It.IsAny<long>(), It.IsAny<int>(), It.IsAny<bool>()))
130-
.ReturnsAsync(expectedMessages);
131-
132-
// Act
133-
var result = await Endpoints.FindMessages(_mockMessageDomain.Object, 1, 1, 10, false);
134-
135-
// Assert
136-
Assert.Equal(expectedMessages, result);
137-
}
138-
139-
[Fact]
140-
public async Task Save_ReturnsCorrectDto_WhenMessageIsSaved()
141-
{
142-
// Arrange
143-
var request = new MessageRequest
144-
{
145-
ReceiverId = 1,
146-
Content = "Test content",
147-
Type = 1
148-
};
149-
var expectedMessage = new MessageDto
150-
{ Id = 1, ReceiverId = request.ReceiverId, Content = request.Content, Type = request.Type };
151-
_mockMessageDomain.Setup(s => s.Save(It.IsAny<Message>())).ReturnsAsync(expectedMessage);
152-
153-
// Act
154-
var result = await Endpoints.Save(_mockMessageDomain.Object, request, _user, new MessageRequestValidator());
155-
156-
// Assert
157-
Assert.Equal(expectedMessage, result);
158-
}
159-
160-
161114
[Fact]
162115
public void Validate_WithValidVideoRequest_DoesNotThrowException()
163116
{
@@ -333,23 +286,4 @@ public void EnsurePageAndSize_WithSizeGreaterThan20_ThrowsArgumentOutOfRangeExce
333286
Assert.Throws<ArgumentOutOfRangeException>(() => Endpoints.EnsurePageAndSize(page, size));
334287
}
335288

336-
337-
[Fact]
338-
public async Task MarkAsRead_UpdatesStatus_WhenCalled()
339-
{
340-
await Endpoints.MarkAsRead(_mockMessageDomain.Object, 1, _user);
341-
_mockMessageDomain.Verify(service => service.MarkAsRead(1, 1), Times.Once);
342-
}
343-
344-
[Fact]
345-
public void Validate_ThrowsException_WhenContentIsInvalid()
346-
{
347-
var request = new MessageRequest
348-
{
349-
ReceiverId = 1,
350-
Content = new string('a', 201),
351-
Type = 1
352-
};
353-
Assert.Throws<ValidationException>(() => new MessageRequestValidator().ValidateAndThrow(request));
354-
}
355289
}

sharp/content.Tests/repository/ClientTest.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,13 @@ public async Task SimilarSearch_ReturnsListOfVideoIds()
177177
};
178178

179179
var mockHttpMessageHandler = new Mock<HttpMessageHandler>();
180-
var mockFactory = new Mock<IHttpClientFactory>();
180+
181181
var client = new HttpClient(mockHttpMessageHandler.Object)
182182
{
183183
BaseAddress = new Uri("http://localhost:5151")
184184
};
185-
mockFactory.Setup(_ => _.CreateClient("Search")).Returns(client);
186185

187-
var searchClient = new SearchClient(mockFactory.Object, ConnectionMultiplexer.Connect("localhost").GetDatabase());
186+
var searchClient = new SearchClient(client, ConnectionMultiplexer.Connect("localhost").GetDatabase());
188187

189188
mockHttpMessageHandler.Protected()
190189
.Setup<Task<HttpResponseMessage>>(
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using content.repository;
2+
using Moq;
3+
using StackExchange.Redis;
4+
5+
public class HistoryRepositoryTests
6+
{
7+
[Fact]
8+
public async Task GetHistorys_ShouldReturnHistorys()
9+
{
10+
// Arrange
11+
var mockDb = new Mock<IDatabase>();
12+
var (userId, historyIds) = (123, new RedisValue[] { 1, 2, 3 });
13+
mockDb.Setup(db => db.ListRangeAsync($"history:{userId}", It.IsAny<long>(), It.IsAny<long>(), CommandFlags.None)).ReturnsAsync(historyIds);
14+
var repository = new HistoryRepository(mockDb.Object);
15+
16+
// Act
17+
var result = await repository.GetHistorys(userId);
18+
19+
// Assert
20+
Assert.Equal(historyIds.Length, result.Count);
21+
for (int i = 0; i < historyIds.Length; i++)
22+
{
23+
Assert.Equal((long)historyIds[i], result[i]);
24+
}
25+
}
26+
27+
[Fact]
28+
public async Task AddHistory_ShouldReturnCount()
29+
{
30+
// Arrange
31+
var mockDb = new Mock<IDatabase>();
32+
var (userId, historyId, expectedCount) = (123, 456, 1);
33+
mockDb.Setup(db => db.ListRightPushAsync($"history:{userId}", historyId, When.Always, CommandFlags.None)).ReturnsAsync(expectedCount);
34+
var repository = new HistoryRepository(mockDb.Object);
35+
// Act
36+
var result = await repository.AddHistory(userId, historyId);
37+
// Assert
38+
Assert.Equal(expectedCount, result);
39+
}
40+
}

0 commit comments

Comments
 (0)