Skip to content

Commit

Permalink
Added Filter Binding Tests (#2431)
Browse files Browse the repository at this point in the history
  • Loading branch information
PascalSenn committed Oct 14, 2020
1 parent 9ef8f5f commit d7eba9d
Show file tree
Hide file tree
Showing 11 changed files with 614 additions and 108 deletions.
191 changes: 155 additions & 36 deletions src/HotChocolate/Data/test/Data.Filters.Tests/FilterInputTypeTests.cs
Expand Up @@ -9,18 +9,20 @@
namespace HotChocolate.Data.Tests
{
public class FilterInputTypeTest
: FilterTestBase
: FilterTestBase
{
[Fact]
public void FilterInputType_DynamicName()
{
// arrange
// act
ISchema schema = CreateSchema(s => s.AddType(new FilterInputType<Foo>(
d => d
.Name(dep => dep.Name + "Foo")
.DependsOn<StringType>()
.Field(x => x.Bar))));
ISchema schema = CreateSchema(
s => s.AddType(
new FilterInputType<Foo>(
d => d
.Name(dep => dep.Name + "Foo")
.DependsOn<StringType>()
.Field(x => x.Bar))));

// assert
schema.ToString().MatchSnapshot();
Expand All @@ -31,10 +33,12 @@ public void FilterInputType_DynamicName_NonGeneric()
{
// arrange
// act
ISchema schema = CreateSchema(s => s.AddType(new FilterInputType<Foo>(
d => d.Name(dep => dep.Name + "Foo")
.DependsOn(typeof(StringType))
.Field(x => x.Bar))));
ISchema schema = CreateSchema(
s => s.AddType(
new FilterInputType<Foo>(
d => d.Name(dep => dep.Name + "Foo")
.DependsOn(typeof(StringType))
.Field(x => x.Bar))));

// assert
schema.ToString().MatchSnapshot();
Expand All @@ -45,10 +49,12 @@ public void FilterInput_AddDirectives_NameArgs()
{
// arrange
// act
ISchema schema = CreateSchema(s => s.AddDirectiveType<FooDirectiveType>()
.AddType(new FilterInputType<Foo>(
d => d.Directive("foo")
.Field(x => x.Bar))));
ISchema schema = CreateSchema(
s => s.AddDirectiveType<FooDirectiveType>()
.AddType(
new FilterInputType<Foo>(
d => d.Directive("foo")
.Field(x => x.Bar))));

// assert
schema.ToString().MatchSnapshot();
Expand All @@ -59,12 +65,14 @@ public void FilterInput_AddDirectives_NameArgs2()
{
// arrange
// act
ISchema schema = CreateSchema(s => s.AddDirectiveType<FooDirectiveType>()
.AddType(new FilterInputType<Foo>(
d => d.Directive(new NameString("foo"))
.Field(x => x.Bar)
ISchema schema = CreateSchema(
s => s.AddDirectiveType<FooDirectiveType>()
.AddType(
new FilterInputType<Foo>(
d => d.Directive(new NameString("foo"))
.Field(x => x.Bar)
)
)
)
);

// assert
Expand All @@ -76,10 +84,11 @@ public void FilterInput_AddDirectives_DirectiveNode()
{
// arrange
// act
ISchema schema = CreateSchema(s => s.AddDirectiveType<FooDirectiveType>()
.AddType(
new FilterInputType<Foo>(
d => d.Directive(new DirectiveNode("foo")).Field(x => x.Bar))));
ISchema schema = CreateSchema(
s => s.AddDirectiveType<FooDirectiveType>()
.AddType(
new FilterInputType<Foo>(
d => d.Directive(new DirectiveNode("foo")).Field(x => x.Bar))));

// assert
schema.ToString().MatchSnapshot();
Expand All @@ -90,10 +99,13 @@ public void FilterInput_AddDirectives_DirectiveClassInstance()
{
// arrange
// act
ISchema schema = CreateSchema(s => s.AddDirectiveType<FooDirectiveType>()
.AddType(new FilterInputType<Foo>(d => d
.Directive(new FooDirective())
.Field(x => x.Bar))));
ISchema schema = CreateSchema(
s => s.AddDirectiveType<FooDirectiveType>()
.AddType(
new FilterInputType<Foo>(
d => d
.Directive(new FooDirective())
.Field(x => x.Bar))));

// assert
schema.ToString().MatchSnapshot();
Expand All @@ -104,10 +116,13 @@ public void FilterInput_AddDirectives_DirectiveType()
{
// arrange
// act
ISchema schema = CreateSchema(s => s.AddDirectiveType<FooDirectiveType>()
.AddType(new FilterInputType<Foo>(d => d
.Directive<FooDirective>()
.Field(x => x.Bar))));
ISchema schema = CreateSchema(
s => s.AddDirectiveType<FooDirectiveType>()
.AddType(
new FilterInputType<Foo>(
d => d
.Directive<FooDirective>()
.Field(x => x.Bar))));

// assert
schema.ToString().MatchSnapshot();
Expand All @@ -118,8 +133,10 @@ public void FilterInput_AddDescription()
{
// arrange
// act
ISchema schema = CreateSchema(s => s.AddType(new FilterInputType<Foo>(
d => d.Description("Test").Field(x => x.Bar))));
ISchema schema = CreateSchema(
s => s.AddType(
new FilterInputType<Foo>(
d => d.Description("Test").Field(x => x.Bar))));

// assert
schema.ToString().MatchSnapshot();
Expand All @@ -130,8 +147,97 @@ public void FilterInput_AddName()
{
// arrange
// act
ISchema schema = CreateSchema(s => s.AddType(new FilterInputType<Foo>(
d => d.Name("Test").Field(x => x.Bar))));
ISchema schema = CreateSchema(
s => s.AddType(
new FilterInputType<Foo>(
d => d.Name("Test").Field(x => x.Bar))));

// assert
schema.ToString().MatchSnapshot();
}

[Fact]
public void FilterInputType_ImplicitBinding()
{
// arrange
// act
ISchema schema = SchemaBuilder.New()
.ModifyOptions(x => x.DefaultBindingBehavior = BindingBehavior.Explicit)
.AddFiltering()
.AddType(new ObjectType<Foo>(x => x.Field(x => x.Bar)))
.AddQueryType(
c =>
c.Name("Query")
.Field("foo")
.Type<ObjectType<Foo>>()
.Resolver("bar")
.UseFiltering<Foo>(x => x.BindFieldsImplicitly()))
.Create();

// assert
schema.ToString().MatchSnapshot();
}

[Fact]
public void FilterInputType_ImplicitBinding_BindFields()
{
// arrange
// act
ISchema schema = SchemaBuilder.New()
.ModifyOptions(x => x.DefaultBindingBehavior = BindingBehavior.Explicit)
.AddFiltering()
.AddType(new ObjectType<Foo>(x => x.Field(x => x.Bar)))
.AddQueryType(
c =>
c.Name("Query")
.Field("foo")
.Type<ObjectType<Foo>>()
.Resolver("bar")
.UseFiltering<Foo>(x => x.BindFields(BindingBehavior.Implicit)))
.Create();

// assert
schema.ToString().MatchSnapshot();
}

[Fact]
public void FilterInputType_ExplicitBinding()
{
// arrange
// act
ISchema schema = SchemaBuilder.New()
.ModifyOptions(x => x.DefaultBindingBehavior = BindingBehavior.Implicit)
.AddFiltering()
.AddQueryType(
c =>
c.Name("Query")
.Field("foo")
.Type<ObjectType<Bar>>()
.Resolver("bar")
.UseFiltering<Bar>(x => x.BindFieldsExplicitly().Field(y => y.Qux)))
.Create();

// assert
schema.ToString().MatchSnapshot();
}

[Fact]
public void FilterInputType_ExplicitBinding_BindFields()
{
// arrange
// act
ISchema schema = SchemaBuilder.New()
.ModifyOptions(x => x.DefaultBindingBehavior = BindingBehavior.Implicit)
.AddFiltering()
.AddQueryType(
c =>
c.Name("Query")
.Field("foo")
.Type<ObjectType<Bar>>()
.Resolver("bar")
.UseFiltering<Bar>(
x => x.BindFields(BindingBehavior.Explicit).Field(y => y.Qux)))
.Create();

// assert
schema.ToString().MatchSnapshot();
Expand All @@ -149,13 +255,22 @@ public class FooDirectiveType
}
}

public class FooDirective { }
public class FooDirective
{
}

public class Foo
{
public string Bar { get; set; }
}

public class Bar
{
public string Baz { get; set; }

public string Qux { get; set; }
}

public class Query
{
[GraphQLNonNullType]
Expand All @@ -165,10 +280,13 @@ public class Query
public class Book
{
public int Id { get; set; }

[GraphQLNonNullType]
public string Title { get; set; }

public int Pages { get; set; }
public int Chapters { get; set; }

[GraphQLNonNullType]
public Author Author { get; set; }
}
Expand All @@ -177,6 +295,7 @@ public class Author
{
[GraphQLType(typeof(NonNullType<IdType>))]
public int Id { get; set; }

[GraphQLNonNullType]
public string Name { get; set; }
}
Expand Down
@@ -0,0 +1,36 @@
schema {
query: Query
}

type Bar {
baz: String!
qux: String!
}

type Query {
foo(where: BarFilterInput): Bar
}

input BarFilterInput {
and: [BarFilterInput!]
or: [BarFilterInput!]
qux: StringOperationFilterInput
}

input StringOperationFilterInput {
and: [StringOperationFilterInput!]
or: [StringOperationFilterInput!]
eq: String
neq: String
contains: String
ncontains: String
in: [String]
nin: [String]
startsWith: String
nstartsWith: String
endsWith: String
nendsWith: String
}

"The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text."
scalar String
@@ -0,0 +1,36 @@
schema {
query: Query
}

type Bar {
baz: String!
qux: String!
}

type Query {
foo(where: BarFilterInput): Bar
}

input BarFilterInput {
and: [BarFilterInput!]
or: [BarFilterInput!]
qux: StringOperationFilterInput
}

input StringOperationFilterInput {
and: [StringOperationFilterInput!]
or: [StringOperationFilterInput!]
eq: String
neq: String
contains: String
ncontains: String
in: [String]
nin: [String]
startsWith: String
nstartsWith: String
endsWith: String
nendsWith: String
}

"The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text."
scalar String

0 comments on commit d7eba9d

Please sign in to comment.