Skip to content

Commit ef5b3a7

Browse files
author
Viktor Tochonov
committed
Implemented new tests for scalar wrappers
1 parent 7fd53c2 commit ef5b3a7

4 files changed

Lines changed: 161 additions & 3 deletions

File tree

Packages.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
<PackageReference Update="GraphQL.Server.Ui.Voyager" Version="8.*" />
7676
<PackageReference Update="HotChocolate.AspNetCore" Version="15.*" />
7777
<PackageReference Update="Iced" Version="1.17.*" />
78+
<PackageReference Update="Microsoft.Azure.Cosmos" Version="3.*" />
7879
<PackageReference Update="Microsoft.CodeCoverage" Version="17.3.*" />
7980
<PackageReference Update="Microsoft.Data.Sqlite" Version="$(MicrosoftExtensionsVersion)" />
8081
<PackageReference Update="Microsoft.Diagnostics.NETCore.Client" Version="0.2.*" />

src/FSharp.Data.GraphQL.Server.Middleware/ObjectListFilter.fs

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,21 @@ module ObjectListFilter =
141141
let private StringStartsWithMethod = typeof<string>.GetMethod ("StartsWith", [| typeof<string> |])
142142
let private StringEndsWithMethod = typeof<string>.GetMethod ("EndsWith", [| typeof<string> |])
143143
let private StringContainsMethod = typeof<string>.GetMethod ("Contains", [| typeof<string> |])
144+
let private MemberStartsWithMethod (memberType : Type) =
145+
let method = memberType.GetMethod ("StartsWith", [| memberType |])
146+
if method = null then
147+
raise (MissingMemberException "Method 'StartsWith' not found on member type")
148+
else method
149+
let private MemberEndsWithMethod (memberType : Type) =
150+
let method = memberType.GetMethod ("EndsWith", [| memberType |])
151+
if method = null then
152+
raise (MissingMemberException "Method 'EndsWith' not found on member type")
153+
else method
154+
let private MemberContainsMethod (memberType : Type) =
155+
let method = memberType.GetMethod ("Contains", [| memberType |])
156+
if method = null then
157+
raise (MissingMemberException "Method 'Contains' not found on member type")
158+
else method
144159
let private getEnumerableContainsMethod (memberType : Type) =
145160
match
146161
typeof<Enumerable>
@@ -183,8 +198,18 @@ module ObjectListFilter =
183198
| LessThan f -> Expression.LessThan (Expression.PropertyOrField (param, f.FieldName), Expression.Constant (f.Value))
184199
| GreaterThanOrEqual f -> Expression.GreaterThanOrEqual (Expression.PropertyOrField (param, f.FieldName), Expression.Constant (f.Value))
185200
| LessThanOrEqual f -> Expression.LessThanOrEqual (Expression.PropertyOrField (param, f.FieldName), Expression.Constant (f.Value))
186-
| StartsWith f -> Expression.Call (Expression.PropertyOrField (param, f.FieldName), StringStartsWithMethod, Expression.Constant (f.Value))
187-
| EndsWith f -> Expression.Call (Expression.PropertyOrField (param, f.FieldName), StringEndsWithMethod, Expression.Constant (f.Value))
201+
| StartsWith f ->
202+
let ``member`` = Expression.PropertyOrField (param, f.FieldName)
203+
if ``member``.Type = typeof<string> then
204+
Expression.Call (``member``, StringStartsWithMethod, Expression.Constant (f.Value))
205+
else
206+
Expression.Call (``member``, MemberStartsWithMethod ``member``.Type, Expression.Constant (f.Value))
207+
| EndsWith f ->
208+
let ``member`` = Expression.PropertyOrField (param, f.FieldName)
209+
if ``member``.Type = typeof<string> then
210+
Expression.Call (``member``, StringEndsWithMethod, Expression.Constant (f.Value))
211+
else
212+
Expression.Call (``member``, MemberEndsWithMethod ``member``.Type, Expression.Constant (f.Value))
188213
| Contains f ->
189214
let ``member`` = Expression.PropertyOrField (param, f.FieldName)
190215
let isEnumerable (memberType : Type) =
@@ -214,7 +239,11 @@ module ObjectListFilter =
214239
Expression.PropertyOrField (param, f.FieldName),
215240
Expression.Constant (f.Value)
216241
)
217-
| _ -> Expression.Call (``member``, StringContainsMethod, Expression.Constant (f.Value))
242+
| _ ->
243+
if ``member``.Type = typeof<string> then
244+
Expression.Call (``member``, StringContainsMethod, Expression.Constant (f.Value))
245+
else
246+
Expression.Call (``member``, MemberContainsMethod ``member``.Type, Expression.Constant (f.Value))
218247
| In f ->
219248
let ``member`` = Expression.PropertyOrField (param, f.FieldName)
220249
f.Value

tests/FSharp.Data.GraphQL.Tests/FSharp.Data.GraphQL.Tests.fsproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
</PropertyGroup>
1616

1717
<ItemGroup>
18+
<PackageReference Include="Microsoft.Azure.Cosmos" />
1819
<PackageReference Include="Microsoft.NET.Test.Sdk" />
1920
<PackageReference Include="BenchmarkDotNet" />
2021
<PackageReference Include="Validus" />
@@ -65,6 +66,7 @@
6566
<Compile Include="Variables and Inputs\InputListTests.fs" />
6667
<Compile Include="SelectLinqTests.fs" />
6768
<Compile Include="ObjectListFilterLinqTests.fs" />
69+
<Compile Include="ObjectListFilterLinqGenerateTests.fs" />
6870
<Compile Include="DeferredTests.fs" />
6971
<Compile Include="SubscriptionTests.fs" />
7072
<Compile Include="MiddlewareTests.fs" />
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
module FSharp.Data.GraphQL.Tests.ObjectListFilterLinqGenerateTests
2+
3+
open Xunit
4+
open System
5+
open System.Numerics
6+
open Microsoft.Azure.Cosmos.Linq
7+
open Microsoft.Azure.Cosmos
8+
open FSharp.Data.GraphQL.Shared
9+
open FSharp.Data.GraphQL.Server.Middleware
10+
11+
[<Struct>]
12+
type ValidStringStruct =
13+
internal
14+
| ValidStringStruct of string
15+
static member op_Equality (ValidStringStruct left, ValidStringStruct right) = left = right
16+
static member op_Inequality (ValidStringStruct left, ValidStringStruct right) = left <> right
17+
18+
static member op_Equality (ValidStringStruct left, right) = left = right
19+
static member op_Inequality (ValidStringStruct left, right) = left <> right
20+
static member op_GreaterThan (ValidStringStruct left, right) = left > right
21+
static member op_GreaterThanOrEqual (ValidStringStruct left, right) = left >= right
22+
static member op_LessThan (ValidStringStruct left, right) = left < right
23+
static member op_LessThanOrEqual (ValidStringStruct left, right) = left <= right
24+
interface IEqualityOperators<ValidStringStruct, string, bool> with
25+
static member op_Equality (ValidStringStruct left, right) = left = right
26+
static member op_Inequality (ValidStringStruct left, right) = left <> right
27+
interface IComparisonOperators<ValidStringStruct, string, bool> with
28+
static member op_GreaterThan (ValidStringStruct left, right) = left > right
29+
static member op_GreaterThanOrEqual (ValidStringStruct left, right) = left >= right
30+
static member op_LessThan (ValidStringStruct left, right) = left < right
31+
static member op_LessThanOrEqual (ValidStringStruct left, right) = left <= right
32+
33+
type ValidStringObject =
34+
internal
35+
| ValidStringObject of string
36+
static member op_Equality (ValidStringObject left, ValidStringObject right) = left = right
37+
static member op_Inequality (ValidStringObject left, ValidStringObject right) = left <> right
38+
39+
static member op_Equality (ValidStringObject left, right) = left = right
40+
static member op_Inequality (ValidStringObject left, right) = left <> right
41+
static member op_GreaterThan (ValidStringObject left, right) = left > right
42+
static member op_GreaterThanOrEqual (ValidStringObject left, right) = left >= right
43+
static member op_LessThan (ValidStringObject left, right) = left < right
44+
static member op_LessThanOrEqual (ValidStringObject left, right) = left <= right
45+
//interface IEqualityOperators<ValidStringObject, ValidStringObject, bool> with
46+
// static member op_Equality (ValidStringObject left, ValidStringObject right) = left = right
47+
// static member op_Inequality (ValidStringObject left, ValidStringObject right) = left <> right
48+
//interface IComparisonOperators<ValidStringObject, ValidStringObject, bool> with
49+
// static member op_GreaterThan (ValidStringObject left, ValidStringObject right) = left > right
50+
// static member op_GreaterThanOrEqual (ValidStringObject left, ValidStringObject right) = left >= right
51+
// static member op_LessThan (ValidStringObject left, ValidStringObject right) = left < right
52+
// static member op_LessThanOrEqual (ValidStringObject left, ValidStringObject right) = left <= right
53+
interface IEqualityOperators<ValidStringObject, string, bool> with
54+
static member op_Equality (ValidStringObject left, right) = left = right
55+
static member op_Inequality (ValidStringObject left, right) = left <> right
56+
interface IComparisonOperators<ValidStringObject, string, bool> with
57+
static member op_GreaterThan (ValidStringObject left, right) = left > right
58+
static member op_GreaterThanOrEqual (ValidStringObject left, right) = left >= right
59+
static member op_LessThan (ValidStringObject left, right) = left < right
60+
static member op_LessThanOrEqual (ValidStringObject left, right) = left <= right
61+
62+
[<Struct>]
63+
type ValidIntStruct =
64+
internal
65+
| ValidIntStruct of Int64
66+
static member op_Equality (ValidIntStruct left, ValidIntStruct right) = left = right
67+
static member op_Inequality (ValidIntStruct left, ValidIntStruct right) = left <> right
68+
static member op_GreaterThan (ValidIntStruct left, right : Int64) = left > right
69+
70+
type ValidIntObject =
71+
internal
72+
| ValidIntObject of Int64
73+
static member op_Equality (ValidIntObject left, ValidIntObject right) = left = right
74+
static member op_Inequality (ValidIntObject left, ValidIntObject right) = left <> right
75+
static member op_GreaterThan (ValidIntObject left, right : Int64) = left > right
76+
77+
type Butafor = {
78+
ValidStringStruct : ValidStringStruct
79+
ValidStringObject : ValidStringObject
80+
string : string
81+
ValidIntStruct : ValidIntStruct
82+
ValidIntObject : ValidIntObject
83+
int : Int64
84+
}
85+
86+
let jsonOptions = Json.getSerializerOptions Seq.empty
87+
let cosmosClient =
88+
let options = CosmosClientOptions(UseSystemTextJsonSerializerWithOptions = jsonOptions)
89+
new CosmosClient ("https://localhost:8081/", "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==", options)
90+
let container = cosmosClient.GetContainer("database", "container")
91+
let filterOptions =
92+
ObjectListFilterLinqOptions<Butafor, obj>.None
93+
94+
[<Fact>]
95+
let ``ObjectListFilter works with Equals operator for ValidStringStruct`` () =
96+
let queryable = container.GetItemLinqQueryable<Butafor> ()
97+
let filter = Equals { FieldName = "validStringStruct"; Value = "Jonathan"}
98+
let filterQuery = queryable.Apply (filter, filterOptions)
99+
let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery
100+
()
101+
102+
[<Fact>]
103+
let ``ObjectListFilter works with Equals operator for ValidStringObject`` () =
104+
let filter = Equals { FieldName = "validStringObject"; Value = ValidStringObject "Jonathan" }
105+
let queryable = container.GetItemLinqQueryable<Butafor> ()
106+
let filterQuery = queryable.Apply (filter)
107+
let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery
108+
()
109+
110+
[<Fact>]
111+
let ``ObjectListFilter works with GreaterThan operator for ValidIntStruct`` () =
112+
let queryable = container.GetItemLinqQueryable<Butafor> ()
113+
let filter = GreaterThan { FieldName = "validIntStruct"; Value = 6L }
114+
let filterQuery = queryable.Apply (filter, filterOptions)
115+
let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery
116+
()
117+
118+
[<Fact>]
119+
let ``ObjectListFilter works with GreaterThan operator for ValidIntObject`` () =
120+
let filter = GreaterThan { FieldName = "validIntObject"; Value = 6L }
121+
let queryable = container.GetItemLinqQueryable<Butafor> ()
122+
let filterQuery = queryable.Apply (filter)
123+
let queryDefinition = CosmosLinqExtensions.ToQueryDefinition filterQuery
124+
()
125+
126+

0 commit comments

Comments
 (0)