using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Moq; using Server.Controller.v1; using Server.Dto.Request; using Server.Dto.Response; using Server.IServices; using Shared.Criteria; namespace TestAPI.ControllerTests { public class ExperienceControllerTest { private readonly ILogger _loggerMock = Mock.Of>(); private readonly Mock _servicesMock = new Mock(); [Fact] public async Task GetExperiences() { // Arrange var expectedExperiences = new List { new ResponseExperienceDto { Id = "1", Title = "Iut" }, }; _servicesMock.Setup(s => s.GetExperiences(null, 0, 10, ExperienceOrderCriteria.StartDate, true)) .ReturnsAsync((expectedExperiences.Count, expectedExperiences)); var experiencesController = new ExperiencesController(_loggerMock, _servicesMock.Object); // Act var result = await experiencesController.GetExperiences(null, 0, 10); // Assert var okResult = Assert.IsType(result); var experienceList = Assert.IsAssignableFrom>(okResult.Value); Assert.Equal(expectedExperiences.Count, experienceList.Count()); } [Fact] public async Task GetExperienceById_ValidId() { // Arrange var expectedExperience = new ResponseExperienceDto { Id = "1", Title = "Iut" }; _servicesMock.Setup(s => s.GetExperienceById("1")).ReturnsAsync(expectedExperience); var experiencesController = new ExperiencesController(_loggerMock, _servicesMock.Object); // Act var result = experiencesController.GetExperienceById("1"); // Assert var okResult = Assert.IsType(result); var experienceItem = Assert.IsType(okResult.Value); Assert.Equal(expectedExperience.Id, experienceItem.Id); Assert.Equal(expectedExperience.Title, experienceItem.Title); } [Fact] public async Task GetExperienceById_InvalidId() { // Arrange _servicesMock.Setup(s => s.GetExperienceById("hgfyhgyjhu")).ReturnsAsync((ResponseExperienceDto?)null); // Act var experiencesController = new ExperiencesController(_loggerMock, _servicesMock.Object); var result = experiencesController.GetExperienceById("hgfyhgyjhu"); // Assert Assert.IsType(result); } [Fact] public async Task CreateExperience() { // Arrange var newExperience = new RequestExperienceDto { AlumniId = "A1", Title = "Junior Dev", StartingDate = DateTime.Now.AddYears(-2), CompanyName = "CGI", CurrentJob = false }; var expectedExperience = new ResponseExperienceDto { Id = "4", Title = "Junior Dev" }; _servicesMock.Setup(s => s.CreateExperience(newExperience)).ReturnsAsync(expectedExperience); var experiencesController = new ExperiencesController(_loggerMock, _servicesMock.Object); // Act var result = experiencesController.CreateExperience(newExperience); // Assert var createdAtResult = Assert.IsType(result); var createdExperience = Assert.IsType(createdAtResult.Value); Assert.Equal(expectedExperience.Id, createdExperience.Id); Assert.Equal(expectedExperience.Title, createdExperience.Title); } [Fact] public async Task UpdateExperience_ValidId() { // Arrange var updatedExperience = new RequestExperienceDto { Title = "Update Software Developer", StartingDate = DateTime.Now.AddYears(-2), EndingDate = DateTime.Now, CompanyName = "TechCo", CurrentJob = false, AlumniId = "A1" }; var expectedExperience = new ResponseExperienceDto { Id = "1", Title = "Update Software Developer" }; _servicesMock.Setup(s => s.UpdateExperience("1", updatedExperience)).ReturnsAsync(expectedExperience); var experiencesController = new ExperiencesController(_loggerMock, _servicesMock.Object); // Act var result = experiencesController.UpdateExperience("1", updatedExperience); // Assert var okResult = Assert.IsType(result); var updatedExperienceResult = Assert.IsType(okResult.Value); Assert.Equal(expectedExperience.Id, updatedExperienceResult.Id); Assert.Equal(expectedExperience.Title, updatedExperienceResult.Title); } [Fact] public async Task UpdateExperience_InvalidId() { // Arrange var updatedOffer = new RequestExperienceDto { Title = "Update Software Developer", StartingDate = DateTime.Now.AddYears(-2), EndingDate = DateTime.Now, CompanyName = "TechCo", CurrentJob = false, AlumniId = "A1" }; _servicesMock.Setup(s => s.UpdateExperience("InvalidId", updatedOffer)).ReturnsAsync((ResponseExperienceDto?)null); // Act var experiencesController = new ExperiencesController(_loggerMock, _servicesMock.Object); var result = experiencesController.UpdateExperience("InvalidId", updatedOffer); // Assert var badRequestResult = Assert.IsType(result); } [Fact] public async Task DeleteExperience_ValidId() { // Arrange _servicesMock.Setup(s => s.DeleteExperience("1")).ReturnsAsync(true); var experiencesController = new ExperiencesController(_loggerMock, _servicesMock.Object); // Act var result = experiencesController.DeleteExperience("1"); // Assert Assert.IsType(result); } [Fact] public async Task DeleteExperience_InvalidId() { // Arrange _servicesMock.Setup(s => s.DeleteExperience("InvalidId")).ReturnsAsync(false); var experiencesController = new ExperiencesController(_loggerMock, _servicesMock.Object); // Act var result = experiencesController.DeleteExperience("InvalidId"); // Assert Assert.IsType(result); } } }