public async Task Can_filter_equality_on_type_Guid()
        {
            // Arrange
            var resource = new FilterableResource {
                SomeGuid = Guid.NewGuid()
            };

            await _testContext.RunOnDatabaseAsync(async dbContext =>
            {
                dbContext.RemoveRange(dbContext.FilterableResources);
                dbContext.FilterableResources.AddRange(resource, new FilterableResource());

                await dbContext.SaveChangesAsync();
            });

            var route = $"/filterableResources?filter=equals(someGuid,'{resource.SomeGuid}')";

            // Act
            var(httpResponse, responseDocument) = await _testContext.ExecuteGetAsync <Document>(route);

            // Assert
            httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);

            responseDocument.ManyData.Should().HaveCount(1);
            responseDocument.ManyData[0].Attributes["someGuid"].Should().Be(resource.SomeGuid.ToString());
        }
        public async Task Can_filter_equality_on_type(string propertyName, object value)
        {
            // Arrange
            var resource = new FilterableResource();
            var property = typeof(FilterableResource).GetProperty(propertyName);

            property?.SetValue(resource, value);

            await _testContext.RunOnDatabaseAsync(async dbContext =>
            {
                dbContext.RemoveRange(dbContext.FilterableResources);
                dbContext.FilterableResources.AddRange(resource, new FilterableResource());

                await dbContext.SaveChangesAsync();
            });

            var attributeName = propertyName.Camelize();
            var route         = $"/filterableResources?filter=equals({attributeName},'{value}')";

            // Act
            var(httpResponse, responseDocument) = await _testContext.ExecuteGetAsync <Document>(route);

            // Assert
            httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);

            responseDocument.ManyData.Should().HaveCount(1);
            responseDocument.ManyData[0].Attributes[attributeName].Should().Be(value is Enum ? value.ToString() : value);
        }
        public async Task Cannot_filter_equality_on_incompatible_value()
        {
            // Arrange
            var resource = new FilterableResource {
                SomeInt32 = 1
            };

            await _testContext.RunOnDatabaseAsync(async dbContext =>
            {
                dbContext.RemoveRange(dbContext.FilterableResources);
                dbContext.FilterableResources.AddRange(resource, new FilterableResource());

                await dbContext.SaveChangesAsync();
            });

            var route = "/filterableResources?filter=equals(someInt32,'ABC')";

            // Act
            var(httpResponse, responseDocument) = await _testContext.ExecuteGetAsync <ErrorDocument>(route);

            // Assert
            httpResponse.Should().HaveStatusCode(HttpStatusCode.BadRequest);

            responseDocument.Errors.Should().HaveCount(1);
            responseDocument.Errors[0].StatusCode.Should().Be(HttpStatusCode.BadRequest);
            responseDocument.Errors[0].Title.Should().Be("Query creation failed due to incompatible types.");
            responseDocument.Errors[0].Detail.Should().Be("Failed to convert 'ABC' of type 'String' to type 'Int32'.");
            responseDocument.Errors[0].Source.Parameter.Should().BeNull();
        }
        public async Task Can_filter_equality_on_type_DateTimeOffset()
        {
            // Arrange
            var resource = new FilterableResource
            {
                SomeDateTimeOffset = new DateTimeOffset(27.January(2003).At(11, 22, 33, 44), TimeSpan.FromHours(3))
            };

            await _testContext.RunOnDatabaseAsync(async dbContext =>
            {
                dbContext.RemoveRange(dbContext.FilterableResources);
                dbContext.FilterableResources.AddRange(resource, new FilterableResource());

                await dbContext.SaveChangesAsync();
            });

            var route = $"/filterableResources?filter=equals(someDateTimeOffset,'{WebUtility.UrlEncode(resource.SomeDateTimeOffset.ToString("O"))}')";

            // Act
            var(httpResponse, responseDocument) = await _testContext.ExecuteGetAsync <Document>(route);

            // Assert
            httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);

            responseDocument.ManyData.Should().HaveCount(1);
            responseDocument.ManyData[0].Attributes["someDateTimeOffset"].Should().Be(resource.SomeDateTimeOffset.LocalDateTime);
        }
Exemplo n.º 5
0
        public async Task Can_filter_equality_on_type_Decimal()
        {
            // Arrange
            var resource = new FilterableResource {
                SomeDecimal = 0.5m
            };

            await _testContext.RunOnDatabaseAsync(async dbContext =>
            {
                await dbContext.ClearTableAsync <FilterableResource>();
                dbContext.FilterableResources.AddRange(resource, new FilterableResource());

                await dbContext.SaveChangesAsync();
            });

            var route = $"/filterableResources?filter=equals(someDecimal,'{resource.SomeDecimal}')";

            // Act
            var(httpResponse, responseDocument) = await _testContext.ExecuteGetAsync <Document>(route);

            // Assert
            httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);

            responseDocument.ManyData.Should().HaveCount(1);
            responseDocument.ManyData[0].Attributes["someDecimal"].Should().Be(resource.SomeDecimal);
        }
        public async Task Can_filter_is_null_on_type(string propertyName)
        {
            // Arrange
            var resource = new FilterableResource();
            var property = typeof(FilterableResource).GetProperty(propertyName);

            property?.SetValue(resource, null);

            var otherResource = new FilterableResource
            {
                SomeString                 = "X",
                SomeNullableBoolean        = true,
                SomeNullableInt32          = 1,
                SomeNullableUnsignedInt64  = 1,
                SomeNullableDecimal        = 1,
                SomeNullableDouble         = 1,
                SomeNullableGuid           = Guid.NewGuid(),
                SomeNullableDateTime       = 1.January(2001),
                SomeNullableDateTimeOffset = 1.January(2001),
                SomeNullableTimeSpan       = TimeSpan.FromHours(1),
                SomeNullableEnum           = DayOfWeek.Friday
            };

            await _testContext.RunOnDatabaseAsync(async dbContext =>
            {
                dbContext.RemoveRange(dbContext.FilterableResources);
                dbContext.FilterableResources.AddRange(resource, otherResource);

                await dbContext.SaveChangesAsync();
            });

            var attributeName = propertyName.Camelize();
            var route         = $"/filterableResources?filter=equals({attributeName},null)";

            // Act
            var(httpResponse, responseDocument) = await _testContext.ExecuteGetAsync <Document>(route);

            // Assert
            httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);

            responseDocument.ManyData.Should().HaveCount(1);
            responseDocument.ManyData[0].Attributes[attributeName].Should().Be(null);
        }
        public async Task Can_filter_on_logical_functions(string filterExpression)
        {
            // Arrange
            var resource1 = new FilterableResource
            {
                SomeString = "ABC",
                SomeInt32  = 11,
                SomeEnum   = DayOfWeek.Tuesday
            };

            var resource2 = new FilterableResource
            {
                SomeString = "XYZ",
                SomeInt32  = 99,
                SomeEnum   = DayOfWeek.Saturday
            };

            await _testContext.RunOnDatabaseAsync(async dbContext =>
            {
                await dbContext.ClearTableAsync <FilterableResource>();
                dbContext.FilterableResources.AddRange(resource1, resource2);

                await dbContext.SaveChangesAsync();
            });

            var route = $"/filterableResources?filter={filterExpression}";

            // Act
            var(httpResponse, responseDocument) = await _testContext.ExecuteGetAsync <Document>(route);

            // Assert
            httpResponse.Should().HaveStatusCode(HttpStatusCode.OK);

            responseDocument.ManyData.Should().HaveCount(1);
            responseDocument.ManyData[0].Id.Should().Be(resource1.StringId);
        }