Skip to content

Commit

Permalink
Merge pull request #105 from infoshareacademy/feature/ja-110_students…
Browse files Browse the repository at this point in the history
…-schedule-IsRemote

Feature/ja 110 students schedule is remote
  • Loading branch information
Zjyslav authored Jun 16, 2024
2 parents 9827155 + e0ecbf3 commit 2d5dc59
Show file tree
Hide file tree
Showing 10 changed files with 553 additions and 41 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
using Moq;
using TutorLizard.BusinessLogic.Models;
using TutorLizard.BusinessLogic.Models.DTOs.Requests;
using TutorLizard.BusinessLogic.Services;

namespace TutorLizard.BusinessLogic.Tests.Services.Student
{
public class StudentServiceScheduleItemRequestTests : StudentServiceTestBase
{
[Theory]
[InlineData(true)]
[InlineData(false)]
public async Task CreateScheduleItemRequest_ShouldSetIsRemoteCorrectly(bool isRemote)
{
// Arrange
var ad = new Ad
{
Description = "Test Description",
Location = "Test Location",
Subject = "Test Subject",
Title = "Test Title",
TutorId = 2
};
var scheduleItem = new ScheduleItem { Id = 1, Ad = ad };

SetupMockGetScheduleItemById(scheduleItem);
SetupMockGetAllScheduleItems(new List<ScheduleItem> { scheduleItem });

var request = new CreateScheduleItemRequestRequest
{
StudentId = 3,
ScheduleItemId = 1,
IsRemote = isRemote
};

MockScheduleItemRequestRepository
.Setup(x => x.Create(It.Is<ScheduleItemRequest>(req => req.IsRemote == isRemote)))
.Returns((ScheduleItemRequest req) => Task.FromResult(req))
.Verifiable(Times.Once);

// Act
await StudentService.CreateScheduleItemRequest(request);

// Assert
MockScheduleItemRequestRepository.VerifyAll();
}

[Fact]
public async Task CreateScheduleItemRequest_WhenRequestSent_ShouldReturnSuccess()
{
// Arrange
var scheduleItem = new ScheduleItem { Id = 1 };
var studentId = 1;
var isRemote = true;

SetupMockGetScheduleItemById(scheduleItem);

var request = new CreateScheduleItemRequestRequest
{
StudentId = studentId,
ScheduleItemId = scheduleItem.Id,
IsRemote = isRemote
};

// Act
var response = await StudentService.CreateScheduleItemRequest(request);

// Assert
Assert.True(response.Success);
}





}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using AutoFixture;
using Moq;
using TutorLizard.BusinessLogic.Interfaces.Data.Repositories;
using TutorLizard.BusinessLogic.Models;
using TutorLizard.BusinessLogic.Services;

namespace TutorLizard.BusinessLogic.Tests.Services.Student
{
public class StudentServiceTestBase : TestsWithInMemoryDbBase
{
protected StudentService StudentService;
protected Fixture Fixture = new();
protected Mock<IDbRepository<Ad>> MockAdRepository = new();
protected Mock<IDbRepository<AdRequest>> MockAdRequestRepository = new();
protected Mock<IDbRepository<ScheduleItem>> MockScheduleItemRepository = new();
protected Mock<IDbRepository<ScheduleItemRequest>> MockScheduleItemRequestRepository = new();


protected StudentServiceTestBase() : base()
{
StudentService = new StudentService(MockAdRepository.Object,
MockAdRequestRepository.Object,
MockScheduleItemRepository.Object,
MockScheduleItemRequestRepository.Object);
}

protected void SetupMockGetScheduleItemById(ScheduleItem? scheduleItem)
{
MockScheduleItemRepository
.Setup(x => x.GetById(It.IsAny<int>()))
.Returns(Task.FromResult(scheduleItem));
}

protected void SetupMockGetAllScheduleItems(List<ScheduleItem> scheduleItems)
{
var scheduleItemsInDb = AddEntitiesToInMemoryDb(scheduleItems);
MockScheduleItemRepository
.Setup(x => x.GetAll())
.Returns(scheduleItemsInDb);
}

protected IQueryable<TEntity> AddEntitiesToInMemoryDb<TEntity>(List<TEntity> entities)
where TEntity : class
{
DbContext
.Set<TEntity>()
.AddRange(entities);
DbContext.SaveChanges();

return DbContext
.Set<TEntity>()
.AsQueryable();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@ public class CreateScheduleItemRequestRequest
{
public int StudentId { get; set; }
public int ScheduleItemId { get; set; }
public bool IsRemote { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public class AvailableScheduleForAdResponse
{
public List<ScheduleItemDto> Items { get; set; } = new();
public bool IsAccepted { get; set; } = true;
public bool IsRemote { get; set; }
public int AdId { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@ public class CreateScheduleItemRequestResponse
{
public bool Success { get; set; }
public int CreatedScheduleItemRequestId { get; set; }
public bool IsRemote { get; set; }
}
}
80 changes: 46 additions & 34 deletions TutorLizard.BusinessLogic/Services/StudentService.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using Microsoft.EntityFrameworkCore;
using System.Runtime.InteropServices;
using TutorLizard.BusinessLogic.Interfaces.Data.Repositories;
using TutorLizard.BusinessLogic.Interfaces.Services;
using TutorLizard.BusinessLogic.Models;
Expand All @@ -25,6 +24,7 @@ public StudentService(IDbRepository<Ad> adRepository,
_scheduleItemRequestRepository = scheduleItemRequestRepository;
}

#region Schedule
public async Task<CreateScheduleItemRequestResponse> CreateScheduleItemRequest(CreateScheduleItemRequestRequest request)
{
int studentId = request.StudentId;
Expand All @@ -48,18 +48,57 @@ public async Task<CreateScheduleItemRequestResponse> CreateScheduleItemRequest(C
ScheduleItemId = scheduleItemId,
DateCreated = DateTime.UtcNow,
StudentId = studentId,
IsAccepted = false
IsAccepted = false,
IsRemote = request.IsRemote
};

await _scheduleItemRequestRepository.Create(scheduleItemRequest);

return new CreateScheduleItemRequestResponse
{

return new CreateScheduleItemRequestResponse
{
Success = true,
CreatedScheduleItemRequestId = scheduleItemRequest.Id,
CreatedScheduleItemRequestId = scheduleItemRequest.Id
};
}

public async Task<AvailableScheduleForAdResponse> GetAvailableScheduleForAd(AvailableScheduleForAdRequest request)
{
List<ScheduleItemDto> items = await _scheduleItemRepository.GetAll()
.Where(si => si.Ad.AdRequests.Any(ar => ar.StudentId == request.StudentId && ar.IsAccepted))
.Select(si => new ScheduleItemDto()
{
AdId = si.AdId,
DateTime = si.DateTime,
Id = si.Id,
Status = si.ScheduleItemRequests.Any(sir => sir.StudentId == request.StudentId && sir.IsAccepted) ? ScheduleItemDto.ScheduleItemRequestStatus.Accepted
: si.ScheduleItemRequests.Any(sir => sir.StudentId == request.StudentId) ? ScheduleItemDto.ScheduleItemRequestStatus.Pending
: ScheduleItemDto.ScheduleItemRequestStatus.RequestNotSent
})
.ToListAsync();

bool isAccepted = await _adRequestRepository.GetAll()
.Where(ar => ar.AdId == request.AdId)
.AnyAsync(ar => ar.StudentId == request.StudentId && ar.IsAccepted);

bool isRemote = await _adRepository.GetAll()
.Where(ad => ad.Id == request.AdId)
.Select(ad => ad.IsRemote)
.FirstOrDefaultAsync();

AvailableScheduleForAdResponse response = new()
{
AdId = request.AdId,
IsAccepted = isAccepted,
IsRemote = isRemote,
Items = items
};

return response;
}

#endregion
#region Ads
public async Task<StudentsAcceptedAdsResponse> ViewAcceptedAds(StudentsAcceptedAdsRequest request)
{
var studentId = request.StudentId;
Expand Down Expand Up @@ -142,7 +181,7 @@ public async Task<AdRequestStatusResponse> ViewAdRequestStatus(AdRequestStatusRe
.FirstOrDefaultAsync();

if (adRequestDetails is null)
return new AdRequestStatusResponse() { IsSuccessful = false };
return new AdRequestStatusResponse() { IsSuccessful = false };

AdRequestStatusResponse response = new AdRequestStatusResponse()
{
Expand Down Expand Up @@ -233,32 +272,5 @@ public async Task<CreateAdRequestResponse> CreateAdRequest(CreateAdRequestReques
};
}

public async Task<AvailableScheduleForAdResponse> GetAvailableScheduleForAd(AvailableScheduleForAdRequest request)
{
List<ScheduleItemDto> items = await _scheduleItemRepository.GetAll()
.Where(si => si.Ad.AdRequests.Any(ar => ar.StudentId == request.StudentId && ar.IsAccepted) && si.AdId == request.AdId)
.Select(si => new ScheduleItemDto()
{
AdId = si.AdId,
DateTime = si.DateTime,
Id = si.Id,
Status = si.ScheduleItemRequests.Any(sir => sir.StudentId == request.StudentId && sir.IsAccepted) ? ScheduleItemDto.ScheduleItemRequestStatus.Accepted
: si.ScheduleItemRequests.Any(sir => sir.StudentId == request.StudentId) ? ScheduleItemDto.ScheduleItemRequestStatus.Pending
: ScheduleItemDto.ScheduleItemRequestStatus.RequestNotSent
})
.ToListAsync();

bool isAccepted = await _adRequestRepository.GetAll()
.Where(ar => ar.AdId == request.AdId)
.AnyAsync(ar => ar.StudentId == request.StudentId && ar.IsAccepted);

AvailableScheduleForAdResponse response = new()
{
AdId = request.AdId,
IsAccepted = isAccepted,
Items = items
};

return response;
}
#endregion
}
5 changes: 3 additions & 2 deletions TutorLizard.Web/Controllers/StudentController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public async Task<IActionResult> AdRequests(IFormCollection buttonAction)

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> CreateScheduleItemRequest(int scheduleItemId, int adId)
public async Task<IActionResult> CreateScheduleItemRequest(int scheduleItemId, int adId, bool isRemote)
{

int? studentId = _userAuthenticationService.GetLoggedInUserId();
Expand All @@ -89,7 +89,8 @@ public async Task<IActionResult> CreateScheduleItemRequest(int scheduleItemId, i
CreateScheduleItemRequestRequest request = new()
{
StudentId = (int)studentId,
ScheduleItemId = scheduleItemId
ScheduleItemId = scheduleItemId,
IsRemote = isRemote
};

CreateScheduleItemRequestResponse response = await _studentService.CreateScheduleItemRequest(request);
Expand Down
Loading

0 comments on commit 2d5dc59

Please sign in to comment.