@@ -2,16 +2,17 @@ module FSharp.Data.GraphQL.Tests.MiddlewareTests
2
2
3
3
open System
4
4
open System.Collections .Generic
5
+ open System.Collections .Immutable
6
+ open System.Text .Json
5
7
open Xunit
8
+ open FSharp
6
9
open FSharp.Data .GraphQL
7
10
open FSharp.Data .GraphQL .Types
8
11
open FSharp.Data .GraphQL .Server .Middleware
9
12
open FSharp.Data .GraphQL .Shared
10
13
open FSharp.Data .GraphQL .Parser
11
14
open FSharp.Data .GraphQL .Execution
12
15
open FSharp.Data .GraphQL .Ast
13
- open System.Collections .Immutable
14
- open System.Text .Json
15
16
16
17
#nowarn " 40"
17
18
@@ -25,7 +26,7 @@ and A = { id : int; value : string; subjects : int list }
25
26
26
27
and B = { id : int ; value : string ; subjects : int list }
27
28
28
- let executor =
29
+ let getExecutor ( expectedFilter : ObjectListFilter voption ) =
29
30
let a1 : A = { id = 1 ; value = " A1" ; subjects = [ 2 ; 6 ] }
30
31
let a2 : A = { id = 2 ; value = " A2" ; subjects = [ 1 ; 3 ; 5 ] }
31
32
let a3 : A = { id = 3 ; value = " A3" ; subjects = [ 1 ; 2 ; 4 ] }
@@ -70,7 +71,11 @@ let executor =
70
71
.Field(
71
72
" subjects" ,
72
73
Nullable ( ListOf ( Nullable SubjectType)),
73
- resolve = fun _ ( a : A ) -> a.subjects |> List.map getSubject |> List.toSeq |> Some
74
+ resolve =
75
+ fun ctx ( a : A ) ->
76
+ expectedFilter
77
+ |> ValueOption.iter ( fun _ -> equals expectedFilter ctx.Filter)
78
+ a.subjects |> List.map getSubject |> List.toSeq |> Some
74
79
)
75
80
.WithQueryWeight ( 1.0 )
76
81
]
@@ -87,7 +92,11 @@ let executor =
87
92
.Field(
88
93
" subjects" ,
89
94
Nullable ( ListOf ( Nullable SubjectType)),
90
- resolve = fun _ ( b : B ) -> b.subjects |> List.map getSubject |> List.toSeq |> Some
95
+ resolve =
96
+ fun ctx ( b : B ) ->
97
+ expectedFilter
98
+ |> ValueOption.iter ( fun _ -> equals expectedFilter ctx.Filter)
99
+ b.subjects |> List.map getSubject |> List.toSeq |> Some
91
100
)
92
101
.WithQueryWeight ( 1.0 )
93
102
]
@@ -108,10 +117,17 @@ let executor =
108
117
]
109
118
Executor ( schema, middleware)
110
119
120
+ let executor = getExecutor ( ValueNone)
121
+
111
122
let execute ( query : Document ) = executor.AsyncExecute ( query) |> sync
112
123
113
124
let executeWithVariables ( query : Document , variables : ImmutableDictionary < string , JsonElement >) =
114
- executor.AsyncExecute ( ast = query, variables = variables) |> sync
125
+ executor.AsyncExecute ( ast = query, variables = variables)
126
+ |> sync
127
+
128
+ let executeWithCustomFilter ( query : Document , variables : ImmutableDictionary < string , JsonElement >, customFilter : ObjectListFilter ) =
129
+ let ex = getExecutor ( ValueSome customFilter)
130
+ ex.AsyncExecute ( ast = query, variables = variables) |> sync
115
131
116
132
let expectedErrors : GQLProblemDetails list = [
117
133
GQLProblemDetails.Create ( " Query complexity exceeds maximum threshold. Please reduce query complexity and try again." )
@@ -494,8 +510,8 @@ let ``Object list filter: must return filter information in Metadata`` () =
494
510
]
495
511
]
496
512
]
497
- let expectedFilter : KeyValuePair < obj list , ObjectListFilter > =
498
- KeyValuePair ([ " A" ; " s" ], And ( Equals { FieldName = " id" ; Value = 2 L }, StartsWith { FieldName = " value" ; Value = " A" }))
513
+ let expectedFilter : KeyValuePair < obj list , _ > =
514
+ kvp ([ " A" ; " s" ]) ( And ( Equals { FieldName = " id" ; Value = 2 L }, StartsWith { FieldName = " value" ; Value = " A" }))
499
515
let result = execute query
500
516
ensureDirect result <| fun data errors ->
501
517
empty errors
@@ -543,8 +559,8 @@ let ``Object list filter: Must return AND filter information in Metadata`` () =
543
559
]
544
560
]
545
561
]
546
- let expectedFilter : KeyValuePair < obj list , ObjectListFilter > =
547
- KeyValuePair ([ " A" ; " subjects" ], And ( StartsWith { FieldName = " value" ; Value = " 3" }, Equals { FieldName = " id" ; Value = 6 L }))
562
+ let expectedFilter : KeyValuePair < obj list , _ > =
563
+ kvp ([ " A" ; " subjects" ]) ( And ( StartsWith { FieldName = " value" ; Value = " 3" }, Equals { FieldName = " id" ; Value = 6 L }))
548
564
let result = execute query
549
565
ensureDirect result <| fun data errors ->
550
566
empty errors
@@ -590,8 +606,8 @@ let ``Object list filter: Must return OR filter information in Metadata`` () =
590
606
]
591
607
]
592
608
]
593
- let expectedFilter : KeyValuePair < obj list , ObjectListFilter > =
594
- KeyValuePair ([ " A" ; " subjects" ], Or ( StartsWith { FieldName = " value" ; Value = " 3" }, Equals { FieldName = " id" ; Value = 6 L }))
609
+ let expectedFilter : KeyValuePair < obj list , _ > =
610
+ kvp ([ " A" ; " subjects" ]) ( Or ( StartsWith { FieldName = " value" ; Value = " 3" }, Equals { FieldName = " id" ; Value = 6 L }))
595
611
let result = execute query
596
612
ensureDirect result <| fun data errors ->
597
613
empty errors
@@ -637,8 +653,8 @@ let ``Object list filter: Must return NOT filter information in Metadata`` () =
637
653
]
638
654
]
639
655
]
640
- let expectedFilter : KeyValuePair < obj list , ObjectListFilter > =
641
- KeyValuePair ([ " A" ; " subjects" ], Not ( StartsWith { FieldName = " value" ; Value = " 3" }))
656
+ let expectedFilter : KeyValuePair < obj list , _ > =
657
+ kvp ([ " A" ; " subjects" ]) ( Not ( StartsWith { FieldName = " value" ; Value = " 3" }))
642
658
let result = execute query
643
659
ensureDirect result <| fun data errors ->
644
660
empty errors
@@ -648,11 +664,7 @@ let ``Object list filter: Must return NOT filter information in Metadata`` () =
648
664
|> seqEquals [ expectedFilter ]
649
665
650
666
[<Fact>]
651
- let ``Object list filter : Must return filter information in Metadata when supplied as variable`` () =
652
- let jsonString = """ { "not": { "value_starts_with": "3" } }"""
653
- let jsonElement = JsonDocument.Parse( jsonString) .RootElement
654
-
655
- let dict = ImmutableDictionary< string, JsonElement>. Empty.Add ( " filter" , jsonElement)
667
+ let ``Object list filter : Must return filter information in Metadata when supplied as variable and parse all filter operators`` () =
656
668
let query =
657
669
parse
658
670
""" query testQuery($filter: ObjectListFilter!) {
@@ -688,12 +700,186 @@ let ``Object list filter: Must return filter information in Metadata when suppli
688
700
]
689
701
]
690
702
]
691
- let expectedFilter : KeyValuePair < obj list , ObjectListFilter > =
692
- KeyValuePair ([ " A" ; " subjects" ], Not ( StartsWith { FieldName = " value" ; Value = " 3" }))
693
- let result = executeWithVariables ( query, dict)
694
- ensureDirect result <| fun data errors ->
695
- empty errors
696
- data |> equals ( upcast expected)
697
- result.Metadata.TryFind< ObjectListFilters> ( " filters" )
698
- |> wantValueSome
699
- |> seqEquals [ expectedFilter ]
703
+ do
704
+ let notStartsFilter = """ { "not": { "value_starts_with": "3" } }""" |> JsonDocument.Parse |> _. RootElement
705
+ let variables = ImmutableDictionary< string, JsonElement>. Empty.Add ( " filter" , notStartsFilter)
706
+ let filter = Not ( StartsWith { FieldName = " value" ; Value = " 3" })
707
+ let expectedFilter : KeyValuePair < obj list , _ > = kvp ([ " A" ; " subjects" ]) ( filter)
708
+ let result = executeWithCustomFilter ( query, variables, filter)
709
+ ensureDirect result <| fun data errors ->
710
+ empty errors
711
+ data |> equals ( upcast expected)
712
+ result.Metadata.TryFind< ObjectListFilters> ( " filters" )
713
+ |> wantValueSome
714
+ |> seqEquals [ expectedFilter ]
715
+
716
+ do
717
+ let notEndsFilter = """ { "not": { "value_ends_with": "2" } }""" |> JsonDocument.Parse |> _. RootElement
718
+ let variables = ImmutableDictionary< string, JsonElement>. Empty.Add ( " filter" , notEndsFilter)
719
+ let filter = Not ( EndsWith { FieldName = " value" ; Value = " 2" })
720
+ let expectedFilter : KeyValuePair < obj list , _ > = kvp ([ " A" ; " subjects" ]) ( filter)
721
+ let result = executeWithCustomFilter ( query, variables, filter)
722
+ ensureDirect result <| fun data errors ->
723
+ empty errors
724
+ data |> equals ( upcast expected)
725
+ result.Metadata.TryFind< ObjectListFilters> ( " filters" )
726
+ |> wantValueSome
727
+ |> seqEquals [ expectedFilter ]
728
+
729
+ do
730
+ let notStartsFilter = """ { "not": { "value_sw": "3" } }""" |> JsonDocument.Parse |> _. RootElement
731
+ let variables = ImmutableDictionary< string, JsonElement>. Empty.Add ( " filter" , notStartsFilter)
732
+ let filter = Not ( StartsWith { FieldName = " value" ; Value = " 3" })
733
+ let expectedFilter : KeyValuePair < obj list , _ > = kvp ([ " A" ; " subjects" ]) ( filter)
734
+ let result = executeWithCustomFilter ( query, variables, filter)
735
+ ensureDirect result <| fun data errors ->
736
+ empty errors
737
+ data |> equals ( upcast expected)
738
+ result.Metadata.TryFind< ObjectListFilters> ( " filters" )
739
+ |> wantValueSome
740
+ |> seqEquals [ expectedFilter ]
741
+
742
+ do
743
+ let notEndsFilter = """ { "not": { "value_ew": "2" } }""" |> JsonDocument.Parse |> _. RootElement
744
+ let variables = ImmutableDictionary< string, JsonElement>. Empty.Add ( " filter" , notEndsFilter)
745
+ let filter = Not ( EndsWith { FieldName = " value" ; Value = " 2" })
746
+ let expectedFilter : KeyValuePair < obj list , _ > = kvp ([ " A" ; " subjects" ]) ( filter)
747
+ let result = executeWithCustomFilter ( query, variables, filter)
748
+ ensureDirect result <| fun data errors ->
749
+ empty errors
750
+ data |> equals ( upcast expected)
751
+ result.Metadata.TryFind< ObjectListFilters> ( " filters" )
752
+ |> wantValueSome
753
+ |> seqEquals [ expectedFilter ]
754
+
755
+ do
756
+ let notGreaterThanOrEqualFilter = """ { "not": { "id_greater_than_or_equal": 2 } }""" |> JsonDocument.Parse |> _. RootElement
757
+ let variables = ImmutableDictionary< string, JsonElement>. Empty.Add ( " filter" , notGreaterThanOrEqualFilter)
758
+ let filter = Not ( GreaterThanOrEqual { FieldName = " id" ; Value = 2.0 })
759
+ let expectedFilter : KeyValuePair < obj list , _ > = kvp ([ " A" ; " subjects" ]) ( filter)
760
+ let result = executeWithCustomFilter ( query, variables, filter)
761
+ ensureDirect result <| fun data errors ->
762
+ empty errors
763
+ data |> equals ( upcast expected)
764
+ result.Metadata.TryFind< ObjectListFilters> ( " filters" )
765
+ |> wantValueSome
766
+ |> seqEquals [ expectedFilter ]
767
+
768
+ do
769
+ let notLessThanOrEqualFilter = """ { "not": { "id_less_than_or_equal": 4 } }""" |> JsonDocument.Parse |> _. RootElement
770
+ let variables = ImmutableDictionary< string, JsonElement>. Empty.Add ( " filter" , notLessThanOrEqualFilter)
771
+ let filter = Not ( LessThanOrEqual { FieldName = " id" ; Value = 4.0 })
772
+ let expectedFilter : KeyValuePair < obj list , _ > = kvp ([ " A" ; " subjects" ]) ( filter)
773
+ let result = executeWithCustomFilter ( query, variables, filter)
774
+ ensureDirect result <| fun data errors ->
775
+ empty errors
776
+ data |> equals ( upcast expected)
777
+ result.Metadata.TryFind< ObjectListFilters> ( " filters" )
778
+ |> wantValueSome
779
+ |> seqEquals [ expectedFilter ]
780
+
781
+ do
782
+ let notGreaterThanFilter = """ { "not": { "id_greater_than": 2 } }""" |> JsonDocument.Parse |> _. RootElement
783
+ let variables = ImmutableDictionary< string, JsonElement>. Empty.Add ( " filter" , notGreaterThanFilter)
784
+ let filter = Not ( GreaterThan { FieldName = " id" ; Value = 2.0 })
785
+ let expectedFilter : KeyValuePair < obj list , _ > = kvp ([ " A" ; " subjects" ]) ( filter)
786
+ let result = executeWithCustomFilter ( query, variables, filter)
787
+ ensureDirect result <| fun data errors ->
788
+ empty errors
789
+ data |> equals ( upcast expected)
790
+ result.Metadata.TryFind< ObjectListFilters> ( " filters" )
791
+ |> wantValueSome
792
+ |> seqEquals [ expectedFilter ]
793
+
794
+ do
795
+ let notLessThanFilter = """ { "not": { "id_less_than": 4 } }""" |> JsonDocument.Parse |> _. RootElement
796
+ let variables = ImmutableDictionary< string, JsonElement>. Empty.Add ( " filter" , notLessThanFilter)
797
+ let filter = Not ( LessThan { FieldName = " id" ; Value = 4.0 })
798
+ let expectedFilter : KeyValuePair < obj list , _ > = kvp ([ " A" ; " subjects" ]) ( filter)
799
+ let result = executeWithCustomFilter ( query, variables, filter)
800
+ ensureDirect result
801
+ <| fun data errors ->
802
+ empty errors
803
+ data |> equals ( upcast expected)
804
+ result.Metadata.TryFind< ObjectListFilters> ( " filters" )
805
+ |> wantValueSome
806
+ |> seqEquals [ expectedFilter ]
807
+
808
+ do
809
+ let notGreaterThanOrEqualFilter = """ { "not": { "id_gte": 2 } }""" |> JsonDocument.Parse |> _. RootElement
810
+ let variables = ImmutableDictionary< string, JsonElement>. Empty.Add ( " filter" , notGreaterThanOrEqualFilter)
811
+ let filter = Not ( GreaterThanOrEqual { FieldName = " id" ; Value = 2.0 })
812
+ let expectedFilter : KeyValuePair < obj list , _ > = kvp ([ " A" ; " subjects" ]) ( filter)
813
+ let result = executeWithCustomFilter ( query, variables, filter)
814
+ ensureDirect result <| fun data errors ->
815
+ empty errors
816
+ data |> equals ( upcast expected)
817
+ result.Metadata.TryFind< ObjectListFilters> ( " filters" )
818
+ |> wantValueSome
819
+ |> seqEquals [ expectedFilter ]
820
+
821
+ do
822
+ let notLessThanOrEqualFilter = """ { "not": { "id_lte": 4 } }""" |> JsonDocument.Parse |> _. RootElement
823
+ let variables = ImmutableDictionary< string, JsonElement>. Empty.Add ( " filter" , notLessThanOrEqualFilter)
824
+ let filter = Not ( LessThanOrEqual { FieldName = " id" ; Value = 4.0 })
825
+ let expectedFilter : KeyValuePair < obj list , _ > = kvp ([ " A" ; " subjects" ]) ( filter)
826
+ let result = executeWithCustomFilter ( query, variables, filter)
827
+ ensureDirect result <| fun data errors ->
828
+ empty errors
829
+ data |> equals ( upcast expected)
830
+ result.Metadata.TryFind< ObjectListFilters> ( " filters" )
831
+ |> wantValueSome
832
+ |> seqEquals [ expectedFilter ]
833
+
834
+ do
835
+ let notGreaterThanFilter = """ { "not": { "id_gt": 2 } }""" |> JsonDocument.Parse |> _. RootElement
836
+ let variables = ImmutableDictionary< string, JsonElement>. Empty.Add ( " filter" , notGreaterThanFilter)
837
+ let filter = Not ( GreaterThan { FieldName = " id" ; Value = 2.0 })
838
+ let expectedFilter : KeyValuePair < obj list , _ > = kvp ([ " A" ; " subjects" ]) ( filter)
839
+ let result = executeWithCustomFilter ( query, variables, filter)
840
+ ensureDirect result <| fun data errors ->
841
+ empty errors
842
+ data |> equals ( upcast expected)
843
+ result.Metadata.TryFind< ObjectListFilters> ( " filters" )
844
+ |> wantValueSome
845
+ |> seqEquals [ expectedFilter ]
846
+
847
+ do
848
+ let notLessThanFilter = """ { "not": { "id_lt": 4 } }""" |> JsonDocument.Parse |> _. RootElement
849
+ let variables = ImmutableDictionary< string, JsonElement>. Empty.Add ( " filter" , notLessThanFilter)
850
+ let filter = Not ( LessThan { FieldName = " id" ; Value = 4.0 })
851
+ let expectedFilter : KeyValuePair < obj list , _ > = kvp ([ " A" ; " subjects" ]) ( filter)
852
+ let result = executeWithCustomFilter ( query, variables, filter)
853
+ ensureDirect result
854
+ <| fun data errors ->
855
+ empty errors
856
+ data |> equals ( upcast expected)
857
+ result.Metadata.TryFind< ObjectListFilters> ( " filters" )
858
+ |> wantValueSome
859
+ |> seqEquals [ expectedFilter ]
860
+
861
+ do
862
+ let notContainsFilter = """ { "not": { "value_contains": "A" } }""" |> JsonDocument.Parse |> _. RootElement
863
+ let variables = ImmutableDictionary< string, JsonElement>. Empty.Add ( " filter" , notContainsFilter)
864
+ let filter = Not ( Contains { FieldName = " value" ; Value = " A" })
865
+ let expectedFilter : KeyValuePair < obj list , _ > = kvp ([ " A" ; " subjects" ]) ( filter)
866
+ let result = executeWithCustomFilter ( query, variables, filter)
867
+ ensureDirect result <| fun data errors ->
868
+ empty errors
869
+ data |> equals ( upcast expected)
870
+ result.Metadata.TryFind< ObjectListFilters> ( " filters" )
871
+ |> wantValueSome
872
+ |> seqEquals [ expectedFilter ]
873
+
874
+ do
875
+ let notEqualsFilter = """ { "not": { "value": "A2" } }""" |> JsonDocument.Parse |> _. RootElement
876
+ let variables = ImmutableDictionary< string, JsonElement>. Empty.Add ( " filter" , notEqualsFilter)
877
+ let filter = Not ( Equals { FieldName = " value" ; Value = " A2" })
878
+ let expectedFilter : KeyValuePair < obj list , _ > = kvp ([ " A" ; " subjects" ]) ( filter)
879
+ let result = executeWithCustomFilter ( query, variables, filter)
880
+ ensureDirect result <| fun data errors ->
881
+ empty errors
882
+ data |> equals ( upcast expected)
883
+ result.Metadata.TryFind< ObjectListFilters> ( " filters" )
884
+ |> wantValueSome
885
+ |> seqEquals [ expectedFilter ]
0 commit comments