Пример #1
0
        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 db =>
            {
                await db.ClearCollectionAsync <FilterableResource>();
                await db.GetCollection <FilterableResource>()
                .InsertManyAsync(new[] { resource1, resource2 });
            });

            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);
        }
Пример #2
0
        public async Task Cannot_filter_equality_on_two_attributes()
        {
            // Arrange
            var resource = new FilterableResource
            {
                SomeInt32  = 5,
                OtherInt32 = 5
            };

            var otherResource = new FilterableResource
            {
                SomeInt32  = 5,
                OtherInt32 = 10
            };

            await _testContext.RunOnDatabaseAsync(async db =>
            {
                await db.ClearCollectionAsync <FilterableResource>();
                await db.GetCollection <FilterableResource>()
                .InsertManyAsync(new[] { resource, otherResource });
            });

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

            // 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("Comparing attributes against each other is not supported when using MongoDB.");
            responseDocument.Errors[0].Detail.Should().BeNull();
        }
Пример #3
0
        public async Task Can_filter_equality_on_special_characters()
        {
            // Arrange
            var resource = new FilterableResource
            {
                SomeString = "This, that & more"
            };

            await _testContext.RunOnDatabaseAsync(async db =>
            {
                await db.ClearCollectionAsync <FilterableResource>();
                await db.GetCollection <FilterableResource>()
                .InsertManyAsync(new[] { resource, new FilterableResource() });
            });

            var route = $"/filterableResources?filter=equals(someString,'{HttpUtility.UrlEncode(resource.SomeString)}')";

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

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

            responseDocument.ManyData.Should().HaveCount(1);
            responseDocument.ManyData[0].Attributes["someString"].Should().Be(resource.SomeString);
        }
Пример #4
0
        public async Task Cannot_filter_on_count()
        {
            // Arrange
            var resource = new FilterableResource
            {
                Children = new List <FilterableResource>
                {
                    new FilterableResource(),
                    new FilterableResource()
                }
            };

            await _testContext.RunOnDatabaseAsync(async db =>
            {
                await db.ClearCollectionAsync <FilterableResource>();
                await db.GetCollection <FilterableResource>()
                .InsertManyAsync(new[] { resource, new FilterableResource() });
            });

            var route = "/filterableResources?filter=equals(count(children),'2')";

            // 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("Relationships are not supported when using MongoDB.");
            responseDocument.Errors[0].Detail.Should().BeNull();
        }
Пример #5
0
        public async Task Can_filter_comparison_on_DateTime(string matchingDateTime, string nonMatchingDateTime, ComparisonOperator filterOperator, string filterDateTime)
        {
            // Arrange
            var resource = new FilterableResource
            {
                SomeDateTime = DateTime.SpecifyKind(DateTime.ParseExact(matchingDateTime, "yyyy-MM-dd", null), DateTimeKind.Utc)
            };

            var otherResource = new FilterableResource
            {
                SomeDateTime = DateTime.SpecifyKind(DateTime.ParseExact(nonMatchingDateTime, "yyyy-MM-dd", null), DateTimeKind.Utc)
            };

            await _testContext.RunOnDatabaseAsync(async db =>
            {
                await db.ClearCollectionAsync <FilterableResource>();
                await db.GetCollection <FilterableResource>()
                .InsertManyAsync(new[] { resource, otherResource });
            });

            var route = $"/filterableResources?filter={filterOperator.ToString().Camelize()}(someDateTime,'{DateTime.ParseExact(filterDateTime, "yyyy-MM-dd", 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["someDateTime"].Should().Be(resource.SomeDateTime);
        }
Пример #6
0
        public async Task Can_filter_in_set(string matchingText, string nonMatchingText, string filterText)
        {
            // Arrange
            var resource = new FilterableResource
            {
                SomeString = matchingText
            };

            var otherResource = new FilterableResource
            {
                SomeString = nonMatchingText
            };

            await _testContext.RunOnDatabaseAsync(async db =>
            {
                await db.ClearCollectionAsync <FilterableResource>();
                await db.GetCollection <FilterableResource>()
                .InsertManyAsync(new[] { resource, otherResource });
            });

            var route = $"/filterableResources?filter=any(someString,{filterText})";

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

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

            responseDocument.ManyData.Should().HaveCount(1);
            responseDocument.ManyData[0].Attributes["someString"].Should().Be(resource.SomeString);
        }
        public async Task Can_filter_equality_on_type_Guid()
        {
            // Arrange
            var resource = new FilterableResource {
                SomeGuid = Guid.NewGuid()
            };

            await _testContext.RunOnDatabaseAsync(async db =>
            {
                await db.ClearCollectionAsync <FilterableResource>();
                await db.GetCollection <FilterableResource>()
                .InsertManyAsync(new[] { resource, new FilterableResource() });
            });

            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());
        }
Пример #8
0
        public async Task Can_filter_comparison_on_fractional_number(double matchingValue, double nonMatchingValue, ComparisonOperator filterOperator, double filterValue)
        {
            // Arrange
            var resource = new FilterableResource
            {
                SomeDouble = matchingValue
            };

            var otherResource = new FilterableResource
            {
                SomeDouble = nonMatchingValue
            };

            await _testContext.RunOnDatabaseAsync(async db =>
            {
                await db.ClearCollectionAsync <FilterableResource>();
                await db.GetCollection <FilterableResource>()
                .InsertManyAsync(new[] { resource, otherResource });
            });

            var route = $"/filterableResources?filter={filterOperator.ToString().Camelize()}(someDouble,'{filterValue}')";

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

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

            responseDocument.ManyData.Should().HaveCount(1);
            responseDocument.ManyData[0].Attributes["someDouble"].Should().Be(resource.SomeDouble);
        }
        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 db =>
            {
                await db.ClearCollectionAsync <FilterableResource>();
                await db.GetCollection <FilterableResource>()
                .InsertManyAsync(new[] { resource, new FilterableResource() });
            });

            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 db =>
            {
                await db.ClearCollectionAsync <FilterableResource>();
                await db.GetCollection <FilterableResource>()
                .InsertManyAsync(new[] { resource, new FilterableResource() });
            });

            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 db =>
            {
                await db.ClearCollectionAsync <FilterableResource>();
                await db.GetCollection <FilterableResource>()
                .InsertManyAsync(new[] { resource, new FilterableResource() });
            });

            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);
        }
        public async Task Can_filter_equality_on_type_DateTime()
        {
            // Arrange
            var resource = new FilterableResource {
                SomeDateTime = 27.January(2003).At(11, 22, 33, 44).AsUtc()
            };

            await _testContext.RunOnDatabaseAsync(async db =>
            {
                await db.ClearCollectionAsync <FilterableResource>();
                await db.GetCollection <FilterableResource>()
                .InsertManyAsync(new[] { resource, new FilterableResource() });
            });

            var route = $"/filterableResources?filter=equals(someDateTime,'{resource.SomeDateTime: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["someDateTime"].Should().Be(resource.SomeDateTime);
        }
        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 db =>
            {
                await db.ClearCollectionAsync <FilterableResource>();
                await db.GetCollection <FilterableResource>()
                .InsertManyAsync(new[] { resource, otherResource });
            });

            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);
        }