Skip to content

Commit dbecd43

Browse files
authored
Merge pull request #284 from sixwaaaay/ver
chore: version update
2 parents 2ae9a46 + f01d8f2 commit dbecd43

File tree

13 files changed

+165
-276
lines changed

13 files changed

+165
-276
lines changed

sharp/content.Tests/DomainTest.cs

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,22 @@
1313
*/
1414

1515
using content.domainservice;
16-
17-
using JetBrains.Annotations;
1816
using Moq;
1917
using content.repository;
2018

2119
namespace content.Tests;
22-
[TestSubject(typeof(DomainService))]
20+
2321
public class DomainTest
2422
{
23+
24+
private (Mock<IVideoRepository>, Mock<IUserRepository> userRepo, Mock<IVoteRepository> voteRepo, Mock<SearchClient> searchClient) Setup() =>
25+
(new Mock<IVideoRepository>(), new Mock<IUserRepository>(), new Mock<IVoteRepository>(), new Mock<SearchClient>(null!));
26+
2527
[Fact]
2628
public async Task FindById_ReturnsVideoDto_WhenVideoExists()
2729
{
2830
// Arrange
29-
var mockVideoRepo = new Mock<IVideoRepository>();
30-
var mockUserRepo = new Mock<IUserRepository>();
31-
var mockVoteRepo = new Mock<IVoteRepository>();
32-
var mockSearchClient = new Mock<SearchClient>(null);
31+
var (mockVideoRepo, mockUserRepo, mockVoteRepo, mockSearchClient) = Setup();
3332
var video = new Video { Id = 1, UserId = 1 };
3433
var user = new User { Id = "1" };
3534
mockVideoRepo.Setup(repo => repo.FindById(1)).ReturnsAsync(video);
@@ -52,10 +51,7 @@ public async Task FindById_ReturnsVideoDto_WhenVideoExists()
5251
public async Task FindAllByIds_ReturnsVideoDtos_WhenVideosExist()
5352
{
5453
// Arrange
55-
var mockVideoRepo = new Mock<IVideoRepository>();
56-
var mockUserRepo = new Mock<IUserRepository>();
57-
var mockVoteRepo = new Mock<IVoteRepository>();
58-
var mockSearchClient = new Mock<SearchClient>(null);
54+
var (mockVideoRepo, mockUserRepo, mockVoteRepo, mockSearchClient) = Setup();
5955
var videos = new List<Video> { new() { Id = 1, UserId = 1 }, new() { Id = 2, UserId = 2 } };
6056
var users = new List<User> { new() { Id = "1" }, new() { Id = "2" } };
6157
mockVideoRepo.Setup(repo => repo.FindAllByIds(It.IsAny<IReadOnlyList<long>>())).ReturnsAsync(videos);
@@ -75,10 +71,7 @@ public async Task FindAllByIds_ReturnsVideoDtos_WhenVideosExist()
7571
public async Task Save_ReturnsSavedVideoDto_WhenVideoIsSaved()
7672
{
7773
// Arrange
78-
var mockVideoRepo = new Mock<IVideoRepository>();
79-
var mockUserRepo = new Mock<IUserRepository>();
80-
var mockVoteRepo = new Mock<IVoteRepository>();
81-
var mockSearchClient = new Mock<SearchClient>(null);
74+
var (mockVideoRepo, mockUserRepo, mockVoteRepo, mockSearchClient) = Setup();
8275
var video = new Video { Id = 1, UserId = 1 };
8376
var user = new User { Id = "1" };
8477
mockVideoRepo.Setup(repo => repo.Save(It.IsAny<Video>())).ReturnsAsync(video);
@@ -93,10 +86,7 @@ public async Task Save_ReturnsSavedVideoDto_WhenVideoIsSaved()
9386
public async Task FindByUserId_ReturnsExpectedVideos()
9487
{
9588
// Arrange
96-
var mockVideoRepo = new Mock<IVideoRepository>();
97-
var mockUserRepo = new Mock<IUserRepository>();
98-
var mockVoteRepo = new Mock<IVoteRepository>();
99-
var mockSearchClient = new Mock<SearchClient>(null);
89+
var (mockVideoRepo, mockUserRepo, mockVoteRepo, mockSearchClient) = Setup();
10090
var videos = new List<Video> { new() { Id = 1, UserId = 1 }, new() { Id = 2, UserId = 1 } };
10191
var user = new User { Id = "1" };
10292
var voteVideoIds = new List<long> { 1, 2 };
@@ -117,10 +107,7 @@ public async Task FindByUserId_ReturnsExpectedVideos()
117107
public async Task FindRecent_ReturnsExpectedVideos()
118108
{
119109
// Arrange
120-
var mockVideoRepo = new Mock<IVideoRepository>();
121-
var mockUserRepo = new Mock<IUserRepository>();
122-
var mockVoteRepo = new Mock<IVoteRepository>();
123-
var mockSearchClient = new Mock<SearchClient>(null);
110+
var (mockVideoRepo, mockUserRepo, mockVoteRepo, mockSearchClient) = Setup();
124111
var videos = new List<Video> { new() { Id = 1, UserId = 1 }, new() { Id = 2, UserId = 2 } };
125112
var users = new List<User> { new() { Id = "1" }, new() { Id = "2" } };
126113
var voteVideoIds = new List<long> { 1 };
@@ -141,10 +128,7 @@ public async Task FindRecent_ReturnsExpectedVideos()
141128
public async Task DailyPopularVideos_ReturnsExpectedVideos()
142129
{
143130
// Arrange
144-
var mockVideoRepo = new Mock<IVideoRepository>();
145-
var mockUserRepo = new Mock<IUserRepository>();
146-
var mockVoteRepo = new Mock<IVoteRepository>();
147-
var mockSearchClient = new Mock<SearchClient>(null);
131+
var (mockVideoRepo, mockUserRepo, mockVoteRepo, mockSearchClient) = Setup();
148132
var videos = new List<Video> { new() { Id = 1, UserId = 1 }, new() { Id = 2, UserId = 2 } };
149133
var users = new List<User> { new() { Id = "1" }, new() { Id = "2" } };
150134
var voteVideoIds = new List<long> { 1 };
@@ -167,10 +151,7 @@ public async Task DailyPopularVideos_ReturnsExpectedVideos()
167151
public async Task VotedVideos_ReturnsExpectedVideos()
168152
{
169153
// Arrange
170-
var mockVideoRepo = new Mock<IVideoRepository>();
171-
var mockUserRepo = new Mock<IUserRepository>();
172-
var mockVoteRepo = new Mock<IVoteRepository>();
173-
var mockSearchClient = new Mock<SearchClient>(null);
154+
var (mockVideoRepo, mockUserRepo, mockVoteRepo, mockSearchClient) = Setup();
174155
var videoIds = new long[] { 1, 2 };
175156
var videos = new List<Video> { new() { Id = 1, UserId = 1 }, new() { Id = 2, UserId = 2 } };
176157
var users = new List<User> { new() { Id = "1" }, new() { Id = "2" } };

sharp/content.Tests/UnitTest.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,17 @@
1313
*/
1414

1515
using content.repository;
16-
using JetBrains.Annotations;
1716
using Npgsql;
1817
using Xunit.Abstractions;
1918

2019
namespace content.Tests;
2120

2221
public class UnitTest(ITestOutputHelper testOutputHelper)
2322
{
24-
private readonly string _connectString = Environment.GetEnvironmentVariable("CONNECTION_STRING") !;
23+
private readonly string _connectString = Environment.GetEnvironmentVariable("CONNECTION_STRING")!;
2524

26-
[TestSubject(typeof(VideoRepository))]
2725
[Fact(DisplayName = "Video Repository")]
28-
public async void Test1()
26+
public async Task Test1()
2927
{
3028
await using var dataSource = NpgsqlDataSource.Create(_connectString);
3129
var videoRepository = (IVideoRepository)new VideoRepository(dataSource);
@@ -77,7 +75,7 @@ public async void Test1()
7775
}
7876

7977
[Fact(DisplayName = "Command")]
80-
public async void TestInsert()
78+
public async Task TestInsert()
8179
{
8280
await using var dataSource = NpgsqlDataSource.Create(_connectString);
8381
var videoRepository = (IVideoRepository)new VideoRepository(dataSource);

sharp/content.Tests/content.Tests.csproj

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,10 @@
2323
</PropertyGroup>
2424

2525
<ItemGroup>
26-
<PackageReference Include="JetBrains.Annotations" Version="2023.3.0" />
27-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
26+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
2827
<PackageReference Include="Moq" Version="4.20.70" />
29-
<PackageReference Include="xunit" Version="2.4.2" />
30-
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
28+
<PackageReference Include="xunit" Version="2.9.2" />
29+
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">
3130
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
3231
<PrivateAssets>all</PrivateAssets>
3332
</PackageReference>

sharp/content.Tests/endpoints/EndpointsTest.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,10 @@
1616
using content.endpoints;
1717
using content.repository;
1818
using FluentValidation;
19-
using JetBrains.Annotations;
2019
using Moq;
2120
using System.Security.Claims;
2221

2322
namespace content.Tests.endpoints;
24-
[TestSubject(typeof(Endpoints))]
2523
public class EndpointsTests
2624
{
2725
private readonly Mock<IDomainService> _mockService = new();
@@ -61,7 +59,7 @@ public async Task Videos_ReturnsExpectedVideos()
6159

6260
Assert.Equal(expectedVideos, result);
6361
}
64-
62+
6563
[Fact]
6664
public async Task DailyPopularVideos_ReturnsExpectedVideos()
6765
{
@@ -76,7 +74,7 @@ public async Task DailyPopularVideos_ReturnsExpectedVideos()
7674

7775
Assert.Equal(expectedVideos, result);
7876
}
79-
77+
8078

8179
[Fact]
8280
public async Task Likes_ReturnsExpectedVideos()
@@ -96,7 +94,7 @@ public async Task Likes_ReturnsExpectedVideos()
9694

9795

9896
[Fact]
99-
public async void CreateVideo_CallsServiceWithExpectedVideo()
97+
public async Task CreateVideo_CallsServiceWithExpectedVideo()
10098
{
10199
var request = new VideoRequest
102100
{
@@ -149,7 +147,7 @@ public async Task Save_ReturnsCorrectDto_WhenMessageIsSaved()
149147
Type = 1
150148
};
151149
var expectedMessage = new MessageDto
152-
{ Id = 1, ReceiverId = request.ReceiverId, Content = request.Content, Type = request.Type };
150+
{ Id = 1, ReceiverId = request.ReceiverId, Content = request.Content, Type = request.Type };
153151
_mockMessageDomain.Setup(s => s.Save(It.IsAny<Message>())).ReturnsAsync(expectedMessage);
154152

155153
// Act

sharp/content.Tests/repository/ProbeTest.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,17 @@
1212
*
1313
*/
1414
using content.repository;
15-
using JetBrains.Annotations;
1615
using Xunit.Abstractions;
1716

1817
namespace content.Tests.repository;
1918

20-
[TestSubject(typeof(Probe))]
19+
2120
public class ProbeTest(ITestOutputHelper testOutputHelper)
2221
{
2322
private readonly string _executablePath = Environment.GetEnvironmentVariable("FFPROBE_PATH") !;
2423

2524
[Fact]
26-
public async void Method()
25+
public async Task Method()
2726
{
2827
// Arrange
2928
var peg = new Probe(_executablePath);
@@ -36,7 +35,7 @@ public async void Method()
3635
}
3736

3837
[Fact(DisplayName = "Empty executable path")]
39-
public async void EmptyExecutablePath()
38+
public async Task EmptyExecutablePath()
4039
{
4140
// Arrange
4241
var peg = new Probe(string.Empty);
@@ -52,17 +51,17 @@ public async void EmptyExecutablePath()
5251
}
5352

5453
[Fact(DisplayName = "empty url")]
55-
public async void EmptyUrl()
54+
public async Task EmptyUrl()
5655
{
5756
// Arrange
5857
var peg = new Probe(_executablePath);
5958
// Act && Assert
60-
await Assert.ThrowsAsync<ArgumentNullException>(async () =>
59+
await Assert.ThrowsAsync<ArgumentException>(async () =>
6160
await peg.GetVideoDuration(string.Empty));
6261
}
6362

6463
[Fact(DisplayName = "resolution")]
65-
public async void Resolution()
64+
public async Task Resolution()
6665
{
6766
// Arrange
6867
var peg = new Probe(_executablePath);
@@ -75,7 +74,7 @@ public async void Resolution()
7574
}
7675

7776
[Fact(DisplayName = "not a video")]
78-
public async void NotAVideo()
77+
public async Task NotAVideo()
7978
{
8079
// Arrange
8180
var peg = new Probe(_executablePath);

sharp/content.Tests/repository/UserRepositoryTest.cs

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,48 +9,72 @@
99
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1010
* See the License for the specific language governing permissions and
1111
* limitations under the License.
12-
*
12+
*
1313
*/
14+
15+
using System.Net;
16+
using System.Net.Http.Json;
17+
using System.Text.Json.Serialization;
1418
using content.repository;
15-
using Grpc.Core;
16-
using Grpc.Net.Client;
17-
using JetBrains.Annotations;
19+
using Moq;
20+
using Moq.Protected;
1821

1922
namespace content.Tests.repository;
2023

21-
[TestSubject(typeof(UserRepository))]
2224
public class UserRepositoryTest
2325
{
24-
25-
private readonly ChannelBase _channel = GrpcChannel.ForAddress(Environment.GetEnvironmentVariable("USER_STRING") !);
26-
2726
[Fact(DisplayName = "FindUserById")]
28-
public async void Test1()
29-
{
30-
var client = new UserRepository(_channel);
31-
var result = await client.FindById(1);
32-
33-
Assert.NotNull(result);
34-
Assert.Equal("1", result.Id);
35-
}
36-
37-
[Fact(DisplayName = "FindUserByIds")]
38-
public async void Test2()
27+
public async Task Test1()
3928
{
29+
// Arange
30+
var id = 1L;
31+
var user = new User { Id = id.ToString(), Name = "test", AvatarUrl = "https://example.com/avatar.png", BgUrl = "https://example.com/bg.png", Bio = "test user", };
32+
var mockHttpMessageHandler = new Mock<HttpMessageHandler>();
33+
mockHttpMessageHandler.Protected()
34+
.Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
35+
.ReturnsAsync(new HttpResponseMessage { StatusCode = HttpStatusCode.OK, Content = JsonContent.Create(user, UserJsonContext.Default.User), });
36+
var httpClient = new HttpClient(mockHttpMessageHandler.Object) { BaseAddress = new Uri("http://localhost:5151") };
37+
var client = new UserRepository(httpClient);
38+
// Act
39+
var result = await client.FindById(id);
4040

41-
var client = new UserRepository(_channel);
42-
var result = await client.FindAllByIds(new []{1L, 2L});
41+
// Assert
4342
Assert.NotNull(result);
44-
Assert.Equal(2, result.Count);
43+
Assert.Equal(id.ToString(), result.Id);
44+
Assert.Equal("test", result.Name);
45+
Assert.Equal("https://example.com/avatar.png", result.AvatarUrl);
46+
Assert.Equal("https://example.com/bg.png", result.BgUrl);
47+
Assert.Equal("test user", result.Bio);
4548
}
46-
47-
[Fact(DisplayName = "invalid token, error")]
48-
public async void Test3()
49+
50+
[Fact(DisplayName = "FindUserByIds")]
51+
public async Task Test2()
4952
{
50-
var client = new UserRepository(_channel)
53+
// Arange
54+
var ids = new List<long> { 1L, 2L };
55+
var users = new List<User>
5156
{
52-
Token = "token"
57+
new() {Id = "1",Name = "test1",AvatarUrl = "https://example.com/avatar1.png",BgUrl = "https://example.com/bg1.png",Bio = "test user1"},
58+
new(){Id = "2",Name = "test2",AvatarUrl = "https://example.com/avatar2.png",BgUrl = "https://example.com/bg2.png",Bio = "test user2"}
5359
};
54-
await Assert.ThrowsAsync<RpcException>(async () => await client.FindAllByIds(new []{493764627922944111, 11}));
60+
var mockHttpMessageHandler = new Mock<HttpMessageHandler>();
61+
mockHttpMessageHandler.Protected().Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())
62+
.ReturnsAsync(new HttpResponseMessage { StatusCode = HttpStatusCode.OK, Content = JsonContent.Create(users, UserJsonContext.Default.IReadOnlyListUser) });
63+
var httpClient = new HttpClient(mockHttpMessageHandler.Object) { BaseAddress = new Uri("http://localhost:5151") };
64+
var client = new UserRepository(httpClient);
65+
// Act
66+
var result = await client.FindAllByIds(ids);
67+
// Assert
68+
Assert.NotNull(result);
69+
Assert.Equal(2, result.Count);
70+
Assert.Equal("1", result[0].Id);
71+
Assert.Equal("https://example.com/avatar1.png", result[0].AvatarUrl);
72+
Assert.Equal("test user1", result[0].Bio);
73+
Assert.Equal("2", result[1].Id);
74+
Assert.Equal("https://example.com/bg2.png", result[1].BgUrl);
5575
}
56-
}
76+
}
77+
78+
[JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.SnakeCaseLower)]
79+
[JsonSerializable(typeof(IReadOnlyList<User>))]
80+
partial class UserJsonContext : JsonSerializerContext;

sharp/content/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ RUN adduser -u 1000 --gecos "" --disabled-password appuser && chown -R appuser /
1717
USER appuser
1818
EXPOSE 5000
1919

20-
FROM mcr.microsoft.com/dotnet/sdk:9.0.100-preview.7-alpine3.20 AS build
20+
FROM mcr.microsoft.com/dotnet/sdk:9.0.100-alpine3.20 AS build
2121
RUN apk update && apk upgrade && apk add --no-cache clang build-base zlib-dev grpc-plugins
2222
WORKDIR /src
2323
ARG RUNTIME_ID=linux-musl-x64

0 commit comments

Comments
 (0)