From baeafad007e61969cf9d69ac75a33c6907965d6a Mon Sep 17 00:00:00 2001 From: Artemy <109195690+stalcker2288969@users.noreply.github.com> Date: Mon, 7 Jul 2025 19:33:47 +0700 Subject: [PATCH] PrivateChatsRepositoryTests --- .../PrivateChatsRepositoryTests.cs | 196 ++++++++++++++++++ .../Validators/ChatGroupValidatorTests.cs | 7 + .../Validators/PrivateChatValidatorTests.cs | 70 +++++++ .../UnitTests/Services/MessageServiceTests.cs | 20 +- .../Validators/ChatGroupValidator.cs | 36 +++- Govor.Core/Models/PrivateChat.cs | 8 + 6 files changed, 323 insertions(+), 14 deletions(-) create mode 100644 Govor.API.Tests/UnitTests/Infrastructure/Validators/ChatGroupValidatorTests.cs diff --git a/Govor.API.Tests/IntegrationTests/EF/Repositories/PrivateChatsRepositoryTests.cs b/Govor.API.Tests/IntegrationTests/EF/Repositories/PrivateChatsRepositoryTests.cs index 41467ef..90729ca 100644 --- a/Govor.API.Tests/IntegrationTests/EF/Repositories/PrivateChatsRepositoryTests.cs +++ b/Govor.API.Tests/IntegrationTests/EF/Repositories/PrivateChatsRepositoryTests.cs @@ -1,7 +1,203 @@ +using AutoFixture; +using Govor.Core.Infrastructure.Validators; +using Govor.Core.Models; +using Govor.Data; +using Govor.Data.Repositories; +using Govor.Data.Repositories.Exceptions; +using Microsoft.EntityFrameworkCore; + namespace Govor.API.Tests.IntegrationTests.EF.Repositories; [TestFixture] public class PrivateChatsRepositoryTests { + private Fixture _fixture; + private DbContextOptions _options; + private IObjectValidator _validator = new PrivateChatValidator(); + private int _testIteration = 0; + [SetUp] + public void SetUp() + { + _testIteration += 1; + + _fixture = new Fixture(); + + _fixture.Behaviors + .OfType() + .ToList() + .ForEach(b => _fixture.Behaviors.Remove(b)); + + _fixture.Behaviors.Add(new OmitOnRecursionBehavior()); + + _options = new DbContextOptionsBuilder() + .UseInMemoryDatabase(databaseName: $"DbGovor_{nameof(PrivateChatsRepositoryTests)}_{_testIteration}") + .Options; + } + + [Test] + public async Task Given_NotEmptySetDb_When_GetAll_Then_ReturnAll() + { + // Arrange + var random = new Random(); + var chats = _fixture.CreateMany(random.Next(2, 10)).ToList(); + + await using var context = new GovorDbContext(_options); + var messagesRepository = new PrivateChatsRepository(context, _validator); + + context.PrivateChats.AddRange(chats); + await context.SaveChangesAsync(); + + // Act + + var result = await messagesRepository.GetAllAsync(); + + // Assert + Assert.That(result, Is.Not.Null); + Assert.That(result.Count, Is.EqualTo(chats.Count)); + Assert.That(result, Is.EquivalentTo(chats)); + } + + [Test] + public void Given_EmptySetDb_When_GetAll_Should_Throw_NotFoundException() + { + // Arrange + using var context = new GovorDbContext(_options); + var repository = new PrivateChatsRepository(context, _validator); + // Act & Assert + Assert.ThrowsAsync(async () => await repository.GetAllAsync()); + } + + [Test] + public async Task Given_ValidChatId_When_GetById_Then_ReturnChat() + { + // Arrange + var chats = _fixture.CreateMany(10); + var id = chats.First().Id; + + await using var context = new GovorDbContext(_options); + var repository = new PrivateChatsRepository(context, _validator); + + context.PrivateChats.AddRange(chats); + await context.SaveChangesAsync(); + + // Act + var result = await repository.GetByIdAsync(id); + + // Assert + Assert.That(result, Is.Not.Null); + Assert.That(result, Is.EqualTo(chats.First())); + } + + [Test] + public async Task Given_InvalidMessageId_When_FindById_Should_Throw_NotFoundByKeyException() + { + // Arrange + await using var context = new GovorDbContext(_options); + var repository = new PrivateChatsRepository(context, _validator); + + // Act & Assert + Assert.ThrowsAsync>(async () => await repository.GetByIdAsync(_fixture.Create())); + } + + [Test] + public async Task Given_MembersId_When_GetByMembersAsync_Then_ReturnChat() + { + // Arrange + var chats = _fixture.CreateMany(10); + var id1 = chats.First().UserAId; + var id2 = chats.First().UserBId; + + await using var context = new GovorDbContext(_options); + var repository = new PrivateChatsRepository(context, _validator); + + context.PrivateChats.AddRange(chats); + await context.SaveChangesAsync(); + + // Act + var result = await repository.GetByMembersAsync(id1, id2); + + // Assert + Assert.That(result, Is.Not.Null); + Assert.That(result, Is.EqualTo(chats.First())); + } + + [Test] + public async Task Given_InvalidMembersId_When_GetByMembersAsync_Should_Throw_NotFoundByKeyException() + { + // Arrange + await using var context = new GovorDbContext(_options); + var repository = new PrivateChatsRepository(context, _validator); + + // Act & Assert + Assert.ThrowsAsync>(async () => await repository.GetByMembersAsync(_fixture.Create(), _fixture.Create())); + } + + [Test] + public async Task Given_ValidMessage_When_AddAsync_Then_MessageAdded() + { + // Arrange + var chat = _fixture.Create(); + + await using var context = new GovorDbContext(_options); + var repository = new PrivateChatsRepository(context, _validator); + + // Act + await repository.AddAsync(chat); + + // Assert + Assert.That(context.PrivateChats.Count, Is.EqualTo(1)); + Assert.That(context.PrivateChats.First(), Is.EqualTo(chat)); + } + + [Test] + public async Task Given_InvalidMessage_When_AddAsync_Should_Throw_AdditionException() + { + // Arrange + await using var context = new GovorDbContext(_options); + var repository = new PrivateChatsRepository(context, _validator); + + // Act & Assert + Assert.ThrowsAsync(async () => await repository.AddAsync(default)); + } + + [Test] + public async Task Given_ExistMessage_When_Exist_Then_ReturnTrue() + { + // Arrange + var chat = _fixture.Create(); + + await using var context = new GovorDbContext(_options); + var repository = new PrivateChatsRepository(context, _validator); + + context.PrivateChats.Add(chat); + await context.SaveChangesAsync(); + + // Act + var result1 = repository.Exist(chat.UserAId, chat.UserBId); + var result2 = repository.Exist(chat.Id); + + + // Assert + Assert.That(result1, Is.True); + Assert.That(result2, Is.True); + } + + [Test] + public async Task Given_NotExistMessage_When_Exist_Then_ReturnFalse() + { + // Arrange + var chat = _fixture.Create(); + + await using var context = new GovorDbContext(_options); + var repository = new PrivateChatsRepository(context, _validator); + + // Act + var result1 = repository.Exist(chat.UserAId, chat.UserBId); + var result2 = repository.Exist(chat.Id); + + // Assert + Assert.That(result1, Is.False); + Assert.That(result2, Is.False); + } } \ No newline at end of file diff --git a/Govor.API.Tests/UnitTests/Infrastructure/Validators/ChatGroupValidatorTests.cs b/Govor.API.Tests/UnitTests/Infrastructure/Validators/ChatGroupValidatorTests.cs new file mode 100644 index 0000000..6dadf64 --- /dev/null +++ b/Govor.API.Tests/UnitTests/Infrastructure/Validators/ChatGroupValidatorTests.cs @@ -0,0 +1,7 @@ +namespace Govor.API.Tests.UnitTests.Infrastructure.Validators; + +[TestFixture] +public class ChatGroupValidatorTests +{ + +} \ No newline at end of file diff --git a/Govor.API.Tests/UnitTests/Infrastructure/Validators/PrivateChatValidatorTests.cs b/Govor.API.Tests/UnitTests/Infrastructure/Validators/PrivateChatValidatorTests.cs index 8abd1fd..43d54d1 100644 --- a/Govor.API.Tests/UnitTests/Infrastructure/Validators/PrivateChatValidatorTests.cs +++ b/Govor.API.Tests/UnitTests/Infrastructure/Validators/PrivateChatValidatorTests.cs @@ -1,7 +1,77 @@ +using AutoFixture; +using Govor.Core.Infrastructure.Validators; +using Govor.Core.Models; + namespace Govor.API.Tests.UnitTests.Infrastructure.Validators; [TestFixture] public class PrivateChatValidatorTests { + private IObjectValidator _validator = new PrivateChatValidator(); + private Fixture _fixture; + [SetUp] + public void SetUp() + { + _fixture = new Fixture(); + + _fixture.Behaviors + .OfType() + .ToList() + .ForEach(b => _fixture.Behaviors.Remove(b)); + + _fixture.Behaviors.Add(new OmitOnRecursionBehavior()); + } + + [Test] + public void Validate_PrivateChat_Valid() + { + // Arrange + var privateChat = _fixture.Create(); + + // Act & Assert + Assert.DoesNotThrow(() => _validator.Validate(privateChat)); + Assert.That(_validator.TryValidate(privateChat), Is.True); + } + + [Test] + public void Validate_When_PrivateChatIsNull_Invalid() + { + // Act & Assert + Assert.Throws>(() => _validator.Validate(default)); + Assert.That(_validator.TryValidate(default), Is.False); + } + + [Test] + public void Validate_When_PrivateChatIdIsEmpty_Invalid() + { + // Arrange + var privateChat = _fixture.Create(); + privateChat.Id = Guid.Empty; + // Act & Assert + Assert.Throws>(() => _validator.Validate(privateChat)); + Assert.That(_validator.TryValidate(privateChat), Is.False); + } + + [Test] + public void Validate_When_UserAIdIsEmpty_Invalid() + { + // Arrange + var privateChat = _fixture.Create(); + privateChat.UserAId = Guid.Empty; + // Act & Assert + Assert.Throws>(() => _validator.Validate(privateChat)); + Assert.That(_validator.TryValidate(privateChat), Is.False); + } + + [Test] + public void Validate_When_UserBIdIsEmpty_Invalid() + { + // Arrange + var privateChat = _fixture.Create(); + privateChat.UserBId = Guid.Empty; + // Act & Assert + Assert.Throws>(() => _validator.Validate(privateChat)); + Assert.That(_validator.TryValidate(privateChat), Is.False); + } } \ No newline at end of file diff --git a/Govor.API.Tests/UnitTests/Services/MessageServiceTests.cs b/Govor.API.Tests/UnitTests/Services/MessageServiceTests.cs index 3260d5b..8aefb5b 100644 --- a/Govor.API.Tests/UnitTests/Services/MessageServiceTests.cs +++ b/Govor.API.Tests/UnitTests/Services/MessageServiceTests.cs @@ -69,7 +69,7 @@ public class MessageServiceTests var result = await _messageService.SendMessageAsync(sendMessageParams); // Assert Assert.That(result, Is.Not.Null); - Assert.That(result.IsSuccess, Is.EqualTo(true)); + Assert.That(result.IsSuccess, Is.True); Assert.That(result.Exception, Is.Null); _mockMessagesRepo.Verify(r => r.AddAsync(It.Is(m => @@ -103,7 +103,7 @@ public class MessageServiceTests // Assert Assert.That(result, Is.Not.Null); - Assert.That(result.IsSuccess, Is.EqualTo(true)); + Assert.That(result.IsSuccess, Is.True); Assert.That(result.Exception, Is.Null); _mockMessagesRepo.Verify(r => r.AddAsync(It.Is(m => m.RecipientId == groupId && @@ -132,7 +132,7 @@ public class MessageServiceTests // Assert Assert.That(result, Is.Not.Null); - Assert.That(result.IsSuccess, Is.EqualTo(false)); + Assert.That(result.IsSuccess, Is.False); Assert.That(result.Exception, Is.Not.Null); Assert.That(result.Exception,Is.TypeOf()); Assert.That(result.Message, Is.Null); @@ -162,7 +162,7 @@ public class MessageServiceTests // Assert Assert.That(result, Is.Not.Null); - Assert.That(result.IsSuccess, Is.EqualTo(false)); + Assert.That(result.IsSuccess, Is.False); Assert.That(result.Exception, Is.Not.Null); Assert.That(result.Exception,Is.TypeOf()); Assert.That(result.Message, Is.Null); @@ -197,7 +197,7 @@ public class MessageServiceTests // Assert Assert.That(result, Is.Not.Null); - Assert.That(result.IsSuccess, Is.EqualTo(true)); + Assert.That(result.IsSuccess, Is.True); Assert.That(result.OriginalMessage, Is.Not.Null); Assert.That(messageId, Is.EqualTo(result.OriginalMessage!.Id)); @@ -225,7 +225,7 @@ public class MessageServiceTests // Assert Assert.That(result, Is.Not.Null); - Assert.That(result.IsSuccess, Is.EqualTo(false)); + Assert.That(result.IsSuccess, Is.False); Assert.That(result.Exception, Is.Not.Null); Assert.That(result.Exception,Is.TypeOf>()); Assert.That(result.OriginalMessage, Is.Null); @@ -248,7 +248,7 @@ public class MessageServiceTests // Assert Assert.That(result, Is.Not.Null); - Assert.That(result.IsSuccess, Is.EqualTo(false)); + Assert.That(result.IsSuccess, Is.False); Assert.That(result.Exception, Is.Not.Null); Assert.That(result.Exception,Is.TypeOf()); Assert.That(result.OriginalMessage, Is.Null); @@ -272,7 +272,7 @@ public class MessageServiceTests // Assert Assert.That(result, Is.Not.Null); - Assert.That(result.IsSuccess, Is.EqualTo(true)); + Assert.That(result.IsSuccess, Is.True); Assert.That(result.OriginalMessage, Is.Not.Null); Assert.That(messageId, Is.EqualTo(result.OriginalMessage!.Id)); _mockMessagesRepo.Verify(r => r.RemoveAsync(messageId), Times.Once); @@ -294,7 +294,7 @@ public class MessageServiceTests // Assert Assert.That(result, Is.Not.Null); - Assert.That(result.IsSuccess, Is.EqualTo(false)); + Assert.That(result.IsSuccess, Is.False); Assert.That(result.Exception, Is.Not.Null); Assert.That(result.Exception,Is.TypeOf>()); Assert.That(result.OriginalMessage, Is.Null); @@ -317,7 +317,7 @@ public class MessageServiceTests // Assert Assert.That(result, Is.Not.Null); - Assert.That(result.IsSuccess, Is.EqualTo(false)); + Assert.That(result.IsSuccess, Is.False); Assert.That(result.Exception, Is.Not.Null); Assert.That(result.Exception,Is.TypeOf()); Assert.That(result.OriginalMessage, Is.Null); diff --git a/Govor.Core/Infrastructure/Validators/ChatGroupValidator.cs b/Govor.Core/Infrastructure/Validators/ChatGroupValidator.cs index d6c8b58..c8e70ff 100644 --- a/Govor.Core/Infrastructure/Validators/ChatGroupValidator.cs +++ b/Govor.Core/Infrastructure/Validators/ChatGroupValidator.cs @@ -4,13 +4,41 @@ namespace Govor.Core.Infrastructure.Validators; public class ChatGroupValidator : IObjectValidator { - public void Validate(ChatGroup objectToValidate) + public void Validate(ChatGroup chat) { - throw new NotImplementedException(); + try + { + if(chat is null) + throw new ArgumentNullException(nameof(chat)); + if(chat.Id == Guid.Empty) + throw new ArgumentException("Id of chat group can't be empty",nameof(chat.Id)); + if(string.IsNullOrEmpty(chat.Name)) + throw new ArgumentException("Name of chat group can't be empty",nameof(chat.Name)); + if(chat.Description is null) + throw new ArgumentException("Description of chat group can't be null",nameof(chat.Description)); + if(chat.ImageId == Guid.Empty) + throw new ArgumentException("ImageId of chat group can't be empty",nameof(chat.ImageId)); + if(chat.IsPrivate && chat.InviteCodes.Count <= 0) + throw new ArgumentException("Private group must have invitation links",nameof(chat.InviteCodes)); + if(chat.Admins.Count <= 0) + throw new ArgumentException("Chat must have owner",nameof(chat.Admins)); + } + catch (Exception ex) + { + throw new InvalidObjectException(ex); + } } - public bool TryValidate(ChatGroup objectToValidate) + public bool TryValidate(ChatGroup chat) { - throw new NotImplementedException(); + try + { + Validate(chat); + return true; + } + catch (Exception) + { + return false; + } } } \ No newline at end of file diff --git a/Govor.Core/Models/PrivateChat.cs b/Govor.Core/Models/PrivateChat.cs index 82ef1e5..51f0921 100644 --- a/Govor.Core/Models/PrivateChat.cs +++ b/Govor.Core/Models/PrivateChat.cs @@ -6,4 +6,12 @@ public class PrivateChat public Guid UserAId { get; set; } public Guid UserBId { get; set; } public List Messages { get; set; } = new List(); + + public override bool Equals(object? obj) + { + PrivateChat other = obj as PrivateChat; + return Id == other.Id && + UserAId == other.UserAId && + UserBId == other.UserBId; + } } \ No newline at end of file