diff --git a/PropertySearch.sln b/PropertySearch.sln index dfb282f..e0e1e4f 100644 --- a/PropertySearch.sln +++ b/PropertySearch.sln @@ -18,8 +18,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution-items", "solution- EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PropertySearch.Api", "src\PropertySearch.Api\PropertySearch.Api.csproj", "{FF34EFF9-B627-430E-954F-EE4168833061}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PropertySearch.UnitTests", "tests\PropertySearch.UnitTests\PropertySearch.UnitTests.csproj", "{92D4C012-C699-421A-901E-1DF8A33810B8}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PropertySearch.IntegrationTests", "tests\PropertySearch.IntegrationTests\PropertySearch.IntegrationTests.csproj", "{DE64B6EC-8CA2-4E4E-9F0D-799D6B816C85}" EndProject Global @@ -32,10 +30,6 @@ Global {FF34EFF9-B627-430E-954F-EE4168833061}.Debug|Any CPU.Build.0 = Debug|Any CPU {FF34EFF9-B627-430E-954F-EE4168833061}.Release|Any CPU.ActiveCfg = Release|Any CPU {FF34EFF9-B627-430E-954F-EE4168833061}.Release|Any CPU.Build.0 = Release|Any CPU - {92D4C012-C699-421A-901E-1DF8A33810B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {92D4C012-C699-421A-901E-1DF8A33810B8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {92D4C012-C699-421A-901E-1DF8A33810B8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {92D4C012-C699-421A-901E-1DF8A33810B8}.Release|Any CPU.Build.0 = Release|Any CPU {DE64B6EC-8CA2-4E4E-9F0D-799D6B816C85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DE64B6EC-8CA2-4E4E-9F0D-799D6B816C85}.Debug|Any CPU.Build.0 = Debug|Any CPU {DE64B6EC-8CA2-4E4E-9F0D-799D6B816C85}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -49,7 +43,6 @@ Global EndGlobalSection GlobalSection(NestedProjects) = preSolution {FF34EFF9-B627-430E-954F-EE4168833061} = {716322DB-9AF3-454A-A097-D22A6DAD7E95} - {92D4C012-C699-421A-901E-1DF8A33810B8} = {57C441AE-BF00-4921-90B8-E7F89B8BA61D} {DE64B6EC-8CA2-4E4E-9F0D-799D6B816C85} = {57C441AE-BF00-4921-90B8-E7F89B8BA61D} EndGlobalSection EndGlobal diff --git a/tests/PropertySearch.UnitTests/AccommodationServiceTests.cs b/tests/PropertySearch.UnitTests/AccommodationServiceTests.cs deleted file mode 100644 index b33e0d8..0000000 --- a/tests/PropertySearch.UnitTests/AccommodationServiceTests.cs +++ /dev/null @@ -1,375 +0,0 @@ -using AutoMapper; -using FluentAssertions; -using FluentValidation; -using Microsoft.Extensions.Logging; -using NSubstitute; -using NSubstitute.ReturnsExtensions; -using PropertySearch.Api.Common; -using PropertySearch.Api.Common.Constants; -using PropertySearch.Api.Domain; -using PropertySearch.Api.Entities; -using PropertySearch.Api.Repositories.Abstract; -using PropertySearch.Api.Services; -using PropertySearch.Api.Services.Abstract; -using PropertySearch.Api.Validations; - -namespace PropertySearch.UnitTests; - -public class AccommodationServiceTests -{ - private readonly AccommodationService _sut; - private readonly IUserValidatorService _userValidator; - - private readonly IAccommodationRepository _accommodationRepository = Substitute.For(); - private readonly IMapper _mapper = Substitute.For(); - private readonly IUserReceiverRepository _userReceiver = Substitute.For(); - private readonly ILogger _logger = Substitute.For>(); - private readonly IValidator _accommodationValidator = new AccommodationDomainValidator(); - private readonly IValidator _locationValidator = new LocationDomainValidator(); - private readonly ILogger _accommodationLogger = Substitute.For>(); - - public AccommodationServiceTests() - { - _userValidator = new UserValidatorService(_userReceiver, _logger); - _sut = new AccommodationService(_accommodationRepository, - _mapper, - _userValidator, - _accommodationValidator, - _locationValidator, - _accommodationLogger); - } - - [Fact] - public async Task CreateAccommodation_ShouldCreateAccommodation_WhenAllParametersAreValid() - { - // Arrange - Guid accommodationId = Guid.NewGuid(), userId = Guid.NewGuid(); - const string title = "Test title", description = "Some description"; - const int price = 980; - - var location = new LocationDomain { Id = Guid.NewGuid(), Country = "UA", Region = "Kyiv City", City = "Kyiv", Address = "Yavornitskogo 28" }; - var accommodation = new AccommodationDomain { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price, Location = location, PhotoUri = null }; - var accommodationEntity = new AccommodationEntity { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price }; - - _userReceiver.GetByIdAsync(userId).Returns(new UserEntity { Id = userId, IsLandlord = true }); - _mapper.Map(accommodation).Returns(accommodationEntity); - _accommodationRepository.CreateAsync(accommodationEntity, CancellationToken.None).Returns(true); - - // Act - var actual = await _sut.CreateAccommodationAsync(accommodation, CancellationToken.None); - - // Assert - actual.Succeeded.Should().Be(true); - await _accommodationRepository.Received(1).CreateAsync(Arg.Any(), CancellationToken.None); - } - [Fact] - public async Task CreateAccommodation_ShouldNotCreateAccommodation_LocationIsNull() - { - // Arrange - Guid accommodationId = Guid.NewGuid(), userId = Guid.NewGuid(); - const string title = "Test title", description = "Some description"; - const int price = 980; - - var accommodation = new AccommodationDomain { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price, Location = null, PhotoUri = null }; - var accommodationEntity = new AccommodationEntity { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price }; - - _userReceiver.GetByIdAsync(userId).Returns(new UserEntity { Id = userId, IsLandlord = true }); - _mapper.Map(accommodation).Returns(accommodationEntity); - _accommodationRepository.CreateAsync(accommodationEntity, CancellationToken.None).Returns(true); - - // Act - var actual = await _sut.CreateAccommodationAsync(accommodation, CancellationToken.None); - - // Assert - actual.Succeeded.Should().Be(false); - actual.ErrorMessage.Should().Contain(ErrorMessages.Accommodation.Validation.NullLocation); - } - [Fact] - public async Task CreateAccommodation_ShouldNotCreateAccommodation_UserDoesNotExist() - { - // Arrange - Guid accommodationId = Guid.NewGuid(), userId = Guid.NewGuid(); - const string title = "Test title", description = "Some description"; - const int price = 980; - - var location = new LocationDomain { Id = Guid.NewGuid(), Country = "UA", Region = "Kyiv City", City = "Kyiv", Address = "Yavornitskogo 28" }; - var accommodation = new AccommodationDomain { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price, Location = location, PhotoUri = null }; - var accommodationEntity = new AccommodationEntity { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price }; - - _userReceiver.GetByIdAsync(userId).ReturnsNull(); - _mapper.Map(accommodation).Returns(accommodationEntity); - _accommodationRepository.CreateAsync(accommodationEntity, CancellationToken.None).Returns(true); - - // Act - var actual = await _sut.CreateAccommodationAsync(accommodation, CancellationToken.None); - - // Assert - actual.Succeeded.Should().Be(false); - actual.ErrorMessage.Should().BeEquivalentTo(ErrorMessages.User.NotFound); - await _accommodationRepository.Received(0).CreateAsync(Arg.Any(), CancellationToken.None); - } - [Fact] - public async Task CreateAccommodation_ShouldNotCreateAccommodation_UserIsNotLandlord() - { - // Arrange - Guid accommodationId = Guid.NewGuid(), userId = Guid.NewGuid(); - const string title = "Test title", description = "Some description"; - const int price = 980; - - var location = new LocationDomain { Id = Guid.NewGuid(), Country = "UA", Region = "Kyiv City", City = "Kyiv", Address = "Yavornitskogo 28" }; - var accommodation = new AccommodationDomain { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price, Location = location, PhotoUri = null }; - var accommodationEntity = new AccommodationEntity { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price }; - - _userReceiver.GetByIdAsync(userId).Returns(new UserEntity {Id = userId, IsLandlord = false }); - _mapper.Map(accommodation).Returns(accommodationEntity); - _accommodationRepository.CreateAsync(accommodationEntity, CancellationToken.None).Returns(true); - - // Act - var actual = await _sut.CreateAccommodationAsync(accommodation, CancellationToken.None); - - // Assert - actual.Succeeded.Should().Be(false); - actual.ErrorMessage.Should().BeEquivalentTo(ErrorMessages.User.NotLandlord); - await _accommodationRepository.Received(0).CreateAsync(Arg.Any(), CancellationToken.None); - } - [Theory] - [InlineData("0f8fad5b-d9cb-469f-a165-70867728950e", "7c9e6679-7425-40de-944b-e07fc1f90ae7", "Invalid test", "User exists", -980)] - [InlineData("0f8fad5b-d9cb-469f-a165-70867728950e", "7c9e6679-7425-40de-944b-e07fc1f90ae7", "", "Invalid test", 980)] - public async Task CreateAccommodation_ShouldNotCreateAccommodation_WhenParametersAreInvalid( - string accommodationIdentifier, string userIdentifier, string title, string description, int price) - { - // Arrange - Guid accommodationId = Guid.Parse(accommodationIdentifier), userId = Guid.Parse(userIdentifier); - - var location = new LocationDomain { Id = Guid.NewGuid(), Country = "UA", Region = "Kyiv City", City = "Kyiv", Address = "Yavornitskogo 28" }; - var accommodation = new AccommodationDomain { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price, Location = location, PhotoUri = null }; - var accommodationEntity = new AccommodationEntity { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price }; - - _userReceiver.GetByIdAsync(userId).Returns(new UserEntity {Id = userId, IsLandlord = true }); - _mapper.Map(accommodation).Returns(accommodationEntity); - _accommodationRepository.CreateAsync(accommodationEntity, CancellationToken.None).Returns(true); - - // Act - var actual = await _sut.CreateAccommodationAsync(accommodation, CancellationToken.None); - - // Assert - actual.Succeeded.Should().Be(false); - } - - [Fact] - public async Task UpdateAccommodation_ShouldUpdateAccommodation_WhenAllParametersAreValid() - { - // Arrange - Guid accommodationId = Guid.NewGuid(), userId = Guid.NewGuid(); - const string title = "Unit test", description = "Updating test"; - const int price = 980; - - var location = new LocationDomain { Id = Guid.NewGuid(), Country = "UA", Region = "Kyiv City", City = "Kyiv", Address = "Yavornitskogo 28" }; - var accommodation = new AccommodationDomain { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price, Location = location, PhotoUri = null }; - var accommodationEntity = new AccommodationEntity { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price }; - - _userReceiver.GetByIdWithAccommodationsAsync(userId).Returns(new UserEntity - { - Id = userId, - IsLandlord = true, - Accommodations = new List - { - new AccommodationEntity { Id = accommodationId, UserId = userId } - } - }); - _mapper.Map(accommodation).Returns(accommodationEntity); - _accommodationRepository.UpdateAsync(accommodationEntity, CancellationToken.None).Returns(new OperationResult()); - - // Act - var actual = await _sut.UpdateAccommodationAsync(accommodation, CancellationToken.None); - - // Assert - actual.Succeeded.Should().Be(true); - await _accommodationRepository.Received(1).UpdateAsync(Arg.Any(), CancellationToken.None); - } - [Fact] - public async Task UpdateAccommodation_ShouldNotUpdateAccommodation_UserDoesNotOwnAccommodation() - { - // Arrange - Guid accommodationId = Guid.NewGuid(), userId = Guid.NewGuid(); - const string title = "Unit test", description = "Updating test"; - const int price = 980; - - var location = new LocationDomain { Id = Guid.NewGuid(), Country = "UA", Region = "Kyiv City", City = "Kyiv", Address = "Yavornitskogo 28" }; - var accommodation = new AccommodationDomain { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price, Location = location, PhotoUri = null }; - var accommodationEntity = new AccommodationEntity { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price }; - - _userReceiver.GetByIdWithAccommodationsAsync(userId).Returns(new UserEntity - { - Id = userId, - IsLandlord = true, - Accommodations = new List - { - new AccommodationEntity { Id = Guid.NewGuid(), UserId = userId } - } - }); - _mapper.Map(accommodation).Returns(accommodationEntity); - _accommodationRepository.UpdateAsync(accommodationEntity, CancellationToken.None).Returns(new OperationResult()); - - // Act - var actual = await _sut.UpdateAccommodationAsync(accommodation, CancellationToken.None); - - // Assert - actual.Succeeded.Should().Be(false); - actual.ErrorMessage.Should().BeEquivalentTo(ErrorMessages.User.HasNoAccess); - } - [Fact] - public async Task UpdateAccommodation_ShouldNotUpdateAccommodation_UserIsNotLandlord() - { - // Arrange - Guid accommodationId = Guid.NewGuid(), userId = Guid.NewGuid(); - const string title = "Unit test", description = "Updating test"; - const int price = 980; - - var location = new LocationDomain { Id = Guid.NewGuid(), Country = "UA", Region = "Kyiv City", City = "Kyiv", Address = "Yavornitskogo 28" }; - var accommodation = new AccommodationDomain { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price, Location = location, PhotoUri = null }; - var accommodationEntity = new AccommodationEntity { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price }; - - _userReceiver.GetByIdWithAccommodationsAsync(userId).Returns(new UserEntity - { - Id = userId, - IsLandlord = false, - Accommodations = new List - { - new AccommodationEntity { Id = Guid.NewGuid(), UserId = userId } - } - }); - _mapper.Map(accommodation).Returns(accommodationEntity); - _accommodationRepository.UpdateAsync(accommodationEntity, CancellationToken.None).Returns(new OperationResult()); - - // Act - var actual = await _sut.UpdateAccommodationAsync(accommodation, CancellationToken.None); - - // Assert - actual.Succeeded.Should().Be(false); - actual.ErrorMessage.Should().BeEquivalentTo(ErrorMessages.User.NotLandlord); - } - [Theory] - [InlineData("0f8fad5b-d9cb-469f-a165-70867728950e", "7c9e6679-7425-40de-944b-e07fc1f90ae7", "Invalid test", "User exists", -980)] - [InlineData("0f8fad5b-d9cb-469f-a165-70867728950e", "7c9e6679-7425-40de-944b-e07fc1f90ae7", "", "Invalid test", 980)] - public async Task UpdateAccommodation_ShouldNotCreateAccommodation_WhenParametersAreInvalid( - string accommodationIdentifier, string userIdentifier, string title, string description, int price) - { - // Arrange - Guid accommodationId = Guid.Parse(accommodationIdentifier), userId = Guid.Parse(userIdentifier); - - var location = new LocationDomain { Id = Guid.NewGuid(), Country = "UA", Region = "Kyiv City", City = "Kyiv", Address = "Yavornitskogo 28" }; - var accommodation = new AccommodationDomain { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price, Location = location, PhotoUri = null }; - var accommodationEntity = new AccommodationEntity { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price }; - - _userReceiver.GetByIdWithAccommodationsAsync(userId).Returns(new UserEntity - { - Id = userId, - IsLandlord = true, - Accommodations = new List - { - new AccommodationEntity { Id = accommodationId, UserId = userId } - } - }); - _mapper.Map(accommodation).Returns(accommodationEntity); - _accommodationRepository.UpdateAsync(accommodationEntity, CancellationToken.None).Returns(new OperationResult()); - - // Act - var actual = await _sut.UpdateAccommodationAsync(accommodation, CancellationToken.None); - - // Assert - actual.Succeeded.Should().Be(false); - } - - [Fact] - public async Task DeleteAccommodation_ShouldDeleteAccommodation_WhenAllParametersAreValid() - { - // Arrange - Guid accommodationId = Guid.NewGuid(), userId = Guid.NewGuid(); - const string title = "Unit test", description = "Deleting test"; - const int price = 980; - - var location = new LocationDomain { Id = Guid.NewGuid(), Country = "UA", Region = "Kyiv City", City = "Kyiv", Address = "Yavornitskogo 28" }; - var accommodation = new AccommodationDomain { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price, Location = location, PhotoUri = null }; - var accommodationEntity = new AccommodationEntity { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price }; - - _userReceiver.GetByIdWithAccommodationsAsync(userId).Returns(new UserEntity - { - Id = userId, - IsLandlord = true, - Accommodations = new List - { - new AccommodationEntity { Id = accommodationId, UserId = userId } - } - }); - _mapper.Map(accommodation).Returns(accommodationEntity); - _accommodationRepository.DeleteAsync(accommodationId, CancellationToken.None).Returns(new OperationResult()); - - // Act - var actual = await _sut.DeleteAccommodationAsync(userId, accommodationId, CancellationToken.None); - - // Assert - actual.Succeeded.Should().Be(true); - await _accommodationRepository.Received(1).DeleteAsync(Arg.Any(), CancellationToken.None); - } - [Fact] - public async Task DeleteAccommodation_ShouldNotDeleteAccommodation_UserDoesNotHaveAccommodation() - { - // Arrange - Guid accommodationId = Guid.NewGuid(), userId = Guid.NewGuid(); - const string title = "Unit test", description = "Updating test"; - const int price = 980; - - var accommodation = new AccommodationDomain { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price }; - var accommodationEntity = new AccommodationEntity { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price }; - - _userReceiver.GetByIdWithAccommodationsAsync(userId).Returns(new UserEntity - { - Id = userId, - IsLandlord = true, - Accommodations = new List - { - new AccommodationEntity { Id = Guid.NewGuid(), UserId = userId } - } - }); - _mapper.Map(accommodation).Returns(accommodationEntity); - _accommodationRepository.UpdateAsync(accommodationEntity, CancellationToken.None).Returns(new OperationResult()); - - // Act - var actual = await _sut.DeleteAccommodationAsync(userId, accommodationId, CancellationToken.None); - - // Assert - actual.Succeeded.Should().Be(false); - actual.ErrorMessage.Should().BeEquivalentTo(ErrorMessages.User.HasNoAccess); - } - [Fact] - public async Task DeleteAccommodation_ShouldNotDeleteAccommodation_UserIsNotLandlord() - { - // Arrange - Guid accommodationId = Guid.NewGuid(), userId = Guid.NewGuid(); - const string title = "Unit test", description = "Updating test"; - const int price = 980; - - var accommodation = new AccommodationDomain { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price }; - var accommodationEntity = new AccommodationEntity { Id = accommodationId, Title = title, Description = description, UserId = userId, Price = price }; - - _userReceiver.GetByIdWithAccommodationsAsync(userId).Returns(new UserEntity - { - Id = userId, - IsLandlord = false, - Accommodations = new List - { - new AccommodationEntity { Id = accommodationId, UserId = userId } - } - }); - _mapper.Map(accommodation).Returns(accommodationEntity); - _accommodationRepository.UpdateAsync(accommodationEntity, CancellationToken.None).Returns(new OperationResult()); - - // Act - var actual = await _sut.DeleteAccommodationAsync(userId, accommodationId, CancellationToken.None); - - // Assert - actual.Succeeded.Should().Be(false); - actual.ErrorMessage.Should().BeEquivalentTo(ErrorMessages.User.NotLandlord); - } -} \ No newline at end of file diff --git a/tests/PropertySearch.UnitTests/ContactServiceTests.cs b/tests/PropertySearch.UnitTests/ContactServiceTests.cs deleted file mode 100644 index 7cbeca6..0000000 --- a/tests/PropertySearch.UnitTests/ContactServiceTests.cs +++ /dev/null @@ -1,240 +0,0 @@ -using AutoMapper; -using FluentAssertions; -using Microsoft.Extensions.Logging; -using NSubstitute; -using NSubstitute.ReturnsExtensions; -using PropertySearch.Api.Common; -using PropertySearch.Api.Common.Constants; -using PropertySearch.Api.Domain; -using PropertySearch.Api.Entities; -using PropertySearch.Api.Repositories.Abstract; -using PropertySearch.Api.Services; -using PropertySearch.Api.Services.Abstract; - -namespace PropertySearch.UnitTests; - -public class ContactServiceTests -{ - private readonly IContactService _sut; - - private readonly IUserReceiverRepository _userReceiverRepository = Substitute.For(); - private readonly IContactsRepository _contactsRepository = Substitute.For(); - private readonly IMapper _mapper = Substitute.For(); - private readonly ILogger _logger = Substitute.For>(); - public ContactServiceTests() - { - _sut = new ContactService(_userReceiverRepository, _contactsRepository, _mapper, _logger); - } - - [Fact] - public async Task GetUserContacts_ShouldReturnOneContacts_WhenContactsExists() - { - // Arrange - Guid userId = Guid.Parse("06012f2e-caeb-4504-9685-10fde03552de"), contactId = Guid.Parse("c98d1be7-3a01-4b33-aeab-9a39b147f865"); - string type = "Email address", email = "user@email.com"; - var contacts = new List - { - new ContactEntity - { - Id = contactId, - ContactType = type, - Content = email, - UserId = userId, - CreationTime = DateTime.Now - } - }; - - _contactsRepository.GetUserContactsAsync(userId).Returns(contacts); - _mapper.Map(contacts.First()).Returns(new ContactDomain - { - Id = contactId, - ContactType = type, - Content = email - }); - // Act - var actual = await _sut.GetUserContactsAsync(userId); - - // Assert - actual.Should().HaveCount(1); - } - [Fact] - public async Task GetUserContacts_ShouldReturnEmptyList_WhenContactsDoesNotExist() - { - // Arrange - Guid userId = Guid.Parse("06012f2e-caeb-4504-9685-10fde03552de"); - - _contactsRepository.GetUserContactsAsync(userId).ReturnsNull(); - // Act - var actual = await _sut.GetUserContactsAsync(userId); - - // Assert - actual.Should().BeEmpty(); - } - [Fact] - public async Task AddContactToUser_ShouldAddContact_WhenDataIsValidAndUserExists() - { - // Arrange - Guid userId = Guid.Parse("06012f2e-caeb-4504-9685-10fde03552de"), contactId = Guid.Parse("c98d1be7-3a01-4b33-aeab-9a39b147f865"); - string type = "Email address", email = "user@email.com"; - var contact = new ContactEntity - { - Id = contactId, - ContactType = type, - Content = email, - UserId = userId, - CreationTime = DateTime.Now - }; - var contactDomain = new ContactDomain - { - Id = contactId, - ContactType = type, - Content = email - }; - - _userReceiverRepository.GetByIdWithContactsAsync(userId).Returns(new UserEntity - { - Id = userId, - Contacts = new List() - }); - _contactsRepository.AddContactToUserAsync(userId, contact).Returns(new OperationResult()); - _mapper.Map(contactDomain).Returns(contact); - - // Act - var actual = await _sut.AddContactToUserAsync(userId, contactDomain); - - // Assert - actual.Succeeded.Should().Be(true); - actual.ErrorMessage.Should().BeNullOrEmpty(); - } - [Fact] - public async Task AddContactToUser_ShouldNotAddContact_WhenUserDoesNotExist() - { - // Arrange - Guid userId = Guid.Parse("06012f2e-caeb-4504-9685-10fde03552de"), contactId = Guid.Parse("c98d1be7-3a01-4b33-aeab-9a39b147f865"); - string type = "Email address", email = "user@email.com"; - var contact = new ContactEntity - { - Id = contactId, - ContactType = type, - Content = email, - UserId = userId, - CreationTime = DateTime.Now - }; - var contactDomain = new ContactDomain - { - Id = contactId, - ContactType = type, - Content = email - }; - - _userReceiverRepository.GetByIdWithContactsAsync(userId).ReturnsNull(); - - // Act - var actual = await _sut.AddContactToUserAsync(userId, contactDomain); - - // Assert - actual.Succeeded.Should().Be(false); - actual.ErrorMessage.Should().Be(ErrorMessages.User.NotFound); - } - [Fact] - public async Task AddContactToUser_ShouldNotAddContact_WhenUserAlreadyHasSame() - { - // Arrange - Guid userId = Guid.Parse("06012f2e-caeb-4504-9685-10fde03552de"), contactId = Guid.Parse("c98d1be7-3a01-4b33-aeab-9a39b147f865"); - string type = "Email address", email = "user@email.com"; - var contact = new ContactEntity - { - Id = contactId, - ContactType = type, - Content = email, - UserId = userId, - CreationTime = DateTime.Now - }; - var contactDomain = new ContactDomain - { - Id = contactId, - ContactType = type, - Content = email - }; - - _userReceiverRepository.GetByIdWithContactsAsync(userId).Returns(new UserEntity - { - Id = userId, - Contacts = new List { contact } - }); - - // Act - var actual = await _sut.AddContactToUserAsync(userId, contactDomain); - - // Assert - actual.Succeeded.Should().Be(false); - actual.ErrorMessage.Should().Be(ErrorMessages.Contacts.AlreadyExist); - } - [Fact] - public async Task DeleteContactFromUser_ShouldDeleteContact_WhenUserExist() - { - // Arrange - Guid userId = Guid.Parse("06012f2e-caeb-4504-9685-10fde03552de"), contactId = Guid.Parse("c98d1be7-3a01-4b33-aeab-9a39b147f865"); - string type = "Email address", email = "user@email.com"; - var contact = new ContactEntity - { - Id = contactId, - ContactType = type, - Content = email, - UserId = userId, - CreationTime = DateTime.Now - }; - var contactDomain = new ContactDomain - { - Id = contactId, - ContactType = type, - Content = email - }; - - _userReceiverRepository.GetByIdWithContactsAsync(userId).Returns(new UserEntity - { - Id = userId, - Contacts = new List() - }); - _contactsRepository.DeleteContactAsync(contactId) - .Returns(new OperationResult()); - - // Act - var actual = await _sut.DeleteAsync(userId, contactId); - - // Assert - actual.Succeeded.Should().Be(true); - actual.ErrorMessage.Should().BeNullOrEmpty(); - } - [Fact] - public async Task DeleteContactFromUser_ShouldNotDeleteContact_WhenUserDoesNotExist() - { - // Arrange - Guid userId = Guid.Parse("06012f2e-caeb-4504-9685-10fde03552de"), contactId = Guid.Parse("c98d1be7-3a01-4b33-aeab-9a39b147f865"); - string type = "Email address", email = "user@email.com"; - var contact = new ContactEntity - { - Id = contactId, - ContactType = type, - Content = email, - UserId = userId, - CreationTime = DateTime.Now - }; - var contactDomain = new ContactDomain - { - Id = contactId, - ContactType = type, - Content = email - }; - - _userReceiverRepository.GetByIdWithContactsAsync(userId) - .ReturnsNull(); - - // Act - var actual = await _sut.DeleteAsync(userId, contactId); - - // Assert - actual.Succeeded.Should().Be(false); - actual.ErrorMessage.Should().Be(ErrorMessages.User.NotFound); - } -} diff --git a/tests/PropertySearch.UnitTests/IdentityServiceTests.cs b/tests/PropertySearch.UnitTests/IdentityServiceTests.cs deleted file mode 100644 index 241cff4..0000000 --- a/tests/PropertySearch.UnitTests/IdentityServiceTests.cs +++ /dev/null @@ -1,193 +0,0 @@ -using AutoMapper; -using FluentAssertions; -using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Identity.UI.Services; -using Microsoft.Extensions.Logging; -using NSubstitute; -using NSubstitute.ReturnsExtensions; -using PropertySearch.Api.Common.Constants; -using PropertySearch.Api.Domain; -using PropertySearch.Api.Entities; -using PropertySearch.Api.Repositories.Abstract; -using PropertySearch.Api.Services; -using PropertySearch.Api.Services.Abstract; - -namespace PropertySearch.UnitTests; - -public class IdentityServiceTests -{ - private readonly IdentityService _sut; - - private readonly IUserRepository _userRepository = Substitute.For(); - private readonly IRoleRepository _roleRepository = Substitute.For(); - private readonly ISignInService _signInService = Substitute.For(); - private readonly IMapper _mapper = Substitute.For(); - private readonly IUserReceiverRepository _userReceiver = Substitute.For(); - private readonly ILogger _logger = Substitute.For>(); - private readonly ITokenProvider _tokenProvider = Substitute.For(); - private readonly IEmailSender _emailSender = Substitute.For(); - private readonly IHtmlMessageBuilder _htmlMessageBuilder = Substitute.For(); - public IdentityServiceTests() - { - var tokenProvider = - _sut = new IdentityService(_userRepository, - _signInService, - _roleRepository, - _logger, - _mapper, - _userReceiver, - _tokenProvider, - _emailSender, - _htmlMessageBuilder); - } - - [Fact] - public async Task Register_ShouldRegisterUser_WhenAllParametersAreValid() - { - // Arrange - string userRoleName = "user"; - var user = new UserDomain { Id = Guid.NewGuid(), Username = "System Under Test", Email = "unit@test.com", IsLandlord = false, Password = "qwerty123", Information = string.Empty }; - var entity = new UserEntity { Id = user.Id, UserName = user.Username, Email = user.Email, IsLandlord = user.IsLandlord, PasswordHash = string.Empty, Information = user.Information, Contacts = new List() }; - _mapper.Map(user).Returns(entity); - _userRepository.FindByEmailAsync(entity.Email).ReturnsNull(); - _userRepository.CreateAsync(entity, user.Password).Returns(IdentityResult.Success); - _roleRepository.FindByNameAsync(userRoleName).Returns(new IdentityRole { Id = Guid.NewGuid(), Name = userRoleName, NormalizedName = userRoleName.ToUpper(), ConcurrencyStamp = Guid.NewGuid().ToString() }); - _userRepository.AddToRoleAsync(entity, userRoleName).Returns(IdentityResult.Success); - - // Act - var actual = await _sut.RegisterAsync(user); - - // Assert - actual.Succeeded.Should().Be(true); - await _userRepository.Received(1).CreateAsync(Arg.Any(), Arg.Any()); - } - [Fact] - public async Task Register_ShouldNotRegisterUser_WhenUserWithSameEmailAlreadyExists() - { - // Arrange - var user = new UserDomain { Id = Guid.NewGuid(), Username = "System Under Test", Email = "unit@test.com", IsLandlord = false, Password = "qwerty123", Information = string.Empty }; - var entity = new UserEntity { Id = user.Id, UserName = user.Username, Email = user.Email, IsLandlord = user.IsLandlord, PasswordHash = string.Empty, Information = user.Information, Contacts = new List() }; - _mapper.Map(user).Returns(entity); - _userRepository.FindByEmailAsync(entity.Email).Returns(new UserEntity { Id = Guid.NewGuid() }); - - // Act - var actual = await _sut.RegisterAsync(user); - - // Assert - actual.Succeeded.Should().Be(false); - actual.ErrorMessage.Should().BeEquivalentTo(ErrorMessages.User.SameEmail); - } - [Fact] - public async Task Login_ShouldLogin_WhenAllParametersAreValid() - { - // Arrange - string username = "xunit", password = "correctpassword"; - _signInService.PasswordSignInAsync(username, password, false, false).Returns(SignInResult.Success); - // Act - var actual = await _sut.LoginAsync(username, password); - - // Assert - actual.Succeeded.Should().Be(true); - await _signInService.Received(1).PasswordSignInAsync(username, password, false, false); - } - [Fact] - public async Task Login_ShouldNotLogin_WhenCredentialsIsWrong() - { - // Arrange - string username = "xunit", password = "incorrectpassword"; - _signInService.PasswordSignInAsync(username, password, false, false).Returns(SignInResult.Failed); - // Act - var actual = await _sut.LoginAsync(username, password); - - // Assert - actual.Succeeded.Should().Be(false); - actual.ErrorMessage.Should().BeEquivalentTo(ErrorMessages.User.WrongCredentials); - await _signInService.Received(1).PasswordSignInAsync(username, password, false, false); - } - [Fact] - public async Task GetUserById_ShouldReturnUser_WhenUserExists() - { - // Arrange - var user = new UserDomain { Id = Guid.NewGuid(), Username = "System Under Test", Email = "unit@test.com", IsLandlord = false, Password = "qwerty123", Information = string.Empty }; - var entity = new UserEntity { Id = user.Id, UserName = user.Username, Email = user.Email, IsLandlord = user.IsLandlord, PasswordHash = string.Empty, Information = user.Information, Contacts = new List() }; - _userReceiver.GetByIdAsync(user.Id).Returns(entity); - _mapper.Map(entity).Returns(user); - - // Act - var actual = await _sut.GetUserByIdAsync(user.Id); - - // Assert - actual.Should().NotBeNull(); - } - [Fact] - public async Task GetUserById_ShouldReturnNull_WhenUserDoesNotExist() - { - // Arrange - var user = new UserDomain { Id = Guid.NewGuid(), Username = "System Under Test", Email = "unit@test.com", IsLandlord = false, Password = "qwerty123", Information = string.Empty }; - _userReceiver.GetByIdAsync(user.Id).ReturnsNull(); - - // Act - var actual = await _sut.GetUserByIdAsync(user.Id); - - // Assert - actual.Should().BeNull(); - } - [Fact] - public async Task UpdateUserFields_ShouldUpdateFields_WhenAllParametersAreValid() - { - // Arrange - string newUsername = "Changed username", newInformation = "Some information"; - var contacts = new List { new ContactDomain { Id = Guid.NewGuid(), ContactType = "Email address", Content = "unit@test.com" } }; - var contactsEntity = contacts.Select(x => new ContactEntity { Id = x.Id, Content = x.Content, ContactType = x.ContactType, CreationTime = DateTime.Now }).ToList(); - - var user = new UserDomain { Id = Guid.NewGuid(), Username = "System Under Test", Email = "unit@test.com", IsLandlord = false, Password = "qwerty123", Information = string.Empty }; - var userInDatabase = new UserEntity { Id = user.Id, UserName = user.Username, Email = user.Email, IsLandlord = user.IsLandlord, PasswordHash = string.Empty, Information = user.Information, Contacts = new List() }; - _userReceiver.GetByIdWithContactsAsync(user.Id).Returns(userInDatabase); - _userRepository.CheckPasswordAsync(userInDatabase, user.Password).Returns(true); - _userRepository.UpdateFieldsAsync(userInDatabase, newUsername, newInformation).Returns(IdentityResult.Success); - _mapper.Map(contacts[0]).Returns(contactsEntity[0]); - - // Act - var actual = await _sut.UpdateUserFieldsAsync(user.Id, newUsername, newInformation, user.Password); - - // Assert - actual.Succeeded.Should().Be(true); - await _userRepository.Received(1).UpdateFieldsAsync(Arg.Any(), Arg.Any(), Arg.Any()); - } - [Fact] - public async Task UpdateUserFields_ShouldNotUpdateFields_WhenUserDoesNotExist() - { - // Arrange - string newUsername = "Changed username", newInformation = "Some information"; - var user = new UserDomain { Id = Guid.NewGuid(), Username = "System Under Test", Email = "unit@test.com", IsLandlord = false, Password = "qwerty123", Information = string.Empty }; - _userReceiver.GetByIdWithContactsAsync(user.Id).ReturnsNull(); - - // Act - var actual = await _sut.UpdateUserFieldsAsync(user.Id, newUsername, newInformation, user.Password); - - // Assert - actual.Succeeded.Should().Be(false); - actual.ErrorMessage.Should().BeEquivalentTo(ErrorMessages.User.NotFound); - await _userReceiver.Received(1).GetByIdWithContactsAsync(Arg.Any()); - } - [Fact] - public async Task UpdateUserFields_ShouldNotUpdateFields_WhenPasswordIsWrong() - { - // Arrange - string newUsername = "Changed username", newInformation = "Some information"; - string wrongPassword = "wrongpassword"; - var user = new UserDomain { Id = Guid.NewGuid(), Username = "System Under Test", Email = "unit@test.com", IsLandlord = false, Password = wrongPassword, Information = string.Empty }; - var entity = new UserEntity { Id = user.Id, UserName = user.Username, Email = user.Email, IsLandlord = user.IsLandlord, PasswordHash = string.Empty, Information = user.Information, Contacts = new List() }; - _userReceiver.GetByIdWithContactsAsync(user.Id).Returns(entity); - _userRepository.CheckPasswordAsync(entity, wrongPassword).Returns(false); - - // Act - var actual = await _sut.UpdateUserFieldsAsync(user.Id, newUsername, newInformation, user.Password); - - // Assert - actual.Succeeded.Should().Be(false); - actual.ErrorMessage.Should().BeEquivalentTo(ErrorMessages.User.WrongPassword); - await _userReceiver.Received(1).GetByIdWithContactsAsync(Arg.Any()); - await _userRepository.Received(1).CheckPasswordAsync(entity, wrongPassword); - } -} \ No newline at end of file diff --git a/tests/PropertySearch.UnitTests/PropertySearch.UnitTests.csproj b/tests/PropertySearch.UnitTests/PropertySearch.UnitTests.csproj deleted file mode 100644 index f96dea5..0000000 --- a/tests/PropertySearch.UnitTests/PropertySearch.UnitTests.csproj +++ /dev/null @@ -1,30 +0,0 @@ - - - - net6.0 - enable - enable - - false - - - - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - - - - - diff --git a/tests/PropertySearch.UnitTests/Usings.cs b/tests/PropertySearch.UnitTests/Usings.cs deleted file mode 100644 index 8c927eb..0000000 --- a/tests/PropertySearch.UnitTests/Usings.cs +++ /dev/null @@ -1 +0,0 @@ -global using Xunit; \ No newline at end of file