From b977eb9239030042aad5469d5ab390e5a6cf9a8f Mon Sep 17 00:00:00 2001 From: skrawus Date: Sun, 2 Jun 2024 16:37:35 +0200 Subject: [PATCH 01/12] Add IsRemote to ScheduleItemRequest for Student --- .../DTOs/Requests/CreateScheduleItemRequestRequest.cs | 1 + .../Models/DTOs/Responses/AvailableScheduleForAdResponse.cs | 1 + TutorLizard.BusinessLogic/Services/StudentService.cs | 3 ++- .../Shared/Components/AvailableScheduleForAd/Default.cshtml | 6 +++++- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Requests/CreateScheduleItemRequestRequest.cs b/TutorLizard.BusinessLogic/Models/DTOs/Requests/CreateScheduleItemRequestRequest.cs index 39784bc7..443fb9cd 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Requests/CreateScheduleItemRequestRequest.cs +++ b/TutorLizard.BusinessLogic/Models/DTOs/Requests/CreateScheduleItemRequestRequest.cs @@ -10,5 +10,6 @@ public class CreateScheduleItemRequestRequest { public int StudentId { get; set; } public int ScheduleItemId { get; set; } + public bool IsRemote { get; set; } } } diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/AvailableScheduleForAdResponse.cs b/TutorLizard.BusinessLogic/Models/DTOs/Responses/AvailableScheduleForAdResponse.cs index dc3ae1e9..f82d3b26 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/AvailableScheduleForAdResponse.cs +++ b/TutorLizard.BusinessLogic/Models/DTOs/Responses/AvailableScheduleForAdResponse.cs @@ -10,6 +10,7 @@ public class AvailableScheduleForAdResponse { public List Items { get; set; } = new(); public bool IsAccepted { get; set; } = true; + public bool IsRemote { get; set; } public int AdId { get; set; } } } diff --git a/TutorLizard.BusinessLogic/Services/StudentService.cs b/TutorLizard.BusinessLogic/Services/StudentService.cs index 9a817b31..f8bc7e60 100644 --- a/TutorLizard.BusinessLogic/Services/StudentService.cs +++ b/TutorLizard.BusinessLogic/Services/StudentService.cs @@ -48,7 +48,8 @@ public async Task CreateScheduleItemRequest(C ScheduleItemId = scheduleItemId, DateCreated = DateTime.UtcNow, StudentId = studentId, - IsAccepted = false + IsAccepted = false, + IsRemote = request.IsRemote }; await _scheduleItemRequestRepository.Create(scheduleItemRequest); diff --git a/TutorLizard.Web/Views/Shared/Components/AvailableScheduleForAd/Default.cshtml b/TutorLizard.Web/Views/Shared/Components/AvailableScheduleForAd/Default.cshtml index 7bb8378f..306fabfb 100644 --- a/TutorLizard.Web/Views/Shared/Components/AvailableScheduleForAd/Default.cshtml +++ b/TutorLizard.Web/Views/Shared/Components/AvailableScheduleForAd/Default.cshtml @@ -31,7 +31,11 @@
@if (item.Status == ScheduleItemRequestStatus.RequestNotSent) { - +
+ +
From 380ba09d428a0d9a5fe26c6f37584ef136586423 Mon Sep 17 00:00:00 2001 From: skrawus Date: Sun, 2 Jun 2024 20:17:16 +0200 Subject: [PATCH 02/12] Add xUnit tests to StudentService --- .../StudentServiceScheduleItemRequestTests.cs | 70 +++++++++++++++++++ .../Student/StudentServiceTestBase.cs | 59 ++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs create mode 100644 Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceTestBase.cs diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs new file mode 100644 index 00000000..dc010133 --- /dev/null +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs @@ -0,0 +1,70 @@ +using Moq; +using TutorLizard.BusinessLogic.Interfaces.Data.Repositories; +using TutorLizard.BusinessLogic.Models; +using TutorLizard.BusinessLogic.Models.DTOs.Requests; +using TutorLizard.BusinessLogic.Services; + +namespace TutorLizard.BusinessLogic.Tests.Services.Student +{ + public class StudentServiceScheduleItemRequestTests : StudentServiceTestBase + { + [Fact] + public async Task CreateScheduleItemRequest_WhenIsRemoteIsTrue_ShouldSetIsRemoteToTrue() + { + // 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); + Assert.NotNull(response.CreatedScheduleItemRequestId); + + var createdScheduleItemRequest = DbContext.ScheduleItemRequests.FirstOrDefault(); + Assert.NotNull(createdScheduleItemRequest); + Assert.True(createdScheduleItemRequest.IsRemote); + } + + [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); + Assert.NotNull(response.CreatedScheduleItemRequestId); + } + + + + + + } +} diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceTestBase.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceTestBase.cs new file mode 100644 index 00000000..7258aab7 --- /dev/null +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceTestBase.cs @@ -0,0 +1,59 @@ +using AutoFixture; +using Microsoft.EntityFrameworkCore; +using Moq; +using TutorLizard.BusinessLogic.Data; +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> MockAdRepository = new(); + protected Mock> MockAdRequestRepository = new(); + protected Mock> MockScheduleItemRepository = new(); + protected Mock> 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())) + .Returns(Task.FromResult(scheduleItem)); + } + + protected void SetupMockGetAllScheduleItems(List scheduleItems) + { + var scheduleItemsInDb = AddEntitiesToInMemoryDb(scheduleItems); + MockScheduleItemRepository + .Setup(x => x.GetAll()) + .Returns(scheduleItemsInDb); + } + + + protected IQueryable AddEntitiesToInMemoryDb(List entities) + where TEntity : class + { + DbContext + .Set() + .AddRange(entities); + DbContext.SaveChanges(); + + return DbContext + .Set() + .AsQueryable(); + } + } +} + \ No newline at end of file From d6bf216bc498c9bb28b6868924cce4163ff38f38 Mon Sep 17 00:00:00 2001 From: skrawus Date: Sun, 2 Jun 2024 20:17:34 +0200 Subject: [PATCH 03/12] Add migration --- ...Add-IsRemote-In-StudentService.Designer.cs | 336 ++++++++++++++++++ ...02175824_Add-IsRemote-In-StudentService.cs | 22 ++ 2 files changed, 358 insertions(+) create mode 100644 TutorLizard.Web/Migrations/20240602175824_Add-IsRemote-In-StudentService.Designer.cs create mode 100644 TutorLizard.Web/Migrations/20240602175824_Add-IsRemote-In-StudentService.cs diff --git a/TutorLizard.Web/Migrations/20240602175824_Add-IsRemote-In-StudentService.Designer.cs b/TutorLizard.Web/Migrations/20240602175824_Add-IsRemote-In-StudentService.Designer.cs new file mode 100644 index 00000000..b2e7a1bd --- /dev/null +++ b/TutorLizard.Web/Migrations/20240602175824_Add-IsRemote-In-StudentService.Designer.cs @@ -0,0 +1,336 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using TutorLizard.BusinessLogic.Data; + +#nullable disable + +namespace TutorLizard.Web.Migrations +{ + [DbContext(typeof(JaszczurContext))] + [Migration("20240602175824_Add-IsRemote-In-StudentService")] + partial class AddIsRemoteInStudentService + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.4") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CategoryId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(3000) + .HasColumnType("nvarchar(3000)"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("Location") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Price") + .HasPrecision(7, 2) + .HasColumnType("decimal(7,2)"); + + b.Property("Subject") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("TutorId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.HasIndex("TutorId"); + + b.ToTable("Ads"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.AdRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AdId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("IsAccepted") + .HasColumnType("bit"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("ReplyMessage") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("ReviewDate") + .HasColumnType("datetime2"); + + b.Property("StudentId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("AdId"); + + b.HasIndex("StudentId"); + + b.ToTable("AdRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Category", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.HasKey("Id"); + + b.ToTable("Categories"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("AdId") + .HasColumnType("int"); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("DateTime") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("AdId"); + + b.ToTable("ScheduleItems"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItemRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("IsAccepted") + .HasColumnType("bit"); + + b.Property("IsRemote") + .HasColumnType("bit"); + + b.Property("ScheduleItemId") + .HasColumnType("int"); + + b.Property("StudentId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ScheduleItemId"); + + b.HasIndex("StudentId"); + + b.ToTable("ScheduleItemRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("DateCreated") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(40) + .HasColumnType("nvarchar(40)"); + + b.Property("PasswordHash") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("UserType") + .HasColumnType("tinyint"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Category", "Category") + .WithMany("Ads") + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("Ads") + .HasForeignKey("TutorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.AdRequest", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Ad", "Ad") + .WithMany("AdRequests") + .HasForeignKey("AdId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("AdRequests") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("Ad"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.Ad", "Ad") + .WithMany("ScheduleItems") + .HasForeignKey("AdId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ad"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItemRequest", b => + { + b.HasOne("TutorLizard.BusinessLogic.Models.ScheduleItem", "ScheduleItem") + .WithMany("ScheduleItemRequests") + .HasForeignKey("ScheduleItemId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("TutorLizard.BusinessLogic.Models.User", "User") + .WithMany("ScheduleItemRequests") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("ScheduleItem"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Ad", b => + { + b.Navigation("AdRequests"); + + b.Navigation("ScheduleItems"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.Category", b => + { + b.Navigation("Ads"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.ScheduleItem", b => + { + b.Navigation("ScheduleItemRequests"); + }); + + modelBuilder.Entity("TutorLizard.BusinessLogic.Models.User", b => + { + b.Navigation("AdRequests"); + + b.Navigation("Ads"); + + b.Navigation("ScheduleItemRequests"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/TutorLizard.Web/Migrations/20240602175824_Add-IsRemote-In-StudentService.cs b/TutorLizard.Web/Migrations/20240602175824_Add-IsRemote-In-StudentService.cs new file mode 100644 index 00000000..a9856426 --- /dev/null +++ b/TutorLizard.Web/Migrations/20240602175824_Add-IsRemote-In-StudentService.cs @@ -0,0 +1,22 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace TutorLizard.Web.Migrations +{ + /// + public partial class AddIsRemoteInStudentService : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} From b6c4b3756c641616cbdd4e8169c732c4101c1720 Mon Sep 17 00:00:00 2001 From: skrawus Date: Sun, 2 Jun 2024 20:18:44 +0200 Subject: [PATCH 04/12] Add isRemote to StudentService --- .../Services/StudentService.cs | 74 +++++++++++-------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/TutorLizard.BusinessLogic/Services/StudentService.cs b/TutorLizard.BusinessLogic/Services/StudentService.cs index f8bc7e60..749230ce 100644 --- a/TutorLizard.BusinessLogic/Services/StudentService.cs +++ b/TutorLizard.BusinessLogic/Services/StudentService.cs @@ -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; @@ -25,6 +24,7 @@ public StudentService(IDbRepository adRepository, _scheduleItemRequestRepository = scheduleItemRequestRepository; } + #region Schedule public async Task CreateScheduleItemRequest(CreateScheduleItemRequestRequest request) { int studentId = request.StudentId; @@ -54,13 +54,50 @@ public async Task CreateScheduleItemRequest(C await _scheduleItemRequestRepository.Create(scheduleItemRequest); - return new CreateScheduleItemRequestResponse - { + return new CreateScheduleItemRequestResponse + { Success = true, CreatedScheduleItemRequestId = scheduleItemRequest.Id, }; } + public async Task GetAvailableScheduleForAd(AvailableScheduleForAdRequest request) + { + List 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 _adRequestRepository.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 ViewAcceptedAds(StudentsAcceptedAdsRequest request) { var studentId = request.StudentId; @@ -143,7 +180,7 @@ public async Task ViewAdRequestStatus(AdRequestStatusRe .FirstOrDefaultAsync(); if (adRequestDetails is null) - return new AdRequestStatusResponse() { IsSuccessful = false }; + return new AdRequestStatusResponse() { IsSuccessful = false }; AdRequestStatusResponse response = new AdRequestStatusResponse() { @@ -234,32 +271,5 @@ public async Task CreateAdRequest(CreateAdRequestReques }; } - public async Task GetAvailableScheduleForAd(AvailableScheduleForAdRequest request) - { - List 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); - - AvailableScheduleForAdResponse response = new() - { - AdId = request.AdId, - IsAccepted = isAccepted, - Items = items - }; - - return response; - } + #endregion } From 2940f020f2cbea04310616149b5dc66c02fc2ea3 Mon Sep 17 00:00:00 2001 From: skrawus Date: Sun, 2 Jun 2024 21:21:37 +0200 Subject: [PATCH 05/12] Add IsRemote to StudentController in CreateScheduleItemRequest --- TutorLizard.Web/Controllers/StudentController.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/TutorLizard.Web/Controllers/StudentController.cs b/TutorLizard.Web/Controllers/StudentController.cs index 8c3d17a0..6c894537 100644 --- a/TutorLizard.Web/Controllers/StudentController.cs +++ b/TutorLizard.Web/Controllers/StudentController.cs @@ -73,7 +73,7 @@ public async Task AdRequests(IFormCollection buttonAction) [HttpPost] [ValidateAntiForgeryToken] - public async Task CreateScheduleItemRequest(int scheduleItemId, int adId) + public async Task CreateScheduleItemRequest(int scheduleItemId, int adId, bool isRemote) { int? studentId = _userAuthenticationService.GetLoggedInUserId(); @@ -85,7 +85,8 @@ public async Task CreateScheduleItemRequest(int scheduleItemId, i CreateScheduleItemRequestRequest request = new() { StudentId = (int)studentId, - ScheduleItemId = scheduleItemId + ScheduleItemId = scheduleItemId, + IsRemote = isRemote }; CreateScheduleItemRequestResponse response = await _studentService.CreateScheduleItemRequest(request); From 5ca0dda65bde906ee4dd7ec1664268f001c91b8a Mon Sep 17 00:00:00 2001 From: skrawus Date: Sun, 2 Jun 2024 23:31:58 +0200 Subject: [PATCH 06/12] Fix IsRemote in CreateScheduleItemRequest Fixed problem in saving data in Database --- .../Responses/CreateScheduleItemRequestResponse.cs | 1 + TutorLizard.BusinessLogic/Services/StudentService.cs | 3 ++- .../Components/AvailableScheduleForAd/Default.cshtml | 12 ++++++------ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/TutorLizard.BusinessLogic/Models/DTOs/Responses/CreateScheduleItemRequestResponse.cs b/TutorLizard.BusinessLogic/Models/DTOs/Responses/CreateScheduleItemRequestResponse.cs index c66eeda4..060abe0c 100644 --- a/TutorLizard.BusinessLogic/Models/DTOs/Responses/CreateScheduleItemRequestResponse.cs +++ b/TutorLizard.BusinessLogic/Models/DTOs/Responses/CreateScheduleItemRequestResponse.cs @@ -10,5 +10,6 @@ public class CreateScheduleItemRequestResponse { public bool Success { get; set; } public int CreatedScheduleItemRequestId { get; set; } + public bool IsRemote { get; set; } } } diff --git a/TutorLizard.BusinessLogic/Services/StudentService.cs b/TutorLizard.BusinessLogic/Services/StudentService.cs index 749230ce..1aba912b 100644 --- a/TutorLizard.BusinessLogic/Services/StudentService.cs +++ b/TutorLizard.BusinessLogic/Services/StudentService.cs @@ -54,10 +54,11 @@ public async Task CreateScheduleItemRequest(C await _scheduleItemRequestRepository.Create(scheduleItemRequest); + return new CreateScheduleItemRequestResponse { Success = true, - CreatedScheduleItemRequestId = scheduleItemRequest.Id, + CreatedScheduleItemRequestId = scheduleItemRequest.Id }; } diff --git a/TutorLizard.Web/Views/Shared/Components/AvailableScheduleForAd/Default.cshtml b/TutorLizard.Web/Views/Shared/Components/AvailableScheduleForAd/Default.cshtml index 306fabfb..460b32b0 100644 --- a/TutorLizard.Web/Views/Shared/Components/AvailableScheduleForAd/Default.cshtml +++ b/TutorLizard.Web/Views/Shared/Components/AvailableScheduleForAd/Default.cshtml @@ -31,15 +31,15 @@
@if (item.Status == ScheduleItemRequestStatus.RequestNotSent) { -
- -
+
+ +
- + }
From b45c2bb20c746005917d61d02c7fd2e185707578 Mon Sep 17 00:00:00 2001 From: skrawus Date: Sun, 2 Jun 2024 23:51:03 +0200 Subject: [PATCH 07/12] Fix tests of IsRemote of CreateScheduleItemRequest --- .../StudentServiceScheduleItemRequestTests.cs | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs index dc010133..34ad479f 100644 --- a/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs @@ -12,29 +12,43 @@ public class StudentServiceScheduleItemRequestTests : StudentServiceTestBase public async Task CreateScheduleItemRequest_WhenIsRemoteIsTrue_ShouldSetIsRemoteToTrue() { // Arrange - var scheduleItem = new ScheduleItem { Id = 1 }; - var studentId = 1; - var isRemote = true; - + var scheduleItem = new ScheduleItem { Id = 1, Ad = new Ad { TutorId = 2 } }; SetupMockGetScheduleItemById(scheduleItem); var request = new CreateScheduleItemRequestRequest { - StudentId = studentId, - ScheduleItemId = scheduleItem.Id, - IsRemote = isRemote + StudentId = 2, + ScheduleItemId = 1, + IsRemote = true }; // Act - var response = await StudentService.CreateScheduleItemRequest(request); + await StudentService.CreateScheduleItemRequest(request); // Assert - Assert.True(response.Success); - Assert.NotNull(response.CreatedScheduleItemRequestId); + MockScheduleItemRequestRepository.Verify(repo => repo.Create(It.Is(req => req.IsRemote == true)), Times.Once); + + } - var createdScheduleItemRequest = DbContext.ScheduleItemRequests.FirstOrDefault(); - Assert.NotNull(createdScheduleItemRequest); - Assert.True(createdScheduleItemRequest.IsRemote); + [Fact] + public async Task CreateScheduleItemRequest_WhenIsRemoteIsFalse_ShouldSetIsRemoteToFalse() + { + // Arrange + var scheduleItem = new ScheduleItem { Id = 1, Ad = new Ad { TutorId = 2 } }; + SetupMockGetScheduleItemById(scheduleItem); + + var request = new CreateScheduleItemRequestRequest + { + StudentId = 2, + ScheduleItemId = 1, + IsRemote = false + }; + + // Act + await StudentService.CreateScheduleItemRequest(request); + + // Assert + MockScheduleItemRequestRepository.Verify(repo => repo.Create(It.Is(req => req.IsRemote == false)), Times.Once); } [Fact] From e03154f9f072e7cc9979cbaaf4cd66c38ff0a130 Mon Sep 17 00:00:00 2001 From: skrawus Date: Fri, 14 Jun 2024 16:04:16 +0200 Subject: [PATCH 08/12] Add GetAll in the test CreateScheduleItemRequest_WhenIsRemoteIsTrue_ShouldSetIsRemoteToTrue --- .../StudentServiceScheduleItemRequestTests.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs index 34ad479f..b4b1a12c 100644 --- a/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs @@ -12,12 +12,23 @@ public class StudentServiceScheduleItemRequestTests : StudentServiceTestBase public async Task CreateScheduleItemRequest_WhenIsRemoteIsTrue_ShouldSetIsRemoteToTrue() { // Arrange - var scheduleItem = new ScheduleItem { Id = 1, Ad = new Ad { TutorId = 2 } }; + 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); + var scheduleItems = new List { scheduleItem }; + SetupMockGetAllScheduleItems(scheduleItems); + var request = new CreateScheduleItemRequestRequest { - StudentId = 2, + StudentId = 3, ScheduleItemId = 1, IsRemote = true }; From c41bb69aef76b15e1f06158c2c3751a58a97282f Mon Sep 17 00:00:00 2001 From: skrawus Date: Fri, 14 Jun 2024 16:08:18 +0200 Subject: [PATCH 09/12] Add MockScheduleItemRequestRepository In Arrange of WhenIsRemoteIsTrue CreateScheduleItemRequest_WhenIsRemoteIsTrue_ShouldSetIsRemoteToTrue --- .../StudentServiceScheduleItemRequestTests.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs index b4b1a12c..17620562 100644 --- a/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs @@ -1,11 +1,10 @@ using Moq; -using TutorLizard.BusinessLogic.Interfaces.Data.Repositories; using TutorLizard.BusinessLogic.Models; using TutorLizard.BusinessLogic.Models.DTOs.Requests; using TutorLizard.BusinessLogic.Services; namespace TutorLizard.BusinessLogic.Tests.Services.Student -{ +{ public class StudentServiceScheduleItemRequestTests : StudentServiceTestBase { [Fact] @@ -33,12 +32,17 @@ public async Task CreateScheduleItemRequest_WhenIsRemoteIsTrue_ShouldSetIsRemote IsRemote = true }; + MockScheduleItemRequestRepository + .Setup(x => x.Create(It.Is(req => req.IsRemote == true))) + .Returns((ScheduleItemRequest req) => Task.FromResult(req)) + .Verifiable(Times.Once); + // Act await StudentService.CreateScheduleItemRequest(request); // Assert - MockScheduleItemRequestRepository.Verify(repo => repo.Create(It.Is(req => req.IsRemote == true)), Times.Once); - + MockScheduleItemRequestRepository.VerifyAll(); + } [Fact] From 589f9b5db863e9328f4d51ba10a484b6a807b93f Mon Sep 17 00:00:00 2001 From: skrawus Date: Fri, 14 Jun 2024 16:12:15 +0200 Subject: [PATCH 10/12] Delete unnecessary check in test CreateScheduleItemRequest_WhenRequestSent_ShouldReturnSuccess --- .../Services/Student/StudentServiceScheduleItemRequestTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs index 17620562..97c3721d 100644 --- a/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs @@ -88,7 +88,6 @@ public async Task CreateScheduleItemRequest_WhenRequestSent_ShouldReturnSuccess( // Assert Assert.True(response.Success); - Assert.NotNull(response.CreatedScheduleItemRequestId); } From b7ed9bbccceefb5882bd4ecddb342f75ca27376e Mon Sep 17 00:00:00 2001 From: skrawus Date: Sat, 15 Jun 2024 11:39:23 +0200 Subject: [PATCH 11/12] Correct IsRemote checkbox --- .../Services/StudentService.cs | 2 +- .../AvailableScheduleForAd/Default.cshtml | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/TutorLizard.BusinessLogic/Services/StudentService.cs b/TutorLizard.BusinessLogic/Services/StudentService.cs index 1aba912b..104f728d 100644 --- a/TutorLizard.BusinessLogic/Services/StudentService.cs +++ b/TutorLizard.BusinessLogic/Services/StudentService.cs @@ -81,7 +81,7 @@ public async Task GetAvailableScheduleForAd(Avai .Where(ar => ar.AdId == request.AdId) .AnyAsync(ar => ar.StudentId == request.StudentId && ar.IsAccepted); - bool isRemote = await _adRequestRepository.GetAll() + bool isRemote = await _adRepository.GetAll() .Where(ad => ad.Id == request.AdId) .Select(ad => ad.IsRemote) .FirstOrDefaultAsync(); diff --git a/TutorLizard.Web/Views/Shared/Components/AvailableScheduleForAd/Default.cshtml b/TutorLizard.Web/Views/Shared/Components/AvailableScheduleForAd/Default.cshtml index 460b32b0..9ea08090 100644 --- a/TutorLizard.Web/Views/Shared/Components/AvailableScheduleForAd/Default.cshtml +++ b/TutorLizard.Web/Views/Shared/Components/AvailableScheduleForAd/Default.cshtml @@ -29,19 +29,21 @@ { Nie wysłano
- @if (item.Status == ScheduleItemRequestStatus.RequestNotSent) - {
-
- -
+ + @if (Model.IsRemote) + { +
+ +
+ } +
- }
}
From de7c7ba355cb3794dd65d371c7290260cef6453c Mon Sep 17 00:00:00 2001 From: skrawus Date: Sat, 15 Jun 2024 12:25:44 +0200 Subject: [PATCH 12/12] Change tests of IsRemote - make it one test CreateScheduleItemRequest_ShouldSetIsRemoteCorrectly --- .../StudentServiceScheduleItemRequestTests.cs | 37 ++++--------------- .../Student/StudentServiceTestBase.cs | 6 +-- 2 files changed, 9 insertions(+), 34 deletions(-) diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs index 97c3721d..2de8a0bc 100644 --- a/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceScheduleItemRequestTests.cs @@ -7,8 +7,10 @@ namespace TutorLizard.BusinessLogic.Tests.Services.Student { public class StudentServiceScheduleItemRequestTests : StudentServiceTestBase { - [Fact] - public async Task CreateScheduleItemRequest_WhenIsRemoteIsTrue_ShouldSetIsRemoteToTrue() + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task CreateScheduleItemRequest_ShouldSetIsRemoteCorrectly(bool isRemote) { // Arrange var ad = new Ad @@ -20,20 +22,19 @@ public async Task CreateScheduleItemRequest_WhenIsRemoteIsTrue_ShouldSetIsRemote TutorId = 2 }; var scheduleItem = new ScheduleItem { Id = 1, Ad = ad }; - SetupMockGetScheduleItemById(scheduleItem); - var scheduleItems = new List { scheduleItem }; - SetupMockGetAllScheduleItems(scheduleItems); + SetupMockGetScheduleItemById(scheduleItem); + SetupMockGetAllScheduleItems(new List { scheduleItem }); var request = new CreateScheduleItemRequestRequest { StudentId = 3, ScheduleItemId = 1, - IsRemote = true + IsRemote = isRemote }; MockScheduleItemRequestRepository - .Setup(x => x.Create(It.Is(req => req.IsRemote == true))) + .Setup(x => x.Create(It.Is(req => req.IsRemote == isRemote))) .Returns((ScheduleItemRequest req) => Task.FromResult(req)) .Verifiable(Times.Once); @@ -42,28 +43,6 @@ public async Task CreateScheduleItemRequest_WhenIsRemoteIsTrue_ShouldSetIsRemote // Assert MockScheduleItemRequestRepository.VerifyAll(); - - } - - [Fact] - public async Task CreateScheduleItemRequest_WhenIsRemoteIsFalse_ShouldSetIsRemoteToFalse() - { - // Arrange - var scheduleItem = new ScheduleItem { Id = 1, Ad = new Ad { TutorId = 2 } }; - SetupMockGetScheduleItemById(scheduleItem); - - var request = new CreateScheduleItemRequestRequest - { - StudentId = 2, - ScheduleItemId = 1, - IsRemote = false - }; - - // Act - await StudentService.CreateScheduleItemRequest(request); - - // Assert - MockScheduleItemRequestRepository.Verify(repo => repo.Create(It.Is(req => req.IsRemote == false)), Times.Once); } [Fact] diff --git a/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceTestBase.cs b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceTestBase.cs index 7258aab7..98408524 100644 --- a/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceTestBase.cs +++ b/Tests/TutorLizard.BusinessLogic.Tests/Services/Student/StudentServiceTestBase.cs @@ -1,7 +1,5 @@ using AutoFixture; -using Microsoft.EntityFrameworkCore; using Moq; -using TutorLizard.BusinessLogic.Data; using TutorLizard.BusinessLogic.Interfaces.Data.Repositories; using TutorLizard.BusinessLogic.Models; using TutorLizard.BusinessLogic.Services; @@ -16,7 +14,7 @@ public class StudentServiceTestBase : TestsWithInMemoryDbBase protected Mock> MockAdRequestRepository = new(); protected Mock> MockScheduleItemRepository = new(); protected Mock> MockScheduleItemRequestRepository = new(); - + protected StudentServiceTestBase() : base() { @@ -41,7 +39,6 @@ protected void SetupMockGetAllScheduleItems(List scheduleItems) .Returns(scheduleItemsInDb); } - protected IQueryable AddEntitiesToInMemoryDb(List entities) where TEntity : class { @@ -56,4 +53,3 @@ protected IQueryable AddEntitiesToInMemoryDb(List ent } } } - \ No newline at end of file