public void Update_the_project()
        {
            var project = SetUpFullProjectWithAuthentication();

            var forCode = new ProjectFieldOfResearch
            {
                Code = Builder <FieldOfResearch> .CreateNew()
                       .With(o => o.Id  = Pick <string> .RandomItemFrom(new[] { "ABC", "DEF", "GHI" }))
                       .And(o => o.Name = string.Format("{0} Name", o.Id))
                       .Build()
            };

            var seoCode = new ProjectSocioEconomicObjective
            {
                Code = Builder <SocioEconomicObjective> .CreateNew()
                       .With(o => o.Id  = Pick <string> .RandomItemFrom(new[] { "XYZ", "RST", "UVW" }))
                       .And(o => o.Name = string.Format("{0} Name", o.Id))
                       .Build()
            };

            var vm = new ProjectDetailsViewModel
            {
                Id     = project.Id,
                Status = PickHelper.RandomEnumExcept(project.Status),
                // deliberately change the source type to an invalid one
                SourceProjectType       = PickHelper.RandomEnumExcept(project.SourceProjectType, SourceProjectType.None),
                EndDate                 = string.Format("{0:dd-MM-yyyy}", (project.EndDate ?? DateTime.Today).AddDays(10)),
                StartDate               = string.Format("{0:dd-MM-yyyy}", (project.StartDate ?? DateTime.Today).AddDays(-10)),
                Description             = "aut viam inveniam aut faciam",
                FieldsOfResearch        = project.FieldsOfResearch.Except(project.FieldsOfResearch.Take(1)).Union(new[] { forCode }).Cast <ClassificationBase>().ToList(),
                SocioEconomicObjectives = project.SocioEconomicObjectives.Except(project.SocioEconomicObjectives.Take(1)).Union(new[] { seoCode }).Cast <ClassificationBase>().ToList(),
                PrincipalInvestigator   = project.Parties.Single(o => o.Relationship == ProjectRelationship.PrincipalInvestigator).Party,
                ArcFunder               = new ArcProjectFunderViewModel {
                    GrantNumber = "BYC980", IsFunded = true
                },
                NmhrcFunder = new NmhrcProjectFunderViewModel {
                    IsFunded = false
                },
                Keywords = "other keywords",
                Title    = "crede quod habes, et habes"
            };

            _controller.WithCallTo(c => c.Project(vm)).ShouldRedirectTo <DmpController>(_dmpController.GetType().GetMethod("Edit", new[] { typeof(int), typeof(int) }));

            _projectRepository.Received().Save(Arg.Is <Project>(p => p.Description == vm.Description));
            _projectRepository.Received().Save(Arg.Is <Project>(p => p.Title == vm.Title));
            _projectRepository.Received().Save(Arg.Is <Project>(p => p.StartDate == DateTime.Parse(vm.StartDate)));
            _projectRepository.Received().Save(Arg.Is <Project>(p => p.EndDate == DateTime.Parse(vm.EndDate)));
            _projectRepository.Received().Save(Arg.Is <Project>(p => p.Keywords == vm.Keywords));
            _projectRepository.Received().Save(Arg.Is <Project>(p => p.Status == vm.Status));
            _projectRepository.Received().Save(Arg.Is <Project>(p => p.SourceProjectType == SourceProjectType.DMP));
            _projectRepository.Received().Save(Arg.Is <Project>(p => p.Funders.Count() == 1));
            _projectRepository.Received().Save(Arg.Is <Project>(p => p.Funders.Count(o => o.Funder == Funder.ARC && o.GrantNumber == vm.ArcFunder.GrantNumber) == 1));
            _projectRepository.Received().Save(Arg.Is <Project>(p => p.SocioEconomicObjectives.All(o => vm.SocioEconomicObjectives.Any(q => q.Code.Id == o.Code.Id))));
            _projectRepository.Received().Save(Arg.Is <Project>(p => p.FieldsOfResearch.All(o => vm.FieldsOfResearch.Any(q => q.Code.Id == o.Code.Id))));
        }
        public void Update_datadeposit_project()
        {
            var project = SetUpFullProjectWithAuthentication();
            
            var forCode = new ProjectFieldOfResearch
            {
                Code = Builder<FieldOfResearch>.CreateNew()
                    .With(o => o.Id = Pick<string>.RandomItemFrom(new[] { "ABC", "DEF", "GHI" }))
                    .And(o => o.Name = string.Format("{0} Name", o.Id))
                    .Build()
            };

            var seoCode = new ProjectSocioEconomicObjective
            {
                Code = Builder<SocioEconomicObjective>.CreateNew()
                    .With(o => o.Id = Pick<string>.RandomItemFrom(new[] { "XYZ", "RST", "UVW" }))
                    .And(o => o.Name = string.Format("{0} Name", o.Id))
                    .Build()
            };

            var vm = new ProjectDetailsViewModel
                         {
                             Id = project.Id,
                             Status = PickHelper.RandomEnumExcept(project.Status),
                             // deliberately change the source type to an invalid one
                             SourceProjectType = PickHelper.RandomEnumExcept(project.SourceProjectType, SourceProjectType.None),
                             EndDate = string.Format("{0:dd-MM-yyyy}", (project.EndDate ?? DateTime.Today).AddDays(10)),
                             StartDate = string.Format("{0:dd-MM-yyyy}", (project.StartDate ?? DateTime.Today).AddDays(-10)),
                             Description = "aut viam inveniam aut faciam",
                             FieldsOfResearch = project.FieldsOfResearch.Except(project.FieldsOfResearch.Take(1)).Union(new[] {forCode}).Cast<ClassificationBase>().ToList(),
                             SocioEconomicObjectives = project.SocioEconomicObjectives.Except(project.SocioEconomicObjectives.Take(1)).Union(new[] {seoCode}).Cast<ClassificationBase>().ToList(),
                             PrincipalInvestigator = project.Parties.Single(o => o.Relationship == ProjectRelationship.PrincipalInvestigator).Party,
                             ArcFunder = new ArcProjectFunderViewModel {GrantNumber = "BYC980", IsFunded = true},
                             NmhrcFunder = new NmhrcProjectFunderViewModel {IsFunded = false},
                             Keywords = "other keywords",
                             Title = "crede quod habes, et habes"
                         };

            _controller.WithCallTo(c => c.Project(vm)).ShouldRedirectTo<ProjectController>(typeof(ProjectController).GetMethod("Index"));

            _projectRepository.Received().Save(Arg.Is<Project>(p =>
                   p.Description == vm.Description &&
                   p.Title == vm.Title &&
                   p.StartDate == DateTime.Parse(vm.StartDate) &&
                   p.EndDate == DateTime.Parse(vm.EndDate) &&
                   p.Keywords == vm.Keywords &&
                   p.Status == ProjectStatus.Completed &&
                   p.SourceProjectType == SourceProjectType.DEPOSIT &&
                   p.Funders.Count() == 0 &&
                   p.SocioEconomicObjectives.All(o => vm.SocioEconomicObjectives.Any(q => q.Code.Id == o.Code.Id)) &&
                   p.FieldsOfResearch.All(o => vm.FieldsOfResearch.Any(q => q.Code.Id == o.Code.Id))));
        }