11using System . Collections . Generic ;
2+ using System . Linq ;
23using GraphQL . Types ;
34using GraphQL . Types . Relay . DataObjects ;
45using Xunit ;
@@ -13,11 +14,11 @@ public void class_policy_success()
1314 Settings . AddPolicy ( "ClassPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
1415 Settings . AddPolicy ( "FieldPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
1516
16- ShouldPassRule ( _ =>
17+ ShouldPassRule ( config =>
1718 {
18- _ . Query = @"query { post }" ;
19- _ . Schema = BasicSchema ( ) ;
20- _ . User = CreatePrincipal ( claims : new Dictionary < string , string >
19+ config . Query = @"query { post }" ;
20+ config . Schema = BasicSchema ( ) ;
21+ config . User = CreatePrincipal ( claims : new Dictionary < string , string >
2122 {
2223 { "Admin" , "true" }
2324 } ) ;
@@ -29,10 +30,10 @@ public void class_policy_fail()
2930 {
3031 Settings . AddPolicy ( "ClassPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
3132
32- ShouldFailRule ( _ =>
33+ ShouldFailRule ( config =>
3334 {
34- _ . Query = @"query { post }" ;
35- _ . Schema = BasicSchema ( ) ;
35+ config . Query = @"query { post }" ;
36+ config . Schema = BasicSchema ( ) ;
3637 } ) ;
3738 }
3839
@@ -42,11 +43,11 @@ public void field_policy_success()
4243 Settings . AddPolicy ( "ClassPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
4344 Settings . AddPolicy ( "FieldPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
4445
45- ShouldPassRule ( _ =>
46+ ShouldPassRule ( config =>
4647 {
47- _ . Query = @"query { post }" ;
48- _ . Schema = BasicSchema ( ) ;
49- _ . User = CreatePrincipal ( claims : new Dictionary < string , string >
48+ config . Query = @"query { post }" ;
49+ config . Schema = BasicSchema ( ) ;
50+ config . User = CreatePrincipal ( claims : new Dictionary < string , string >
5051 {
5152 { "Admin" , "true" }
5253 } ) ;
@@ -58,10 +59,10 @@ public void field_policy_fail()
5859 {
5960 Settings . AddPolicy ( "FieldPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
6061
61- ShouldFailRule ( _ =>
62+ ShouldFailRule ( config =>
6263 {
63- _ . Query = @"query { post }" ;
64- _ . Schema = BasicSchema ( ) ;
64+ config . Query = @"query { post }" ;
65+ config . Schema = BasicSchema ( ) ;
6566 } ) ;
6667 }
6768
@@ -70,11 +71,11 @@ public void nested_type_policy_success()
7071 {
7172 Settings . AddPolicy ( "PostPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
7273
73- ShouldPassRule ( _ =>
74+ ShouldPassRule ( config =>
7475 {
75- _ . Query = @"query { post }" ;
76- _ . Schema = NestedSchema ( ) ;
77- _ . User = CreatePrincipal ( claims : new Dictionary < string , string >
76+ config . Query = @"query { post }" ;
77+ config . Schema = NestedSchema ( ) ;
78+ config . User = CreatePrincipal ( claims : new Dictionary < string , string >
7879 {
7980 { "Admin" , "true" }
8081 } ) ;
@@ -86,10 +87,10 @@ public void nested_type_policy_fail()
8687 {
8788 Settings . AddPolicy ( "PostPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
8889
89- ShouldFailRule ( _ =>
90+ ShouldFailRule ( config =>
9091 {
91- _ . Query = @"query { post }" ;
92- _ . Schema = NestedSchema ( ) ;
92+ config . Query = @"query { post }" ;
93+ config . Schema = NestedSchema ( ) ;
9394 } ) ;
9495 }
9596
@@ -98,10 +99,55 @@ public void nested_type_list_policy_fail()
9899 {
99100 Settings . AddPolicy ( "PostPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
100101
101- ShouldFailRule ( _ =>
102+ ShouldFailRule ( config =>
102103 {
103- _ . Query = @"query { posts }" ;
104- _ . Schema = NestedSchema ( ) ;
104+ config . Query = @"query { posts }" ;
105+ config . Schema = NestedSchema ( ) ;
106+ } ) ;
107+ }
108+
109+ // https://github.com/graphql-dotnet/authorization/issues/5
110+ [ Theory ]
111+ [ InlineData ( "c" , "query p { posts } query c { comment }" ) ]
112+ [ InlineData ( null , "query c { comment } query p { posts }" ) ]
113+ public void issue5_should_pass ( string operationName , string query )
114+ {
115+ Settings . AddPolicy ( "PostPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
116+
117+ ShouldPassRule ( config =>
118+ {
119+ config . OperationName = operationName ;
120+ config . Query = query ;
121+ config . Schema = NestedSchema ( ) ;
122+ } ) ;
123+ }
124+
125+ // https://github.com/graphql-dotnet/authorization/issues/5
126+ [ Theory ]
127+ [ InlineData ( "query a { article { id } } query b { article { ...frag } } fragment frag on Article { content }" ) ]
128+ [ InlineData ( "query a { article { ...frag1 author } } query b { article { ...frag2 } } fragment frag1 on Article { id } fragment frag2 on Article { content }" ) ]
129+ public void issue5_with_fragment_should_pass ( string query )
130+ {
131+ Settings . AddPolicy ( "AdminPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
132+
133+ ShouldPassRule ( config =>
134+ {
135+ config . Query = query ;
136+ config . Schema = TypedSchema ( ) ;
137+ } ) ;
138+ }
139+
140+ // https://github.com/graphql-dotnet/authorization/issues/5
141+ [ Fact ]
142+ public void issue5_with_fragment_should_fail ( )
143+ {
144+ Settings . AddPolicy ( "AdminPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
145+
146+ ShouldFailRule ( config =>
147+ {
148+ config . Query = "query a { article { ...frag } } query b { article { ...frag } } fragment frag on Article { content }" ;
149+ config . Schema = TypedSchema ( ) ;
150+ config . ValidateResult = result => result . Errors . Single ( x => x . Message == $ "You are not authorized to run this query.\n Required claim 'admin' is not present.") ;
105151 } ) ;
106152 }
107153
@@ -110,10 +156,10 @@ public void nested_type_list_non_null_policy_fail()
110156 {
111157 Settings . AddPolicy ( "PostPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
112158
113- ShouldFailRule ( _ =>
159+ ShouldFailRule ( config =>
114160 {
115- _ . Query = @"query { postsNonNull }" ;
116- _ . Schema = NestedSchema ( ) ;
161+ config . Query = @"query { postsNonNull }" ;
162+ config . Schema = NestedSchema ( ) ;
117163 } ) ;
118164 }
119165
@@ -122,11 +168,11 @@ public void passes_with_claim_on_input_type()
122168 {
123169 Settings . AddPolicy ( "FieldPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
124170
125- ShouldPassRule ( _ =>
171+ ShouldPassRule ( config =>
126172 {
127- _ . Query = @"query { author(input: { name: ""Quinn"" }) }" ;
128- _ . Schema = TypedSchema ( ) ;
129- _ . User = CreatePrincipal ( claims : new Dictionary < string , string >
173+ config . Query = @"query { author(input: { name: ""Quinn"" }) }" ;
174+ config . Schema = TypedSchema ( ) ;
175+ config . User = CreatePrincipal ( claims : new Dictionary < string , string >
130176 {
131177 { "Admin" , "true" }
132178 } ) ;
@@ -138,10 +184,10 @@ public void fails_on_missing_claim_on_input_type()
138184 {
139185 Settings . AddPolicy ( "FieldPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
140186
141- ShouldFailRule ( _ =>
187+ ShouldFailRule ( config =>
142188 {
143- _ . Query = @"query { author(input: { name: ""Quinn"" }) }" ;
144- _ . Schema = TypedSchema ( ) ;
189+ config . Query = @"query { author(input: { name: ""Quinn"" }) }" ;
190+ config . Schema = TypedSchema ( ) ;
145191 } ) ;
146192 }
147193
@@ -152,11 +198,11 @@ public void passes_with_multiple_policies_on_field_and_single_on_input_type()
152198 Settings . AddPolicy ( "AdminPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
153199 Settings . AddPolicy ( "ConfidentialPolicy" , builder => builder . RequireClaim ( "admin" ) ) ;
154200
155- ShouldPassRule ( _ =>
201+ ShouldPassRule ( config =>
156202 {
157- _ . Query = @"query { author(input: { name: ""Quinn"" }) project(input: { name: ""TEST"" }) }" ;
158- _ . Schema = TypedSchema ( ) ;
159- _ . User = CreatePrincipal ( claims : new Dictionary < string , string >
203+ config . Query = @"query { author(input: { name: ""Quinn"" }) project(input: { name: ""TEST"" }) }" ;
204+ config . Schema = TypedSchema ( ) ;
205+ config . User = CreatePrincipal ( claims : new Dictionary < string , string >
160206 {
161207 { "Admin" , "true" }
162208 } ) ;
@@ -166,11 +212,11 @@ public void passes_with_multiple_policies_on_field_and_single_on_input_type()
166212 [ Fact ]
167213 public void Issue61 ( )
168214 {
169- ShouldPassRule ( _ =>
215+ ShouldPassRule ( config =>
170216 {
171- _ . Query = @"query { unknown(obj: {id: 7}) }" ;
172- _ . Schema = TypedSchema ( ) ;
173- _ . User = CreatePrincipal ( claims : new Dictionary < string , string >
217+ config . Query = @"query { unknown(obj: {id: 7}) }" ;
218+ config . Schema = TypedSchema ( ) ;
219+ config . User = CreatePrincipal ( claims : new Dictionary < string , string >
174220 {
175221 { "Admin" , "true" }
176222 } ) ;
@@ -182,11 +228,11 @@ public void passes_with_policy_on_connection_type()
182228 {
183229 Settings . AddPolicy ( "ConnectionPolicy" , _ => _ . RequireClaim ( "admin" ) ) ;
184230
185- ShouldPassRule ( _ =>
231+ ShouldPassRule ( config =>
186232 {
187- _ . Query = @"query { posts { items { id } } }" ;
188- _ . Schema = TypedSchema ( ) ;
189- _ . User = CreatePrincipal ( claims : new Dictionary < string , string >
233+ config . Query = @"query { posts { items { id } } }" ;
234+ config . Schema = TypedSchema ( ) ;
235+ config . User = CreatePrincipal ( claims : new Dictionary < string , string >
190236 {
191237 { "Admin" , "true" }
192238 } ) ;
@@ -198,11 +244,11 @@ public void fails_on_missing_claim_on_connection_type()
198244 {
199245 Settings . AddPolicy ( "ConnectionPolicy" , _ => _ . RequireClaim ( "admin" ) ) ;
200246
201- ShouldFailRule ( _ =>
247+ ShouldFailRule ( config =>
202248 {
203- _ . Query = @"query { posts { items { id } } }" ;
204- _ . Schema = TypedSchema ( ) ;
205- _ . User = CreatePrincipal ( ) ;
249+ config . Query = @"query { posts { items { id } } }" ;
250+ config . Schema = TypedSchema ( ) ;
251+ config . User = CreatePrincipal ( ) ;
206252 } ) ;
207253 }
208254
@@ -233,6 +279,7 @@ type Query {
233279 post(id: ID!): Post
234280 posts: [Post]
235281 postsNonNull: [Post!]!
282+ comment: String
236283 }
237284
238285 type Post {
@@ -256,6 +303,8 @@ public class NestedQueryWithAttributes
256303 public IEnumerable < Post > Posts ( ) => null ;
257304
258305 public IEnumerable < Post > PostsNonNull ( ) => null ;
306+
307+ public string Comment ( ) => null ;
259308 }
260309
261310 [ GraphQLAuthorize ( "PostPolicy" ) ]
@@ -272,6 +321,25 @@ public PostGraphType()
272321 }
273322 }
274323
324+ public class Article
325+ {
326+ public string Id { get ; set ; }
327+
328+ public string Author { get ; set ; }
329+
330+ public string Content { get ; set ; }
331+ }
332+
333+ public class ArticleGraphType : ObjectGraphType < Article >
334+ {
335+ public ArticleGraphType ( )
336+ {
337+ Field ( p => p . Id ) ;
338+ Field ( p => p . Author ) ;
339+ Field ( p => p . Content ) . AuthorizeWith ( "AdminPolicy" ) ;
340+ }
341+ }
342+
275343 public class Author
276344 {
277345 public string Name { get ; set ; }
@@ -297,6 +365,11 @@ private static ISchema TypedSchema()
297365 resolve : context => "testing"
298366 ) . AuthorizeWith ( "AdminPolicy" ) . AuthorizeWith ( "ConfidentialPolicy" ) ;
299367
368+ query . Field < ArticleGraphType > (
369+ "article" ,
370+ resolve : context => null
371+ ) ;
372+
300373 return new Schema { Query = query } ;
301374 }
302375
0 commit comments