public async Task WhenAddingApplicationThenUnitOfWorkIsCommitted()
        {
            // Arrange
            IApplicationRepository fakeApplicationRepository = A.Fake <IApplicationRepository>();

            A.CallTo(() => fakeApplicationRepository.TryGetByDisplayNameAsync(A <string> .Ignored)).Returns(Task.FromResult <ApplicationEntity>(null));

            IUnitOfWork fakeUnitOfWork = A.Fake <IUnitOfWork>();

            IPasswordWithSaltHasher fakePasswordHasher = A.Fake <IPasswordWithSaltHasher>();

            A.CallTo(() => fakePasswordHasher.HashPassword(A <string> .Ignored)).Returns(new HashWithSaltResult());

            IApplicationService applicationService = new ApplicationService(fakeApplicationRepository, fakeUnitOfWork, fakePasswordHasher);

            ApplicationCreateDto applicationCreateDto = new ApplicationCreateDto()
            {
                DisplayName = "TestApplicationDisplayName",
                Password    = "******"
            };

            // Act
            await applicationService.AddApplicationAsync(applicationCreateDto);

            // Assert
            A.CallTo(() => fakeUnitOfWork.CommitAsync()).MustHaveHappened();
        }
        public async Task <int> AddApplicationAsync(ApplicationCreateDto applicationCreateDto)
        {
            if (applicationCreateDto == null ||
                string.IsNullOrWhiteSpace(applicationCreateDto.DisplayName) ||
                string.IsNullOrWhiteSpace(applicationCreateDto.Password))
            {
                throw new ArgumentException("Application name and password must be provided.");
            }

            if (await _applicationRepository.TryGetByDisplayNameAsync(applicationCreateDto.DisplayName) != null)
            {
                throw new ArgumentException($"Application with DisplayName {applicationCreateDto.DisplayName} already exists.");
            }

            ApplicationEntity application = applicationCreateDto.ToApplication();

            HashWithSaltResult hashWithSaltResultDto = _passwordWithSaltHasher.HashPassword(applicationCreateDto.Password);

            application.PasswordHash = hashWithSaltResultDto.Hash;
            application.PasswordSalt = hashWithSaltResultDto.Salt;

            _applicationRepository.Add(application);
            await _unitOfWork.CommitAsync();

            return(application.Id);
        }
        public void WhenAddingExistingApplicationThenExceptionIsThrown()
        {
            // Arrange
            IApplicationRepository fakeApplicationRepository = A.Fake <IApplicationRepository>();

            A.CallTo(() => fakeApplicationRepository.TryGetByDisplayNameAsync(A <string> .Ignored)).Returns(Task.FromResult(new ApplicationEntity()));

            IUnitOfWork fakeUnitOfWork = A.Fake <IUnitOfWork>();

            IPasswordWithSaltHasher fakePasswordHasher = A.Fake <IPasswordWithSaltHasher>();

            IApplicationService applicationService = new ApplicationService(fakeApplicationRepository, fakeUnitOfWork, fakePasswordHasher);

            ApplicationCreateDto applicationCreateDto = new ApplicationCreateDto()
            {
                DisplayName = "TestApplicationDisplayName",
                Password    = "******"
            };

            // Act
            ArgumentException ex = Assert.CatchAsync <ArgumentException>(async() => await applicationService.AddApplicationAsync(applicationCreateDto));

            // Assert
            StringAssert.Contains("Application with DisplayName TestApplicationDisplayName already exists.", ex.Message);
        }
Esempio n. 4
0
 public static ApplicationEntity ToApplication(this ApplicationCreateDto applicationCreateDto)
 {
     return(ObjectMapperManager
            .DefaultInstance
            .GetMapper <ApplicationCreateDto, ApplicationEntity>()
            .Map(applicationCreateDto));
 }
Esempio n. 5
0
        public async void UpdateApplicationShouldCreateNewApplicationWithUpdatedVersion()
        {
            var result = await _fixture.GetHttpResult(UrlPath + _applicationToUpdateId);

            var applicationToUpdate = JsonConvert.DeserializeObject <ApplicationDetailDto>(result.Content.ReadAsStringAsync().Result);

            var newCreateDto = new ApplicationCreateDto()
            {
                ConferenceId = applicationToUpdate.Conference?.Id,
                FilledForm   = "{\"1\":\"Messi\",\"2\":\"Rolando\"}",
                FormId       = applicationToUpdate.Form.Id,
                StatusId     = applicationToUpdate.StatusId,
                UserId       = applicationToUpdate.User.Id
            };

            var serializedApplication = JsonConvert.SerializeObject(newCreateDto);
            var response = await _fixture.PutHttpResult($"{UrlPath}{_applicationToUpdateId}", serializedApplication);

            response.Should().NotBeNull();
            response.StatusCode.Should().Be(HttpStatusCode.OK);

            var deserializedResponse = JsonConvert.DeserializeObject <ApplicationDetailDto>(response.Content.ReadAsStringAsync().Result);

            deserializedResponse.Version.Should().Be(applicationToUpdate.Version + 1);

            deserializedResponse.PreviousVersion.Should().Be(applicationToUpdate.Id);

            deserializedResponse.Comments.Count().Should().Be(applicationToUpdate.Comments.Count());

            deserializedResponse.Assignments.Count().Should().Be(applicationToUpdate.Assignments.Count());
            deserializedResponse.Assignments.Select(userDto => userDto.Id).ToList().ForEach(guid =>
            {
                applicationToUpdate.Assignments.Select(userDto => userDto.Id).Contains(guid).Should().Be(true);
            });
        }
Esempio n. 6
0
        // creates an new application and returns the object as a DTO
        public ApplicationDetailDto CreateApplication(ApplicationCreateDto applicationToCreate)
        {
            var newApplication = applicationToCreate.ToModel();

            newApplication.IsCurrent = true;
            newApplication.Version   = 1;

            _applicationDbContext.Application.Add(newApplication);

            Save();

            return(GetApplicationById(newApplication.Id));
        }
Esempio n. 7
0
 public static Application ToModel(this ApplicationCreateDto response)
 {
     return(new Application()
     {
         Id = Guid.NewGuid(),
         Created = DateTime.UtcNow,
         LastModified = DateTime.UtcNow,
         FilledForm = response.FilledForm,
         UserId = response.UserId,
         ConferenceId = response.ConferenceId,
         StatusId = response.StatusId,
         FormId = response.FormId
     });
 }
Esempio n. 8
0
        // updates an Application
        // the updated application is set to IsCurrent = false
        // a new application will be created referencing the old one
        public ApplicationDetailDto UpdateApplication(Guid applicationId, ApplicationCreateDto newApplication)
        {
            var currentApplication = _applicationDbContext.Application
                                     .Include(application => application.Comment)
                                     .Include(application => application.Assignment)
                                     .SingleOrDefault(app => app.Id == applicationId);

            currentApplication.IsCurrent = false;

            var updatedApplication = newApplication.ToModel();

            updatedApplication.IsCurrent       = true;
            updatedApplication.Version         = currentApplication.Version + 1;
            updatedApplication.PreviousVersion = currentApplication.Id;

            _applicationDbContext.Application.Add(updatedApplication);


            // Copies the old comments to the new application
            currentApplication.Comment?.ToList()
            .ForEach(comment =>
            {
                var copyOfComment = new Comment()
                {
                    Id              = Guid.NewGuid(),
                    ApplicationId   = updatedApplication.Id,
                    Created         = DateTime.UtcNow,
                    IsPrivate       = comment.IsPrivate,
                    RequiresChanges = comment.RequiresChanges,
                    Message         = comment.Message,
                    UserId          = comment.UserId
                };
                _applicationDbContext.Comment.Add(copyOfComment);
            });

            // copies the old assignments to the new one
            currentApplication.Assignment?.ToList().ForEach(assignment =>
            {
                _applicationDbContext.Assignment.Add(new Assignment()
                {
                    ApplicationId = updatedApplication.Id,
                    UserId        = assignment.UserId
                });
            });

            Save();

            return(GetApplicationById(updatedApplication.Id));
        }
Esempio n. 9
0
        public virtual IActionResult CreateApplication([FromBody] ApplicationCreateDto application)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var newApplication = _applicationRepository.CreateApplication(application);

            _applicationRepository.Save();

            var location = "/application/" + newApplication.Id;

            return(Created(location, newApplication));
        }
Esempio n. 10
0
        public async void CreateApplicationWithInvalidModelStateShouldReturnBadRequest()
        {
            var newApplication = new ApplicationCreateDto()
            {
                FormId     = DataSeeder.FormId1,
                StatusId   = StatusValue.CREATED,
                FilledForm = "{\"1\":\"Messi\",\"2\":\"Rolando\"}"
            };

            var serializedApplication = JsonConvert.SerializeObject(newApplication);
            var result = await _fixture.PostHttpResult(UrlPath, serializedApplication);

            result.Should().NotBeNull();
            result.StatusCode.Should().Be(HttpStatusCode.BadRequest);
        }
        public async Task <IHttpActionResult> RegisterAsync(ApplicationCreateModel applicationCreateModel)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            try
            {
                ApplicationCreateDto applicationCreateDto = applicationCreateModel.ToApplicationCreateDto();

                int applicationId = await _applicationService.AddApplicationAsync(applicationCreateDto);

                return(Ok(applicationId));
            }
            catch (Exception ex)
            {
                return(BadRequest(ex.Message));
            }
        }
        public void WhenAddingApplicationWithEmptyPasswordThenExceptionIsThrown()
        {
            // Arrange
            IApplicationRepository  fakeApplicationRepository = A.Fake <IApplicationRepository>();
            IUnitOfWork             fakeUnitOfWork            = A.Fake <IUnitOfWork>();
            IPasswordWithSaltHasher fakePasswordHasher        = A.Fake <IPasswordWithSaltHasher>();
            IApplicationService     applicationService        = new ApplicationService(fakeApplicationRepository, fakeUnitOfWork, fakePasswordHasher);

            ApplicationCreateDto applicationCreateDto = new ApplicationCreateDto()
            {
                DisplayName = "TestApplicationDisplayName",
                Password    = ""
            };

            // Act
            ArgumentException ex = Assert.CatchAsync <ArgumentException>(async() => await applicationService.AddApplicationAsync(applicationCreateDto));

            // Assert
            StringAssert.Contains("Application name and password must be provided.", ex.Message);
        }
Esempio n. 13
0
        public IActionResult CreateApplication([FromBody] ApplicationCreateDto ApplicationDto)
        {
            if (ApplicationDto == null)
            {
                return(BadRequest(ModelState));
            }
            if (_apRepo.ApplicationExists(ApplicationDto.IdentityNumber))
            {
                ModelState.AddModelError("", "application Exists!");
                return(StatusCode(404, ModelState));
            }
            var ApplicationObj = _mapper.Map <Application>(ApplicationDto);

            if (!_apRepo.CreateApplication(ApplicationObj))
            {
                ModelState.AddModelError("", $"Something went wrong when saving the record {ApplicationObj.IdentityNumber}");
                return(StatusCode(500, ModelState));
            }
            return(CreatedAtRoute("GetApplication", new { version = HttpContext.GetRequestedApiVersion().ToString(),
                                                          ApplicationId = ApplicationObj.Id }, ApplicationObj));
        }
Esempio n. 14
0
        public virtual IActionResult UpdateApplicationById([FromRoute] Guid applicationId, [FromBody] ApplicationCreateDto application)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            var updatedApplication = _applicationRepository.UpdateApplication(applicationId, application);

            _applicationRepository.Save();

            return(Ok(updatedApplication));
        }