public async Task FindCollectorValues_ReturnsAllCollectorValues()
        {
            //Act
            var result = await _collectorValueService.FindCollectorValues(resourceParameters);

            //Assert
            Assert.NotNull(result);
            Assert.Equal(6, result.Count());
        }
        public async Task <IActionResult> GetCollectorValues(CollectorValuesResourceParameters resourceParameters,
                                                             [FromHeader(Name = "Accept")] string mediaType)
        {
            if (!PropertyMappingService.ValidMappingExistsFor <CollectorValue>(resourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            if (!TypeHelper.TypeHasProperties <CollectorValueDto>
                    (resourceParameters.Fields))
            {
                return(BadRequest());
            }

            var retrievedCollectorValues = await _collectorValueService.FindCollectorValues(resourceParameters);

            var collectorValues       = _mapper.Map <IEnumerable <CollectorValueDto> >(retrievedCollectorValues);
            var shapedCollectorValues = collectorValues.ShapeData(resourceParameters.Fields);

            if (mediaType == "application/json+hateoas")
            {
                if (!string.IsNullOrEmpty(resourceParameters.Fields) &&
                    !resourceParameters.Fields.ToLowerInvariant().Contains("id"))
                {
                    return(BadRequest("Field parameter 'id' is required"));
                }

                var paginationMetadata = new
                {
                    totalCount  = retrievedCollectorValues.TotalCount,
                    pageSize    = retrievedCollectorValues.PageSize,
                    currentPage = retrievedCollectorValues.CurrentPage,
                    totalPages  = retrievedCollectorValues.TotalPages,
                };

                Response.Headers.Add("X-Pagination",
                                     JsonConvert.SerializeObject(paginationMetadata));

                var links = CreateCollectorValuesLinks(resourceParameters,
                                                       retrievedCollectorValues.HasNext, retrievedCollectorValues.HasPrevious);

                var linkedCollectorValues = shapedCollectorValues.Select(collectorValue =>
                {
                    var collectorValueAsDictionary = collectorValue as IDictionary <string, object>;
                    var collectorValueLinks        = CreateCollectorValueLinks
                                                         ((Guid)collectorValueAsDictionary["Id"], resourceParameters.Fields);

                    collectorValueAsDictionary.Add("links", collectorValueLinks);

                    return(collectorValueAsDictionary);
                });

                var linkedCollectionResource = new LinkedCollectionResource
                {
                    Value = linkedCollectorValues,
                    Links = links
                };

                return(Ok(linkedCollectionResource));
            }
            else
            {
                var previousPageLink = retrievedCollectorValues.HasPrevious ?
                                       CreateCollectorValuesResourceUri(resourceParameters,
                                                                        ResourceUriType.PreviousPage) : null;

                var nextPageLink = retrievedCollectorValues.HasNext ?
                                   CreateCollectorValuesResourceUri(resourceParameters,
                                                                    ResourceUriType.NextPage) : null;

                var paginationMetadata = new
                {
                    totalCount  = retrievedCollectorValues.TotalCount,
                    pageSize    = retrievedCollectorValues.PageSize,
                    currentPage = retrievedCollectorValues.CurrentPage,
                    totalPages  = retrievedCollectorValues.TotalPages,
                    previousPageLink,
                    nextPageLink,
                };

                Response.Headers.Add("X-Pagination",
                                     JsonConvert.SerializeObject(paginationMetadata));

                return(Ok(shapedCollectorValues));
            }
        }