Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/JA-111 BrowseControllerTests #101

Merged
merged 15 commits into from
May 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
using AutoFixture;
using Microsoft.AspNetCore.Mvc;
using Moq;
using TutorLizard.BusinessLogic.Models.DTOs.Requests;
using TutorLizard.BusinessLogic.Models.DTOs.Responses;

namespace TutorLizard.Web.Tests.Controllers.Browse;
public class BrowseControllerAdDetailsTests : BrowseControllerTestsBase
{
[Fact]
public async Task AdDetails_WhenUserIdIsNull_ShouldReturnRedirectToAction()
{
// Arrage
int id = 1;
SetupMockGetLoggedInUserId(null);

// Act
var result = await BrowseController.AdDetails(id);

// Assert
Assert.IsType<RedirectToActionResult>(result);
}

[Fact]
public async Task AdDetails_WhenUserIdIsNotNull_ShouldSendCorrectRequest()
{
// Arrange
int id = 1;
int userId = 19;

GetAdDetailsRequest expected = new()
{
AdId = id,
UserId = userId
};

SetupMockGetLoggedInUserId(userId);

List<GetAdDetailsRequest> requests = [];
GetAdDetailsResponse response = Fixture.Create<GetAdDetailsResponse>();
MockBrowseService
.Setup(x => x.GetAdDetails(Capture.In(requests)))
.Returns(Task.FromResult<GetAdDetailsResponse?>(response));

// Act
await BrowseController.AdDetails(id);

// Assert
Assert.Equivalent(expected, requests.Single());
}

[Fact]
public async Task AdDetails_WhenResponseIsNull_ShouldReturnRedirectToAction()
{
// Arrange
int id = 1;
int userId = 19;

SetupMockGetLoggedInUserId(userId);

MockBrowseService
.Setup(x => x.GetAdDetails(It.IsAny<GetAdDetailsRequest>()))
.Returns(Task.FromResult<GetAdDetailsResponse?>(null));

// Act
var result = await BrowseController.AdDetails(id);

// Assert
Assert.IsType<RedirectToActionResult>(result);
}

[Fact]
public async Task AdDetails_WhenResponseIsNull_ShouldReturnView()
{
// Arrange
int id = 1;
int userId = 19;

SetupMockGetLoggedInUserId(userId);

GetAdDetailsResponse response = Fixture.Create<GetAdDetailsResponse>();
MockBrowseService
.Setup(x => x.GetAdDetails(It.IsAny<GetAdDetailsRequest>()))
.Returns(Task.FromResult<GetAdDetailsResponse?>(response));

// Act
var result = await BrowseController.AdDetails(id);

// Assert
Assert.IsType<ViewResult>(result);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
using AutoFixture;
using Microsoft.AspNetCore.Mvc;
using Moq;
using TutorLizard.BusinessLogic.Models.DTOs.Requests;
using TutorLizard.BusinessLogic.Models.DTOs.Responses;

namespace TutorLizard.Web.Tests.Controllers.Browse;
public class BrowseControllerAdsTests : BrowseControllerTestsBase
{
[Theory]
[InlineData(0, 1)]
[InlineData(-1, 1)]
[InlineData(int.MinValue, 1)]
public async Task Ads_WhenProvidedInvalidPageNumber_ShouldAskForPageOne(int pageNumber, int expectedUsedPageNumber)
{
// Arrange
List<GetBrowseAdsPageRequest> requests = [];
GetBrowseAdsPageResponse response = CreateGetBrowseAdsPageResponse(success: true);

MockBrowseService
.Setup(x => x.GetBrowseAdsPage(Capture.In(requests)))
.Returns(Task.FromResult(response));

// Act
await BrowseController.Ads(pageNumber);

// Assert
Assert.Equal(expectedUsedPageNumber, requests.Single().PageNumber);
}

[Theory]
[InlineData(1, 1)]
[InlineData(2, 2)]
[InlineData(100, 100)]
[InlineData(int.MaxValue, int.MaxValue)]
public async Task Ads_WhenProvidedValidPageNumber_ShouldAskForCorrectPage(int pageNumber, int expectedUsedPageNumber)
{
// Arrange
List<GetBrowseAdsPageRequest> requests = [];
GetBrowseAdsPageResponse response = CreateGetBrowseAdsPageResponse(success: true);

MockBrowseService
.Setup(x => x.GetBrowseAdsPage(Capture.In(requests)))
.Returns(Task.FromResult(response));

// Act
await BrowseController.Ads(pageNumber);

// Assert
Assert.Equal(expectedUsedPageNumber, requests.Single().PageNumber);
}

[Fact]
public async Task Ads_WhenResponseIsUnsuccessful_ShouldReturnRedirectToAction()
{
// Arrange
int pageNumber = 1;
GetBrowseAdsPageResponse response = CreateGetBrowseAdsPageResponse(success: false);

MockBrowseService
.Setup(x => x.GetBrowseAdsPage(It.IsAny<GetBrowseAdsPageRequest>()))
.Returns(Task.FromResult(response));

// Act
var result = await BrowseController.Ads(pageNumber);

// Assert
Assert.IsType<RedirectToActionResult>(result);
}

[Fact]
public async Task Ads_WhenResponseIsSuccessful_ShouldReturnView()
{
// Arrange
int pageNumber = 1;
GetBrowseAdsPageResponse response = CreateGetBrowseAdsPageResponse(success: true);

MockBrowseService
.Setup(x => x.GetBrowseAdsPage(It.IsAny<GetBrowseAdsPageRequest>()))
.Returns(Task.FromResult(response));

// Act
var result = await BrowseController.Ads(pageNumber);

// Assert
Assert.IsType<ViewResult>(result);
}

private GetBrowseAdsPageResponse CreateGetBrowseAdsPageResponse(bool success)
{
return Fixture
.Build<GetBrowseAdsPageResponse>()
.With(r => r.Success, success)
.Create();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
using AutoFixture;
using Microsoft.AspNetCore.Mvc;
using Moq;
using TutorLizard.BusinessLogic.Models.DTOs.Requests;
using TutorLizard.BusinessLogic.Models.DTOs.Responses;

namespace TutorLizard.Web.Tests.Controllers.Browse;
public class BrowseControllerScheduleTests : BrowseControllerTestsBase
{
[Fact]
public async Task Schedule_WhenUserIdIsNull_ShouldReturnRedirectToAction()
{
// Arrange
SetupMockGetLoggedInUserId(null);

// Act
var result = await BrowseController.Schedule();

// Assert
Assert.IsType<RedirectToActionResult>(result);
}

[Fact]
public async Task Schedule_WhenUserIdIsNotNull_ShouldReturnRedirectView()
{
// Arrange
int userId = 19;
SetupMockGetLoggedInUserId(userId);

GetUsersScheduleResponse response = Fixture.Create<GetUsersScheduleResponse>();
MockBrowseService
.Setup(x => x.GetUsersSchedule(It.IsAny<GetUsersScheduleRequest>()))
.Returns(Task.FromResult(response));

// Act
var result = await BrowseController.Schedule();

// Assert
Assert.IsType<ViewResult>(result);
}

[Theory]
[InlineData(1)]
[InlineData(19)]
[InlineData(1000)]
[InlineData(0)]
[InlineData(-1)]
[InlineData(int.MaxValue)]
[InlineData(int.MinValue)]
public async Task Schedule_WhenUserIdIsNotNull_ShouldSendCorrectRequest(int userId)
{
// Arrange
SetupMockGetLoggedInUserId(userId);

List<GetUsersScheduleRequest> requests = [];
GetUsersScheduleResponse response = Fixture.Create<GetUsersScheduleResponse>();
MockBrowseService
.Setup(x => x.GetUsersSchedule(Capture.In(requests)))
.Returns(Task.FromResult(response));

GetUsersScheduleRequest expected = new()
{
UserId = userId
};

// Act
await BrowseController.Schedule();

// Assert
Assert.Equivalent(expected, requests.Single());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using AutoFixture;
using Moq;
using TutorLizard.BusinessLogic.Interfaces.Services;
using TutorLizard.Web.Controllers;

namespace TutorLizard.Web.Tests.Controllers.Browse;

public abstract class BrowseControllerTestsBase
{
protected BrowseController BrowseController;
protected Mock<IBrowseService> MockBrowseService = new();
protected Mock<IUserAuthenticationService> MockUserAuthenticationService = new();
protected Fixture Fixture = new();

public BrowseControllerTestsBase()
{
BrowseController = new(MockBrowseService.Object, MockUserAuthenticationService.Object);
}

protected void SetupMockGetLoggedInUserId(int? userId)
{
MockUserAuthenticationService
.Setup(x => x.GetLoggedInUserId())
.Returns(userId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace TutorLizard.BusinessLogic.Interfaces.Services;

public interface IBrowseService
{
Task<AdDetailsResponse?> GetAdDetails(AdDetailsRequest request);
Task<GetAdDetailsResponse?> GetAdDetails(GetAdDetailsRequest request);
Task<GetBrowseAdsPageResponse> GetBrowseAdsPage(GetBrowseAdsPageRequest request);
Task<UsersScheduleResponse> GetUsersSchedule(UsersScheduleRequest request);
Task<GetUsersScheduleResponse> GetUsersSchedule(GetUsersScheduleRequest request);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
namespace TutorLizard.BusinessLogic.Models.DTOs.Requests;
public class AdDetailsRequest
public class GetAdDetailsRequest
{
public int AdId { get; set; }
public int UserId { get; set; }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
namespace TutorLizard.BusinessLogic.Models.DTOs.Requests;
public class UsersScheduleRequest
public class GetUsersScheduleRequest
{
public int UserId { get; set; }
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using TutorLizard.BusinessLogic.Enums;

namespace TutorLizard.BusinessLogic.Models.DTOs.Responses;
public class AdDetailsResponse
public class GetAdDetailsResponse
{
public int AdId { get; set; }
public int TutorId { get; set; }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
namespace TutorLizard.BusinessLogic.Models.DTOs.Responses;
public class UsersScheduleResponse
public class GetUsersScheduleResponse
{
public List<TutorsScheduleItemSummaryDto> TutorsSchedule { get; set; } = [];
public List<StudentsScheduleItemSummaryDto> StudentsSchedule { get; set; } = [];
Expand Down
10 changes: 5 additions & 5 deletions TutorLizard.BusinessLogic/Services/BrowseService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,11 @@ public async Task<GetBrowseAdsPageResponse> GetBrowseAdsPage(GetBrowseAdsPageReq
return response;
}

public async Task<AdDetailsResponse?> GetAdDetails(AdDetailsRequest request)
public async Task<GetAdDetailsResponse?> GetAdDetails(GetAdDetailsRequest request)
{
AdDetailsResponse? response = await _adRepository.GetAll()
GetAdDetailsResponse? response = await _adRepository.GetAll()
.Where(a => a.Id == request.AdId)
.Select(a => new AdDetailsResponse
.Select(a => new GetAdDetailsResponse
{
AdId = a.Id,
TutorId = a.TutorId,
Expand All @@ -102,7 +102,7 @@ public async Task<GetBrowseAdsPageResponse> GetBrowseAdsPage(GetBrowseAdsPageReq
return response;
}

public async Task<UsersScheduleResponse> GetUsersSchedule(UsersScheduleRequest request)
public async Task<GetUsersScheduleResponse> GetUsersSchedule(GetUsersScheduleRequest request)
{
List<TutorsScheduleItemSummaryDto> tutorsSchedule = await _scheduleItemRepository.GetAll()
.Where(i => i.Ad.TutorId == request.UserId)
Expand Down Expand Up @@ -137,7 +137,7 @@ public async Task<UsersScheduleResponse> GetUsersSchedule(UsersScheduleRequest r
})
.ToListAsync();

UsersScheduleResponse response = new()
GetUsersScheduleResponse response = new()
{
TutorsSchedule = tutorsSchedule,
StudentsSchedule = studentsSchedule
Expand Down
Loading
Loading