Esempio n. 1
0
        public async Task GivenValidRequest_WhenAgencyIsInQuery_FiltersByAgency()
        {
            // Arrange
            var searchRequest = new EmployeeSalarySearchRequestDto(agency: nameof(EmployeeAgency.Redding));
            var query         = new GetEmployeeSalariesQuery(searchRequest, TestUri, default);
            var handler       = new GetEmployeeSalariesQueryHandler(Context);

            // Act
            var result = await handler.Handle(query, CancellationToken.None);

            // Assert
            result.ShouldNotBeNull();
            result.Results.ShouldNotBeNull();
            result.Results.ShouldNotBeEmpty();
            result.ShouldBeOfType <OpenReddingSearchResultAggregate <EmployeeSalarySearchResultDto> >();
            result.Count.ShouldBe(2);
            result.Results.ShouldBeOfType <List <EmployeeSalarySearchResultDto> >();
            result.Results.ShouldContain(e => e.Name == "John Smith");
            result.Results.FirstOrDefault(e => e.Name == "John Smith")?.JobTitle.ShouldBe("Software Engineer");
            result.Results.FirstOrDefault(e => e.Name == "John Smith")?.Agency.ShouldBe(nameof(EmployeeAgency.Redding));
            result.Results.FirstOrDefault(e => e.Name == "John Smith")?.Status.ShouldBe(EmployeeStatus.FullTime.ToFriendlyString());
            result.Results.ShouldContain(e => e.Name == "Mary Smith");
            result.Results.FirstOrDefault(e => e.Name == "Mary Smith")?.JobTitle.ShouldBe("Software Engineering Manager");
            result.Results.FirstOrDefault(e => e.Name == "Mary Smith")?.Agency.ShouldBe(nameof(EmployeeAgency.Redding));
            result.Results.FirstOrDefault(e => e.Name == "Mary Smith")?.Status.ShouldBe(EmployeeStatus.FullTime.ToFriendlyString());
        }
Esempio n. 2
0
        public async Task GivenValidRequest_WhenSearchQueryDoesNotFindMatch_ReturnsEmptyResultList()
        {
            // Arrange
            var searchRequest = new EmployeeSalarySearchRequestDto(name: "This Employee Doesn't Exist!");
            var query         = new GetEmployeeSalariesQuery(searchRequest, TestUri, default);
            var handler       = new GetEmployeeSalariesQueryHandler(Context);

            // Act
            var result = await handler.Handle(query, CancellationToken.None);

            // Assert
            result.ShouldNotBeNull();
            result.ShouldBeOfType <OpenReddingSearchResultAggregate <EmployeeSalarySearchResultDto> >();
            result.Results.ShouldBeEmpty();
        }
Esempio n. 3
0
        public async Task GivenValidRequest_WhenSearchQueryOrdersByNameDescending_ReturnsOrderedDescendingResultList()
        {
            // Arrange
            var searchRequest = new EmployeeSalarySearchRequestDto(name: "Joe", sortField: nameof(SalarySortField.Name), sortBy: nameof(SalarySortByOption.Descending));
            var query         = new GetEmployeeSalariesQuery(searchRequest, TestUri, default);
            var handler       = new GetEmployeeSalariesQueryHandler(Context);

            // Act
            var result = await handler.Handle(query, CancellationToken.None);

            // Assert
            result.ShouldNotBeNull();
            result.ShouldBeOfType <OpenReddingSearchResultAggregate <EmployeeSalarySearchResultDto> >();
            result.Results.ShouldBeOfType <List <EmployeeSalarySearchResultDto> >();
            result.Results.ShouldNotBeEmpty();
            result.Count.ShouldBe(2);
            result.Results.First()?.Name.ShouldBe("Joe Schmoe");
            result.Results.ShouldContain(e => e.Name == "Joey Mckenzie");
        }
        public static SalariesState ReduceLoadEmployeeSalariesOnSearchClickedAction(SalariesState state, LoadEmployeesOnSearchClickedAction action)
        {
            if (state.SearchRequest is null)
            {
                return(new SalariesState(false, null, true, state.SalaryResults, state.SalaryDetail, new EmployeeSalarySearchRequestDto(name: action.Name, jobTitle: action.JobTitle)));
            }

            var updatedSearchRequest = new EmployeeSalarySearchRequestDto(
                name: action.Name,
                jobTitle: action.JobTitle,
                agency: state.SearchRequest.Agency,
                status: state.SearchRequest.Status,
                sortBy: state.SearchRequest.SortBy,
                year: state.SearchRequest.Year,
                sortField: state.SearchRequest.SortField,
                basePayRange: state.SearchRequest.BasePayRange,
                totalPayRange: state.SearchRequest.TotalPayRange);

            return(new SalariesState(false, null, true, state.SalaryResults, state.SalaryDetail, updatedSearchRequest));
        }
Esempio n. 5
0
        public async Task GivenValidRequest_WhenSearchQueryOrdersByTotalPayDecending_ReturnsOrderedDescendingResultList()
        {
            // Arrange
            var searchRequest = new EmployeeSalarySearchRequestDto(jobTitle: "Software", sortField: nameof(SalarySortField.TotalWithBenefitsSalary), sortBy: nameof(SalarySortByOption.Descending));
            var query         = new GetEmployeeSalariesQuery(searchRequest, TestUri, default);
            var handler       = new GetEmployeeSalariesQueryHandler(Context);

            // Act
            var result = await handler.Handle(query, CancellationToken.None);

            // Assert
            result.ShouldNotBeNull();
            result.ShouldBeOfType <OpenReddingSearchResultAggregate <EmployeeSalarySearchResultDto> >();
            result.Results.ShouldBeOfType <List <EmployeeSalarySearchResultDto> >();
            result.Results.ShouldNotBeEmpty();
            result.Count.ShouldBe(3);
            result.Results.ToList()[2].Name.ShouldBe("John Smith");
            result.Results.ToList()[1].Name.ShouldBe("Joey Mckenzie");
            result.Results.ToList()[0].Name.ShouldBe("Mary Smith");
        }
Esempio n. 6
0
        public async Task GivenValidRequest_WhenStatusIsInQuery_FiltersByStatus()
        {
            // Arrange
            var searchRequest = new EmployeeSalarySearchRequestDto(status: nameof(EmployeeStatus.PartTime));
            var query         = new GetEmployeeSalariesQuery(searchRequest, TestUri, default);
            var handler       = new GetEmployeeSalariesQueryHandler(Context);

            // Act
            var result = await handler.Handle(query, CancellationToken.None);

            // Assert
            result.ShouldNotBeNull();
            result.ShouldBeOfType <OpenReddingSearchResultAggregate <EmployeeSalarySearchResultDto> >();
            result.Count.ShouldBe(2);
            result.Results.ShouldBeOfType <List <EmployeeSalarySearchResultDto> >();
            result.Results.ShouldContain(e => e.Name == "Joe Schmoe");
            result.Results.FirstOrDefault()?.JobTitle.ShouldBe("Accountant");
            result.Results.FirstOrDefault()?.Agency.ShouldBe(EmployeeAgency.ShastaCounty.ToFriendlyString());
            result.Results.FirstOrDefault()?.Status.ShouldBe(EmployeeStatus.PartTime.ToFriendlyString());
        }
        public static SalariesState SetEmployeeStatusActionReducer(SalariesState state, SetEmployeeStatusAction action)
        {
            if (state.SearchRequest is null)
            {
                return(InitializeSearchRequest(state, SalarySearchContext.Status, action.Status.ToString()));
            }

            var updatedSearchRequest = new EmployeeSalarySearchRequestDto(
                name: state.SearchRequest.Name,
                jobTitle: state.SearchRequest.JobTitle,
                agency: state.SearchRequest.Agency,
                status: action.Status.ToString(),
                sortBy: state.SearchRequest.SortBy,
                year: state.SearchRequest.Year,
                sortField: state.SearchRequest.SortField,
                basePayRange: state.SearchRequest.BasePayRange,
                totalPayRange: state.SearchRequest.TotalPayRange);

            return(new SalariesState(false, null, true, state.SalaryResults, state.SalaryDetail, updatedSearchRequest));
        }
        public async Task <OpenReddingPagedViewModel <EmployeeSalarySearchResultDto> > GetEmployeeSalaries(
            [FromQuery] string?name,
            [FromQuery] string?jobTitle,
            [FromQuery] string?agency,
            [FromQuery] string?status,
            [FromQuery] string?sortBy,
            [FromQuery] int?year,
            [FromQuery] int?basePayRange,
            [FromQuery] int?totalPayRange,
            [FromQuery] int?page,
            [FromQuery] string?sortField)
        {
            _logger.LogInformation($"Querying salaries:\n" +
                                   $"name [{name}]\n" +
                                   $"jobTitle [{jobTitle}]\n" +
                                   $"agency [{agency}]\n" +
                                   $"status [{status}]\n" +
                                   $"sortBy [{sortBy}]\n" +
                                   $"year [{year}]\n" +
                                   $"basePayRange [{basePayRange}]\n" +
                                   $"totalPayRange [{totalPayRange}]\n" +
                                   $"page [{page}]\n" +
                                   $"sortField [{sortField}]");

            _logger.LogInformation("Sending employee salary search request...");
            var searchRequest = new EmployeeSalarySearchRequestDto(name, jobTitle, agency, status, sortBy, year, sortField, basePayRange, totalPayRange);

            var response = await Mediator.Send(new GetEmployeeSalariesQuery(searchRequest, new Uri(_gatewayBaseUrl), page));

            _logger.LogInformation($"Request was successful, {response.Results.Count()} found with {response.Count} results");

            return(new OpenReddingPagedViewModel <EmployeeSalarySearchResultDto>
            {
                Results = response.Results,
                Count = response.Count,
                Pages = response.Pages,
                CurrentPage = response.CurrentPage,
                Links = _linkBuilder.BuildPaginationLinks(HttpContext.Request.Query, response.Pages, page)
            });
        }
 public DownloadSalariesCommand(EmployeeSalarySearchRequestDto searchRequest) =>
 public GetEmployeeSalariesQuery(EmployeeSalarySearchRequestDto searchRequest, Uri gatewayBaseUrl, int?page) =>
 (SearchRequest, GatewayBaseUrl, Page) = (searchRequest, gatewayBaseUrl, page ?? 1);
Esempio n. 11
0
        public static IQueryable <Employee> FromSearchRequest(this IQueryable <Employee> queriedSalaries, EmployeeSalarySearchRequestDto searchRequest)
        {
            if (queriedSalaries is null)
            {
                throw new ArgumentNullException(nameof(queriedSalaries), "Queryable cannot be null, please check LINQ statement");
            }

            // Filter by job title, if available
            if (!string.IsNullOrWhiteSpace(searchRequest.JobTitle))
            {
                // NOTE: As of EF Core 3.0, StringComparison no longer works due to server-side evaluation of queries
                Expression <Func <Employee, bool> > canFilterByEmployeeJobTitle = e =>
                                                                                  !string.IsNullOrWhiteSpace(e.JobTitle) && e.JobTitle.Contains(searchRequest.JobTitle);

                queriedSalaries = queriedSalaries.Where(canFilterByEmployeeJobTitle);
            }

            // Filter by name, if available
            if (!string.IsNullOrWhiteSpace(searchRequest.Name))
            {
                // NOTE: As of EF Core 3.0, StringComparison no longer works due to server-side evaluation of queries
                Expression <Func <Employee, bool> > canFilterByEmployeeName = e =>
                                                                              !string.IsNullOrWhiteSpace(e.FirstName) && !string.IsNullOrWhiteSpace(e.LastName) &&
                                                                              (e.FirstName.Contains(searchRequest.Name) || e.LastName.Contains(searchRequest.Name));

                queriedSalaries = queriedSalaries.Where(canFilterByEmployeeName);
            }

            // Filter by year, if available
            if (searchRequest.Year.HasValue)
            {
                var parsedEmploymentYear = (EmploymentYear)searchRequest.Year.Value;

                queriedSalaries = parsedEmploymentYear switch
                {
                    EmploymentYear._2011 => queriedSalaries.Where(e => e.Year == 2011),
                    EmploymentYear._2012 => queriedSalaries.Where(e => e.Year == 2012),
                    EmploymentYear._2013 => queriedSalaries.Where(e => e.Year == 2013),
                    EmploymentYear._2014 => queriedSalaries.Where(e => e.Year == 2014),
                    EmploymentYear._2015 => queriedSalaries.Where(e => e.Year == 2015),
                    EmploymentYear._2016 => queriedSalaries.Where(e => e.Year == 2016),
                    EmploymentYear._2017 => queriedSalaries.Where(e => e.Year == 2017),
                    EmploymentYear._2018 => queriedSalaries.Where(e => e.Year == 2018),
                    EmploymentYear._2019 => queriedSalaries.Where(e => e.Year == 2019),
                    _ => queriedSalaries
                };
            }

            // Filter by status, if available
            if (!string.IsNullOrWhiteSpace(searchRequest.Status) && Enum.TryParse(searchRequest.Status, true, out EmployeeStatus employeeStatus))
            {
                queriedSalaries = employeeStatus switch
                {
                    EmployeeStatus.FullTime => queriedSalaries.Where(e => e.EmployeeStatus == employeeStatus),
                    EmployeeStatus.PartTime => queriedSalaries.Where(e => e.EmployeeStatus == employeeStatus),
                    _ => queriedSalaries
                };
            }

            // Filter by agency, if available
            if (!string.IsNullOrWhiteSpace(searchRequest.Agency) && Enum.TryParse(searchRequest.Agency, true, out EmployeeAgency employeeAgency))
            {
                queriedSalaries = employeeAgency switch
                {
                    EmployeeAgency.Redding => queriedSalaries.Where(e => e.EmployeeAgency == employeeAgency),
                    EmployeeAgency.ShastaCounty => queriedSalaries.Where(e => e.EmployeeAgency == employeeAgency),
                    _ => queriedSalaries
                };
            }

            // Filter by base pay range, if available
            if (searchRequest.BasePayRange.HasValue && Enum.IsDefined(typeof(SalarySearchRange), searchRequest.BasePayRange.Value))
            {
                var parsedRange = (SalarySearchRange)searchRequest.BasePayRange.Value;

                queriedSalaries = parsedRange switch
                {
                    SalarySearchRange._0To49 => queriedSalaries.Where(e => e.BasePay >= 0 && e.BasePay < 50000m),
                    SalarySearchRange._50To100 => queriedSalaries.Where(e => e.BasePay >= 50000m && e.BasePay < 100000m),
                    SalarySearchRange._100To149 => queriedSalaries.Where(e => e.BasePay >= 100000m && e.BasePay < 150000m),
                    SalarySearchRange._150To199 => queriedSalaries.Where(e => e.BasePay >= 150000m && e.BasePay < 200000m),
                    SalarySearchRange._200To249 => queriedSalaries.Where(e => e.BasePay >= 200000m && e.BasePay < 250000m),
                    SalarySearchRange._250To299 => queriedSalaries.Where(e => e.BasePay >= 250000m && e.BasePay < 300000m),
                    SalarySearchRange._300AndGreater => queriedSalaries.Where(e => e.BasePay >= 300000),
                    _ => queriedSalaries
                };
            }

            // Filter by total pay with benefits range, if available
            if (searchRequest.TotalPayRange.HasValue && Enum.IsDefined(typeof(SalarySearchRange), searchRequest.TotalPayRange.Value))
            {
                var parsedRange = (SalarySearchRange)searchRequest.TotalPayRange.Value;

                queriedSalaries = parsedRange switch
                {
                    SalarySearchRange._0To49 => queriedSalaries.Where(e => e.TotalPayWithBenefits >= 0 && e.TotalPayWithBenefits < 50000m),
                    SalarySearchRange._50To100 => queriedSalaries.Where(e => e.TotalPayWithBenefits >= 50000m && e.TotalPayWithBenefits < 100000m),
                    SalarySearchRange._100To149 => queriedSalaries.Where(e => e.TotalPayWithBenefits >= 100000m && e.TotalPayWithBenefits < 150000m),
                    SalarySearchRange._150To199 => queriedSalaries.Where(e => e.TotalPayWithBenefits >= 150000m && e.TotalPayWithBenefits < 200000m),
                    SalarySearchRange._200To249 => queriedSalaries.Where(e => e.TotalPayWithBenefits >= 200000m && e.TotalPayWithBenefits < 250000m),
                    SalarySearchRange._250To299 => queriedSalaries.Where(e => e.TotalPayWithBenefits >= 250000m && e.TotalPayWithBenefits < 300000m),
                    SalarySearchRange._300AndGreater => queriedSalaries.Where(e => e.TotalPayWithBenefits >= 300000),
                    _ => queriedSalaries
                };
            }

            // Sort by the request field, if available
            if (!string.IsNullOrWhiteSpace(searchRequest.SortField) && Enum.TryParse(searchRequest.SortField, true, out SalarySortField sortOption))
            {
                var sortBy = SalarySortByOption.Default;

                // Check for the sort order
                if (Enum.TryParse(searchRequest.SortBy, true, out SalarySortByOption option))
                {
                    sortBy = option;
                }

                queriedSalaries = sortBy switch
                {
                    SalarySortByOption.Ascending => sortOption switch
                    {
                        SalarySortField.BaseSalary => queriedSalaries.OrderBy(e => e.BasePay),
                        SalarySortField.JobTitle => queriedSalaries.OrderBy(e => e.JobTitle),
                        SalarySortField.Name => queriedSalaries.OrderBy(e => e.LastName),
                        SalarySortField.Year => queriedSalaries.OrderBy(e => e.Year),
                        SalarySortField.TotalWithBenefitsSalary => queriedSalaries.OrderBy(e => e.TotalPayWithBenefits),
                        _ => queriedSalaries
                    },