예제 #1
0
        public void AddConsultant_LastMissionNeedToBeFalse()
        {
            // Arrange
            var context       = InitializeContext();
            var consultant    = fixture.Build <Consultant>().With(x => x.Id, 21).With(x => x.Experience, Experience.Medior).Create();
            var mission       = fixture.Build <Mission>().With(x => x.Id, 11).With(x => x.ExperienceRequired, Experience.Junior).With(x => x.MaximumRate, 1000).Create();
            var addConsultant = new AddConsultantRequest
            {
                ConsultantId = 21,
                MissionId    = 11,
                JobName      = "Java Dev",
                Rate         = 400.00
            };
            var consultantMissions = new List <ConsultantMission> {
                new ConsultantMission {
                    IsActive = true
                }, new ConsultantMission {
                    IsActive = false
                }
            };

            consultant.ConsultantMissions = consultantMissions;
            mission.ConsultantMissions    = consultantMissions;
            context.Consultants.Add(consultant);
            context.Missions.Add(mission);
            context.SaveChanges();
            InjectClassFor(context);

            // Act
            var result = ClassUnderTest.AddConsultant(addConsultant);

            // Assert
            result.Consultant.ConsultantMissions.Where(x => x.IsActive).Count().Should().Be(1);
        }
예제 #2
0
        public void AddConsultant_ExperienceNotValidExcpetion()
        {
            // Arrange
            var context       = InitializeContext();
            var consultant    = fixture.Build <Consultant>().With(x => x.Id, 10).With(x => x.Experience, Experience.Medior).Create();
            var mission       = fixture.Build <Mission>().With(x => x.Id, 1).With(x => x.ExperienceRequired, Experience.Senior).With(x => x.MaximumRate, 1000).Create();
            var addConsultant = new AddConsultantRequest
            {
                ConsultantId = 10,
                MissionId    = 1,
                JobName      = "Java Dev",
                Rate         = 400.00
            };

            context.Consultants.Add(consultant);
            context.Missions.Add(mission);
            context.SaveChanges();
            InjectClassFor(context);

            // Act
            Action action = () => ClassUnderTest.AddConsultant(addConsultant);

            // Assert
            action.Should().ThrowExactly <NotValidException>().WithMessage(ErrorVariable.ExperienceMinimumRequired);
        }
예제 #3
0
        public ActionResult AddConsultant([FromRoute] int missionId, [FromBody] AddConsultantRequest consultant)
        {
            consultant.MissionId = missionId;
            var consultantMissionModel = _missionService.AddConsultant(consultant);

            return(Ok(consultantMissionModel));
        }
예제 #4
0
        public void AddConsultant_JobNameNotValidExcpetion()
        {
            // Arrange
            var addConsultant = new AddConsultantRequest();

            // Act
            Action action = () => ClassUnderTest.AddConsultant(addConsultant);

            // Assert
            action.Should().ThrowExactly <NotValidException>().WithMessage(ErrorVariable.JobnameNotExist);
        }
예제 #5
0
        public void AddConsultant_RateNotValidExcpetion()
        {
            // Arrange
            var addConsultant = new AddConsultantRequest
            {
                ConsultantId = 1,
                MissionId    = 1,
                JobName      = "Dev Lead"
            };

            // Act
            Action action = () => ClassUnderTest.AddConsultant(addConsultant);

            // Assert
            action.Should().ThrowExactly <NotValidException>().WithMessage(ErrorVariable.RateIsNotCompleted);
        }
예제 #6
0
        public void AddConsultant_MissionNotValidExcpetion()
        {
            // Arrange
            var context       = InitializeContext();
            var consultant    = fixture.Build <Consultant>().With(x => x.Id, 1).Create();
            var addConsultant = new AddConsultantRequest
            {
                ConsultantId = 1,
                MissionId    = 20,
                JobName      = "Java Dev",
                Rate         = 400.00
            };

            context.Consultants.Add(consultant);
            context.SaveChanges();
            InjectClassFor(context);

            // Act
            Action action = () => ClassUnderTest.AddConsultant(addConsultant);

            // Assert
            action.Should().ThrowExactly <NotValidException>().WithMessage(ErrorVariable.MissioNotExist);
        }
예제 #7
0
        public void AddConsultant_IsValid()
        {
            // Arrange
            var context            = InitializeContext();
            var consultant         = fixture.Build <Consultant>().With(x => x.Id, 40).With(x => x.Experience, Experience.Medior).Create();
            var mission            = fixture.Build <Mission>().With(x => x.Id, 40).With(x => x.ExperienceRequired, Experience.Junior).With(x => x.MaximumRate, 1000).Create();
            var consultantMissions = new List <ConsultantMission> {
                new ConsultantMission {
                    IsActive = true
                }, new ConsultantMission {
                    IsActive = false
                }
            };
            var addConsultant = new AddConsultantRequest
            {
                ConsultantId = 40,
                MissionId    = 40,
                JobName      = "Dev Lead",
                Rate         = 400.00
            };

            consultant.ConsultantMissions = consultantMissions;
            mission.ConsultantMissions    = consultantMissions;
            context.Consultants.Add(consultant);
            context.Missions.Add(mission);
            context.SaveChanges();
            InjectClassFor(context);

            // Act
            var result = ClassUnderTest.AddConsultant(addConsultant);

            // Assert
            result.ConsultantId.Should().Be(40);
            result.MissionId.Should().Be(40);
            result.IsActive.Should().Be(true);
            result.Rate.Should().Be(400.00);
        }
예제 #8
0
        public ConsultantMission AddConsultant(AddConsultantRequest consultant)
        {
            if (consultant.JobName == null)
            {
                throw new NotValidException(ErrorVariable.JobnameNotExist);
            }
            if (consultant.Rate == default)
            {
                throw new NotValidException(ErrorVariable.RateIsNotCompleted);
            }

            var mission = _consultingContext.Missions.FirstOrDefault(e => e.Id == consultant.MissionId);

            if (mission == null)
            {
                throw new NotValidException(ErrorVariable.MissioNotExist);
            }

            var consult = _consultingContext.Consultants.FirstOrDefault(e => e.Id == consultant.ConsultantId);

            if (consult == null)
            {
                throw new NotValidException(ErrorVariable.ConsultantNotExist);
            }

            if (mission.ExperienceRequired > consult.Experience)
            {
                throw new NotValidException(ErrorVariable.ExperienceMinimumRequired);
            }
            var commissions = new Dictionary <Experience, double>
            {
                [Experience.Junior] = 1.15,
                [Experience.Medior] = 1.10,
                [Experience.Senior] = 1.05
            };

            if (mission.MaximumRate < (consultant.Rate * commissions.GetValueOrDefault(consult.Experience)))
            {
                throw new NotValidException(ErrorVariable.RateMaximumRequired);
            }

            var lastMissionConsult = _consultingContext.ConsultantMissions
                                     .Where(e => e.ConsultantId == consultant.ConsultantId)
                                     .SingleOrDefault(e => e.IsActive);

            if (lastMissionConsult != null)
            {
                lastMissionConsult.IsActive = false;
            }

            var newConsultantMission = new ConsultantMission
            {
                ConsultantId = consultant.ConsultantId,
                MissionId    = consultant.MissionId,
                IsActive     = true,
                JobName      = consultant.JobName,
                Rate         = consultant.Rate
            };

            _consultingContext.ConsultantMissions.Add(newConsultantMission);
            _consultingContext.SaveChanges();

            return(newConsultantMission);
        }