using System; using System.Collections.Generic; using System.Threading.Tasks; using AutoMapper; using DevHive.Data.Interfaces; using DevHive.Data.Models; using DevHive.Services.Models.Language; using DevHive.Services.Services; using Moq; using NUnit.Framework; namespace DevHive.Services.Tests { [TestFixture] public class LanguageServiceTests { private Mock LanguageRepositoryMock { get; set; } private Mock MapperMock { get; set; } private LanguageService LanguageService { get; set; } #region SetUps [SetUp] public void SetUp() { this.LanguageRepositoryMock = new Mock(); this.MapperMock = new Mock(); this.LanguageService = new LanguageService(this.LanguageRepositoryMock.Object, this.MapperMock.Object); } #endregion #region CreateLanguage [Test] public async Task CreateLanguage_ReturnsNonEmptyGuid_WhenEntityIsAddedSuccessfully() { string technologyName = "Gosho Trapov"; Guid id = Guid.NewGuid(); CreateLanguageServiceModel createLanguageServiceModel = new CreateLanguageServiceModel { Name = technologyName }; Language language = new Language { Name = technologyName, Id = id }; this.LanguageRepositoryMock.Setup(p => p.DoesLanguageNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); this.LanguageRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(true)); this.LanguageRepositoryMock.Setup(p => p.GetByNameAsync(It.IsAny())).Returns(Task.FromResult(language)); this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(language); Guid result = await this.LanguageService.CreateLanguage(createLanguageServiceModel); Assert.AreEqual(id, result); } [Test] public async Task CreateLanguage_ReturnsEmptyGuid_WhenEntityIsNotAddedSuccessfully() { string languageName = "Gosho Trapov"; CreateLanguageServiceModel createLanguageServiceModel = new CreateLanguageServiceModel { Name = languageName }; Language language = new Language { Name = languageName }; this.LanguageRepositoryMock.Setup(p => p.DoesLanguageNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); this.LanguageRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(false)); this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(language); Guid result = await this.LanguageService.CreateLanguage(createLanguageServiceModel); Assert.IsTrue(result == Guid.Empty); } [Test] public void CreateLanguage_ThrowsArgumentException_WhenEntityAlreadyExists() { string exceptionMessage = "Language already exists!"; string languageName = "Gosho Trapov"; CreateLanguageServiceModel createLanguageServiceModel = new CreateLanguageServiceModel { Name = languageName }; Language language = new Language { Name = languageName }; this.LanguageRepositoryMock.Setup(p => p.DoesLanguageNameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); Exception ex = Assert.ThrowsAsync(() => this.LanguageService.CreateLanguage(createLanguageServiceModel)); Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); } #endregion #region GetLanguageById [Test] public async Task GetLanguageById_ReturnsTheLanguage_WhenItExists() { Guid id = Guid.NewGuid(); string name = "Gosho Trapov"; Language language = new Language { Name = name }; ReadLanguageServiceModel readLanguageServiceModel = new ReadLanguageServiceModel { Name = name }; this.LanguageRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(language)); this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(readLanguageServiceModel); ReadLanguageServiceModel result = await this.LanguageService.GetLanguageById(id); Assert.AreEqual(name, result.Name); } [Test] public void GetLanguageById_ThrowsException_WhenLanguageDoesNotExist() { string exceptionMessage = "The language does not exist"; Guid id = Guid.NewGuid(); this.LanguageRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(null)); Exception ex = Assert.ThrowsAsync(() => this.LanguageService.GetLanguageById(id)); Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); } #endregion #region GetLanguages [Test] public void GetLanguages_ReturnsAllLanguages_IfAnyExist() { ReadLanguageServiceModel firstLanguage = new ReadLanguageServiceModel(); ReadLanguageServiceModel secondLanguage = new ReadLanguageServiceModel(); HashSet languges = new HashSet(); languges.Add(firstLanguage); languges.Add(secondLanguage); this.LanguageRepositoryMock.Setup(p => p.GetLanguages()).Returns(new HashSet()); this.MapperMock.Setup(p => p.Map>(It.IsAny>())).Returns(languges); HashSet result = this.LanguageService.GetLanguages(); Assert.GreaterOrEqual(2, result.Count, "GetLanguages does not return all languages"); } [Test] public void GetLanguages_ReturnsEmptyHashSet_IfNoLanguagesExist() { this.LanguageRepositoryMock.Setup(p => p.GetLanguages()).Returns(new HashSet()); this.MapperMock.Setup(p => p.Map>(It.IsAny>())).Returns(new HashSet()); HashSet result = this.LanguageService.GetLanguages(); Assert.IsEmpty(result, "GetLanguages does not return empty string when no languages exist"); } #endregion #region UpdateLanguage [Test] [TestCase(true)] [TestCase(false)] public async Task UpdateLanguage_ReturnsIfUpdateIsSuccessfull_WhenLanguageExistsy(bool shouldPass) { string name = "Gosho Trapov"; Guid id = Guid.NewGuid(); Language language = new Language { Name = name, Id = id }; UpdateLanguageServiceModel updateLanguageServiceModel = new UpdateLanguageServiceModel { Name = name, }; this.LanguageRepositoryMock.Setup(p => p.DoesLanguageExistAsync(It.IsAny())).Returns(Task.FromResult(true)); this.LanguageRepositoryMock.Setup(p => p.DoesLanguageNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); this.LanguageRepositoryMock.Setup(p => p.EditAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(shouldPass)); this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(language); bool result = await this.LanguageService.UpdateLanguage(updateLanguageServiceModel); Assert.AreEqual(shouldPass, result); } [Test] public void UpdateLanguage_ThrowsArgumentException_WhenLanguageDoesNotExist() { string exceptionMessage = "Language does not exist!"; UpdateLanguageServiceModel updateTechnologyServiceModel = new UpdateLanguageServiceModel { }; this.LanguageRepositoryMock.Setup(p => p.DoesLanguageExistAsync(It.IsAny())).Returns(Task.FromResult(false)); Exception ex = Assert.ThrowsAsync(() => this.LanguageService.UpdateLanguage(updateTechnologyServiceModel)); Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); } [Test] public void UpdateLanguage_ThrowsException_WhenLanguageNameAlreadyExists() { string exceptionMessage = "Language name already exists in our data base!"; UpdateLanguageServiceModel updateTechnologyServiceModel = new UpdateLanguageServiceModel { }; this.LanguageRepositoryMock.Setup(p => p.DoesLanguageExistAsync(It.IsAny())).Returns(Task.FromResult(true)); this.LanguageRepositoryMock.Setup(p => p.DoesLanguageNameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); Exception ex = Assert.ThrowsAsync(() => this.LanguageService.UpdateLanguage(updateTechnologyServiceModel)); Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); } #endregion #region DeleteLanguage [Test] [TestCase(true)] [TestCase(false)] public async Task DeleteLanguage_ShouldReturnIfDeletionIsSuccessfull_WhenLanguageExists(bool shouldPass) { Guid id = Guid.NewGuid(); Language language = new Language(); this.LanguageRepositoryMock.Setup(p => p.DoesLanguageExistAsync(It.IsAny())).Returns(Task.FromResult(true)); this.LanguageRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(language)); this.LanguageRepositoryMock.Setup(p => p.DeleteAsync(It.IsAny())).Returns(Task.FromResult(shouldPass)); bool result = await this.LanguageService.DeleteLanguage(id); Assert.AreEqual(shouldPass, result); } [Test] public void DeleteLanguage_ThrowsException_WhenLanguageDoesNotExist() { string exceptionMessage = "Language does not exist!"; Guid id = Guid.NewGuid(); this.LanguageRepositoryMock.Setup(p => p.DoesLanguageExistAsync(It.IsAny())).Returns(Task.FromResult(false)); Exception ex = Assert.ThrowsAsync(() => this.LanguageService.DeleteLanguage(id)); Assert.AreEqual(exceptionMessage, ex.Message, "Incorecct exception message"); } #endregion } }