public async Task AddAppointmentShouldReturnNull(string clientId, string trainerId)
        {
            var options = new DbContextOptionsBuilder <ApplicationDbContext>()
                          .UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;
            var db = new ApplicationDbContext(options);
            var appointmentsRepository = new EfDeletableEntityRepository <Appointment>(db);
            var usersRepository        = new EfDeletableEntityRepository <ApplicationUser>(db);
            var notificationsService   = new Mock <INotificationsService>();

            var service = new AppointmentsService(
                appointmentsRepository,
                usersRepository,
                notificationsService.Object);

            var inputModel = new AddAppointmentInputModel()
            {
                StartTime  = DateTime.UtcNow,
                EndTime    = DateTime.UtcNow.AddDays(2),
                ClientId   = clientId,
                TrainerId  = trainerId,
                IsApproved = true,
                Notes      = null,
                Type       = AppointmentType.Consultation,
            };

            var result = await service.AddAppoinmentAsync(inputModel);

            Assert.Null(result);
        }
        public async Task GetAppointmentRequestsForTrainerShouldNotThrow()
        {
            var options = new DbContextOptionsBuilder <ApplicationDbContext>()
                          .UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;
            var db = new ApplicationDbContext(options);
            var appointmentsRepository = new EfDeletableEntityRepository <Appointment>(db);
            var usersRepository        = new EfDeletableEntityRepository <ApplicationUser>(db);
            var notificationsService   = new Mock <INotificationsService>();

            var service = new AppointmentsService(
                appointmentsRepository,
                usersRepository,
                notificationsService.Object);

            var client       = new ApplicationUser();
            var trainer      = new ApplicationUser();
            var role         = new ApplicationRole(GlobalConstants.TrainerRoleName);
            var identityRole = new IdentityUserRole <string>()
            {
                RoleId = role.Id,
                UserId = trainer.Id,
            };

            trainer.Roles.Add(identityRole);

            await usersRepository.AddAsync(trainer);

            await usersRepository.AddAsync(client);

            await usersRepository.SaveChangesAsync();

            var inputModel = new AddAppointmentInputModel()
            {
                StartTime  = DateTime.UtcNow,
                EndTime    = DateTime.UtcNow.AddDays(2),
                ClientId   = client.Id,
                TrainerId  = trainer.Id,
                IsApproved = true,
                Notes      = "Plamen",
                Type       = AppointmentType.Consultation,
            };

            var appointment = await service.AddAppoinmentAsync(inputModel);

            var result = await service.GetAppointmentRequestsForTrainer <TestAppointmentModel>(trainer.Id);

            Assert.Empty(result);
        }
        public async Task ApproveAppointmentShouldThrow(string clientId, string trainerId, int appointmentId)
        {
            var options = new DbContextOptionsBuilder <ApplicationDbContext>()
                          .UseInMemoryDatabase(Guid.NewGuid().ToString()).Options;
            var db = new ApplicationDbContext(options);
            var appointmentsRepository = new EfDeletableEntityRepository <Appointment>(db);
            var usersRepository        = new EfDeletableEntityRepository <ApplicationUser>(db);
            var notificationsService   = new Mock <INotificationsService>();

            var service = new AppointmentsService(
                appointmentsRepository,
                usersRepository,
                notificationsService.Object);

            var client       = new ApplicationUser();
            var trainer      = new ApplicationUser();
            var role         = new ApplicationRole(GlobalConstants.TrainerRoleName);
            var identityRole = new IdentityUserRole <string>()
            {
                RoleId = role.Id,
                UserId = trainer.Id,
            };

            trainer.Roles.Add(identityRole);

            await usersRepository.AddAsync(trainer);

            await usersRepository.AddAsync(client);

            await usersRepository.SaveChangesAsync();

            var inputModel = new AddAppointmentInputModel()
            {
                StartTime  = DateTime.UtcNow,
                EndTime    = DateTime.UtcNow.AddDays(3),
                ClientId   = client.Id,
                TrainerId  = trainer.Id,
                IsApproved = true,
                Notes      = null,
                Type       = AppointmentType.Consultation,
            };

            var appointment = await service.AddAppoinmentAsync(inputModel);

            await Assert.ThrowsAnyAsync <InvalidOperationException>(async() =>
                                                                    await service.ApproveAppointment(appointmentId, trainerId, clientId));
        }