public async Task UpdateExtraClass_GivenSuccessfulValidation_TeacherNotFound_ShouldThrowNotFoundException()
        {
            var teacherId = await RunAsUserAsync("teacher@local", "Teacher1234!");

            var subjectId = await SendAsync(new CreateSubjectCommand { Name = "StaffLogic" });

            var extraClassId = await SendAsync(new CreateExtraClassCommand
            {
                SubjectId = subjectId,
                Date      = DateTime.Now,
                Duration  = TimeSpan.FromMinutes(60),
                Name      = "StaffLogic",
                Price     = 100,
                Size      = 2,
            });

            var command = new UpdateExtraClassCommand
            {
                Id        = extraClassId,
                Date      = DateTime.Now,
                Duration  = TimeSpan.FromMinutes(60),
                Name      = "StaffLogic",
                Price     = 100,
                Size      = 2,
                TeacherId = Guid.NewGuid().ToString()
            };

            // Assert
            FluentActions.Invoking(() =>
                                   SendAsync(command)).Should().Throw <NotFoundException>();
        }
        public async Task UpdateExtraClass_ShouldUpdateSuccessfully()
        {
            // Arrange
            var name     = "Staff logic training";
            var date     = new DateTime(2056, 1, 1);
            var duration = new TimeSpan(1, 0, 0);
            var size     = 3;
            var price    = 100;

            var teacherId = await RunAsUserAsync("teacher@local", "Teacher1234!");

            var subjectId = await SendAsync(new CreateSubjectCommand { Name = "StaffLogic" });

            var extraClassId = await SendAsync(new CreateExtraClassCommand
            {
                SubjectId = subjectId,
                Date      = date,
                Duration  = duration,
                Name      = name,
                Price     = price,
                Size      = size,
            });

            var newName = "Staff Logic Theory";

            var command = new UpdateExtraClassCommand
            {
                Id        = extraClassId,
                SubjectId = subjectId,
                TeacherId = teacherId,
                Date      = date,
                Size      = size,
                Duration  = duration,
                Name      = newName,
                Price     = price
            };

            await SendAsync(command);

            var extraClass = await FindAsync <ExtraClass>(extraClassId);

            extraClass.Name.Should().Be(newName);
            extraClass.Price.Should().Be(price);
            extraClass.Size.Should().Be(size);
            extraClass.SubjectId.Should().Be(subjectId);
            extraClass.TeacherId.Should().Be(teacherId);
            extraClass.LastModifiedBy.Should().Be(teacherId);
        }
        public async Task UpdateExtraClass_GivenSuccessfulValidation_ClassSizeTooSmall_ShouldThrowClassSizeIsTooSmallForCurrentBookingsException()
        {
            // Arrange
            var name     = "Staff logic training";
            var date     = new DateTime(2056, 1, 1);
            var duration = new TimeSpan(1, 0, 0);
            var size     = 3;
            var price    = 100;

            var teacherId = await RunAsUserAsync("teacher@local", "Teacher1234!");

            var subjectId = await SendAsync(new CreateSubjectCommand { Name = "Wizardry" });

            var extraClassId = await SendAsync(new CreateExtraClassCommand
            {
                SubjectId = subjectId,
                Date      = date,
                Duration  = duration,
                Name      = name,
                Price     = price,
                Size      = size,
            });

            await SendAsync(new CreateBookingCommand { ExtraClassId = extraClassId });

            await RunAsUserAsync("student@local", "Student1234!");

            await SendAsync(new CreateBookingCommand { ExtraClassId = extraClassId });

            //Assert
            var command = new UpdateExtraClassCommand
            {
                Date      = date,
                Size      = 1,
                SubjectId = subjectId,
                Duration  = duration,
                Id        = extraClassId,
                Name      = name,
                Price     = price,
                TeacherId = teacherId
            };

            FluentActions.Invoking(() =>
                                   SendAsync(command)).Should().Throw <ClassSizeIsTooSmallForCurrentBookingsException>();
        }
        public void UpdateExtraClass_GivenSuccessfulValidation_ShouldThrowNotFoundException()
        {
            var command = new UpdateExtraClassCommand
            {
                Id        = 999,
                Name      = "Staff logic training",
                Date      = new DateTime(2056, 1, 1),
                Duration  = new TimeSpan(1, 0, 0),
                Size      = 10,
                SubjectId = 1,
                TeacherId = "111111",
                Price     = 100,
            };

            // Assert
            FluentActions.Invoking(() =>
                                   SendAsync(command)).Should().Throw <NotFoundException>();
        }
        public async Task <IActionResult> Update([FromBody] UpdateExtraClassCommand command)
        {
            await Mediator.Send(command);

            return(NoContent());
        }