From 1eabc315ca425f6c28c0a943d5c01c7724cb9f6f Mon Sep 17 00:00:00 2001 From: dotReboot Date: Fri, 17 Oct 2025 16:33:35 +0300 Subject: [PATCH 1/4] =?UTF-8?q?[SN-127]=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- StudHub.Server.sln | 6 ++++++ test/Unit/Unit.csproj | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 test/Unit/Unit.csproj diff --git a/StudHub.Server.sln b/StudHub.Server.sln index ec49472..f1e5bae 100644 --- a/StudHub.Server.sln +++ b/StudHub.Server.sln @@ -10,6 +10,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Platform.API", "src\Platfor EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Admin.API", "src\Admin.API\Admin.API.csproj", "{781F6E4E-FC3B-46E4-895A-F27A4310CF42}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unit", "test\Unit\Unit.csproj", "{3558A138-C00A-4857-93E5-3ECCB5CD873C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -36,5 +38,9 @@ Global {781F6E4E-FC3B-46E4-895A-F27A4310CF42}.Debug|Any CPU.Build.0 = Debug|Any CPU {781F6E4E-FC3B-46E4-895A-F27A4310CF42}.Release|Any CPU.ActiveCfg = Release|Any CPU {781F6E4E-FC3B-46E4-895A-F27A4310CF42}.Release|Any CPU.Build.0 = Release|Any CPU + {3558A138-C00A-4857-93E5-3ECCB5CD873C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3558A138-C00A-4857-93E5-3ECCB5CD873C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3558A138-C00A-4857-93E5-3ECCB5CD873C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3558A138-C00A-4857-93E5-3ECCB5CD873C}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/test/Unit/Unit.csproj b/test/Unit/Unit.csproj new file mode 100644 index 0000000..1047410 --- /dev/null +++ b/test/Unit/Unit.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + + + + + From af787ab1503e006bf2b6052dfed25967698169c4 Mon Sep 17 00:00:00 2001 From: dotReboot Date: Sat, 18 Oct 2025 03:40:04 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20=D0=BC=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0=20Create=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D0=B0=20ClubCreationRequestsService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/Unit/ClubCreationRequestsServiceTests.cs | 163 ++++++++++++++++++ test/Unit/Unit.csproj | 4 + 2 files changed, 167 insertions(+) create mode 100644 test/Unit/ClubCreationRequestsServiceTests.cs diff --git a/test/Unit/ClubCreationRequestsServiceTests.cs b/test/Unit/ClubCreationRequestsServiceTests.cs new file mode 100644 index 0000000..ee93d1b --- /dev/null +++ b/test/Unit/ClubCreationRequestsServiceTests.cs @@ -0,0 +1,163 @@ +using System.ComponentModel.DataAnnotations; +using Application.DTO; + +namespace Unit; + +public class ClubCreationRequestsServiceTests +{ + #region CreateRequest + [Fact] + public void CreateRequest_WithValidData_Succeeds() + { + var clubCreationRequest = new ClubCreationRequestDTO + { + ClubName = "Новый клуб", + Comment = "Новый клуб для тестирования функциональности", + PersonId = 0, + ImageId = 0, + BannerId = 0, + ClubAbout = "Описание клуба для создания" + }; + var context = new ValidationContext(clubCreationRequest); + var results = new List(); + + var isValid = Validator.TryValidateObject(clubCreationRequest, context, results, true); + + Assert.True(isValid); + } + + [Fact] + public void CreateRequest_WithEmptyClubName_ValidationFails() + { + var clubCreationRequest = new ClubCreationRequestDTO + { + Comment = "Новый клуб для тестирования функциональности", + PersonId = 0, + ImageId = 0, + BannerId = 0, + ClubAbout = new string('0', 100) + }; + var context = new ValidationContext(clubCreationRequest); + var results = new List(); + + var isValid = Validator.TryValidateObject(clubCreationRequest, context, results, true); + + Assert.False(isValid); + Assert.Contains(results, r => r.MemberNames.Contains("ClubName") && r.ErrorMessage!.Contains("required")); + } + + [Fact] + public void CreateRequest_WithLongClubName_ValidationFails() + { + var clubCreationRequest = new ClubCreationRequestDTO + { + ClubName = new string('0', 64), + Comment = "Новый клуб для тестирования функциональности", + PersonId = 0, + ImageId = 0, + BannerId = 0, + ClubAbout = new string('0', 100) + }; + var context = new ValidationContext(clubCreationRequest); + var results = new List(); + + var isValid = Validator.TryValidateObject(clubCreationRequest, context, results, true); + + Assert.False(isValid); + Assert.Contains(results, r => r.MemberNames.Contains("ClubName") && r.ErrorMessage!.Contains("maximum length")); + } + + [Fact] + public void CreateRequest_WithEmptyImageId_ValidationFails() + { + var clubCreationRequest = new ClubCreationRequestDTO + { + ClubName = "Новый клуб", + Comment = "Новый клуб для тестирования функциональности", + PersonId = 0 + }; + var context = new ValidationContext(clubCreationRequest); + var results = new List(); + + var isValid = Validator.TryValidateObject(clubCreationRequest, context, results, true); + + Assert.False(isValid); + Assert.Contains(results, r => r.MemberNames.Contains("ImageId") && r.ErrorMessage!.Contains("required")); + } + + [Fact] + public void CreateRequest_WithEmptyPersonId_ValidationFails() + { + var clubCreationRequest = new ClubCreationRequestDTO + { + ClubName = "Новый клуб", + Comment = "Новый клуб для тестирования функциональности", + ImageId = 0 + }; + var context = new ValidationContext(clubCreationRequest); + var results = new List(); + + var isValid = Validator.TryValidateObject(clubCreationRequest, context, results, true); + + Assert.False(isValid); + Assert.Contains(results, r => r.MemberNames.Contains("PersonId") && r.ErrorMessage!.Contains("required")); + } + + [Fact] + public void CreateRequest_WithLongClubAbout_ValidationFails() + { + var clubCreationRequest = new ClubCreationRequestDTO + { + ClubName = "Новый клуб", + Comment = "Новый клуб для тестирования функциональности", + PersonId = 0, + ImageId = 0, + BannerId = 0, + ClubAbout = new string('0', 256) + }; + var context = new ValidationContext(clubCreationRequest); + var results = new List(); + + var isValid = Validator.TryValidateObject(clubCreationRequest, context, results, true); + + Assert.False(isValid); + Assert.Contains(results, r => r.MemberNames.Contains("ClubAbout") && r.ErrorMessage!.Contains("maximum length")); + } + + [Fact] + public void CreateRequest_WithEmptyComment_ValidationFails() + { + var clubCreationRequest = new ClubCreationRequestDTO + { + ClubName = "Новый клуб", + Comment = "", + PersonId = 0 + }; + var context = new ValidationContext(clubCreationRequest); + var results = new List(); + + var isValid = Validator.TryValidateObject(clubCreationRequest, context, results, true); + + Assert.False(isValid); + Assert.Contains(results, r => r.MemberNames.Contains("Comment") && r.ErrorMessage!.Contains("required")); + } + + [Fact] + public void CreateRequest_WithLongComment_ValidationFails() + { + var clubCreationRequest = new ClubCreationRequestDTO + { + ClubName = "Новый клуб", + Comment = new string('0', 1001), + PersonId = 0 + }; + var context = new ValidationContext(clubCreationRequest); + var results = new List(); + + var isValid = Validator.TryValidateObject(clubCreationRequest, context, results, true); + + Assert.False(isValid); + Assert.Contains(results, r => r.MemberNames.Contains("Comment") && r.ErrorMessage!.Contains("maximum length")); + } + #endregion +} \ No newline at end of file diff --git a/test/Unit/Unit.csproj b/test/Unit/Unit.csproj index 1047410..e4ef3e5 100644 --- a/test/Unit/Unit.csproj +++ b/test/Unit/Unit.csproj @@ -18,4 +18,8 @@ + + + + From af5db2533a8a1439420b8adfb24da872e14f85b6 Mon Sep 17 00:00:00 2001 From: Vladimir Arkhipenkov Date: Sat, 18 Oct 2025 07:30:44 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20=D0=BC=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0=20AcceptRequest=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8?= =?UTF-8?q?=D1=81=D0=B0=20ClubCreationRequestsService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/Unit/ClubCreationRequestsServiceTests.cs | 94 +++++++++++++++++++ test/Unit/Unit.csproj | 1 + 2 files changed, 95 insertions(+) diff --git a/test/Unit/ClubCreationRequestsServiceTests.cs b/test/Unit/ClubCreationRequestsServiceTests.cs index ee93d1b..fc6e0ae 100644 --- a/test/Unit/ClubCreationRequestsServiceTests.cs +++ b/test/Unit/ClubCreationRequestsServiceTests.cs @@ -1,10 +1,33 @@ using System.ComponentModel.DataAnnotations; +using AutoMapper; +using Moq; +using Serilog; +using Domain.Entities.Admin; +using Domain.Entities.Club; using Application.DTO; +using Application.Exceptions; +using Application.Interfaces.Repositories.Admin; +using Application.Interfaces.Repositories.Club; +using Application.Services; namespace Unit; public class ClubCreationRequestsServiceTests { + private readonly Mock _requestsRepoMock; + private readonly Mock _clubsRepoMock; + private readonly Mock _loggerMock; + private readonly Mock _mapperMock; + private readonly ClubCreationRequestsService _clubCreationRequestsService; + public ClubCreationRequestsServiceTests() + { + _requestsRepoMock = new Mock(); + _clubsRepoMock = new Mock(); + _loggerMock = new Mock(); + _mapperMock = new Mock(); + _clubCreationRequestsService = new ClubCreationRequestsService(_requestsRepoMock.Object, _clubsRepoMock.Object, + _mapperMock.Object, _loggerMock.Object); + } #region CreateRequest [Fact] public void CreateRequest_WithValidData_Succeeds() @@ -159,5 +182,76 @@ public void CreateRequest_WithLongComment_ValidationFails() Assert.False(isValid); Assert.Contains(results, r => r.MemberNames.Contains("Comment") && r.ErrorMessage!.Contains("maximum length")); } + [Fact] + public async Task AcceptRequest_WhenRequestNotFound_ThrowsNotFoundException() + { + var requestId = 1; + _requestsRepoMock + .Setup(r => r.GetByIdAsync(requestId)) + .ReturnsAsync((ClubCreationRequest)null); + + await Assert.ThrowsAsync(() => _clubCreationRequestsService.AcceptRequest(requestId)); + } + + [Fact] + public async Task AcceptRequest_WhenRequestIsNotActive_ThrowsInvalidOperationException() + { + var requestId = 1; + var inactiveRequest = new ClubCreationRequest { IsActive = false }; + _requestsRepoMock + .Setup(r => r.GetByIdAsync(requestId)) + .ReturnsAsync(inactiveRequest); + + var exception = await Assert.ThrowsAsync( + () => _clubCreationRequestsService.AcceptRequest(requestId)); + Assert.Equal("Заявка на создание клуба уже была рассмотрена", exception.Message); + } + + [Fact] + public async Task AcceptRequest_WhenValidRequest_CreatesClubAndUpdatesRequest() + { + var requestId = 1; + var activeRequest = new ClubCreationRequest + { + Id = requestId, + ClubName = "Test Club", + ClubAbout = "About club", + ImageId = 1, + BannerId = 2, + PersonId = 3, + IsActive = true + }; + + _requestsRepoMock + .Setup(r => r.GetByIdAsync(requestId)) + .ReturnsAsync(activeRequest); + + ClubModel createdClub = null; + _clubsRepoMock + .Setup(r => r.CreateAsync(It.IsAny())) + .Callback(club => createdClub = club) + .Returns(Task.CompletedTask); + + _requestsRepoMock + .Setup(r => r.UpdateAsync(activeRequest)) + .Returns(Task.CompletedTask); + + await _clubCreationRequestsService.AcceptRequest(requestId); + + _clubsRepoMock.Verify(r => r.CreateAsync(It.IsAny()), Times.Once); + _requestsRepoMock.Verify(r => r.UpdateAsync(activeRequest), Times.Once); + + Assert.NotNull(createdClub); + Assert.Equal(activeRequest.ClubName, createdClub.Name); + Assert.Equal(activeRequest.ClubAbout, createdClub.About); + Assert.Equal(activeRequest.ImageId, createdClub.ImageId); + Assert.Equal(activeRequest.BannerId, createdClub.BannerId); + Assert.Equal(activeRequest.PersonId, createdClub.OwnerId); + Assert.False(activeRequest.IsActive); + + _loggerMock.Verify(l => l.Information( + "Заявка на создание клуба с Id ({RequestId}) одобрена", requestId), + Times.Once); + } #endregion } \ No newline at end of file diff --git a/test/Unit/Unit.csproj b/test/Unit/Unit.csproj index e4ef3e5..3285fca 100644 --- a/test/Unit/Unit.csproj +++ b/test/Unit/Unit.csproj @@ -11,6 +11,7 @@ + From 87dcdeeaf0449ae96141fcbbe78983147b8ad1ea Mon Sep 17 00:00:00 2001 From: dotReboot Date: Tue, 25 Nov 2025 13:24:44 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=92=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BD=D0=B5=D0=B7=D0=BD=D0=B0=D1=87=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Platform.API/appsettings.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Platform.API/appsettings.json b/src/Platform.API/appsettings.json index 9648d0a..876b1c3 100644 --- a/src/Platform.API/appsettings.json +++ b/src/Platform.API/appsettings.json @@ -20,9 +20,5 @@ ] }, "Domain": ".setka-rtu.ru", - "AllowedHosts": "*", - "JWTKey": "9>I4=o8{AG\\Nh{`I7m*={tP:Gs)dsXxNw.Hj92]dQSO", - "ConnectionStrings": { - "Default": "Host=31.128.38.159;Port=5432;User ID=admin-setka;Password=P1{Hg?:(~jLfDNrp!W9QkF?bO;Database=SetkaDB" - } + "AllowedHosts": "*" } \ No newline at end of file