Skip to content

Commit 4821115

Browse files
authored
Small cleanup and fix #61 (#87)
1 parent a590608 commit 4821115

24 files changed

+281
-135
lines changed

.github/labeler.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"test":
22
- src/GraphQL.Authorization.Tests/**/*
3+
- src/GraphQL.Authorization.ApiTests/**/*
34

45
"CI":
56
- .github/workflows/**/*

src/BasicSample/BasicSample.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
<OutputType>Exe</OutputType>
55
<TargetFramework>netcoreapp3.1</TargetFramework>
66
<IsPackable>false</IsPackable>
7+
<NoWarn>$(NoWarn);1591</NoWarn>
78
</PropertyGroup>
89

910
<ItemGroup>

src/Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project>
22

33
<PropertyGroup>
4-
<VersionPrefix>3.0.44-preview</VersionPrefix>
4+
<VersionPrefix>3.1.0-preview</VersionPrefix>
55
<LangVersion>latest</LangVersion>
66
<Authors>Joe McBride</Authors>
77
<PackageLicenseExpression>MIT</PackageLicenseExpression>

src/GraphQL.Authorization.ApiTests/ApiApprovalTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public class ApiApprovalTests
1010
{
1111
[Theory]
1212
[InlineData(typeof(IAuthorizationRequirement))]
13-
public void PublicApi(Type type)
13+
public void public_api_should_not_change_unintentionally(Type type)
1414
{
1515
string publicApi = type.Assembly.GeneratePublicApi(new ApiGeneratorOptions
1616
{
@@ -21,7 +21,7 @@ public void PublicApi(Type type)
2121
// Note: If the AssemblyName.approved.txt file doesn't match the latest publicApi value,
2222
// this call will try to launch a diff tool to help you out but that can fail on
2323
// your machine if a diff tool isn't configured/setup.
24-
publicApi.ShouldMatchApproved(options => options.WithDiscriminator(type.Assembly.GetName().Name));
24+
publicApi.ShouldMatchApproved(options => options.WithFilenameGenerator((testMethodInfo, discriminator, fileType, fileExtension) => $"{type.Assembly.GetName().Name}.{fileType}.{fileExtension}"));
2525
}
2626
}
2727
}

src/GraphQL.Authorization.ApiTests/GraphQL.Authorization.ApiTests.csproj

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<TargetFramework>netcoreapp3.1</TargetFramework>
5+
<NoWarn>$(NoWarn);1591</NoWarn>
56
</PropertyGroup>
67

78
<ItemGroup>
@@ -15,5 +16,5 @@
1516
<ItemGroup>
1617
<ProjectReference Include="..\GraphQL.Authorization\GraphQL.Authorization.csproj" />
1718
</ItemGroup>
18-
19+
1920
</Project>

src/GraphQL.Authorization.ApiTests/ApiApprovalTests.PublicApi.GraphQL.Authorization.approved.txt renamed to src/GraphQL.Authorization.ApiTests/GraphQL.Authorization.approved.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ namespace GraphQL.Authorization
7171
{
7272
public ClaimAuthorizationRequirement(string claimType) { }
7373
public ClaimAuthorizationRequirement(string claimType, System.Collections.Generic.IEnumerable<string> allowedValues) { }
74+
public ClaimAuthorizationRequirement(string claimType, params string[] allowedValues) { }
7475
public ClaimAuthorizationRequirement(string claimType, System.Collections.Generic.IEnumerable<string> allowedValues, System.Collections.Generic.IEnumerable<string> displayValues) { }
7576
public System.Threading.Tasks.Task Authorize(GraphQL.Authorization.AuthorizationContext context) { }
7677
}

src/GraphQL.Authorization.Tests/AuthorizationEvaluatorTests.cs

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using System.Collections.Generic;
23
using System.Security.Claims;
34
using System.Threading.Tasks;
@@ -26,7 +27,7 @@ public async Task fails_with_null_principal()
2627
null,
2728
null,
2829
null,
29-
new[] {"MyPolicy"}
30+
new[] { "MyPolicy" }
3031
);
3132

3233
result.Succeeded.ShouldBeFalse();
@@ -41,7 +42,7 @@ public async Task fails_when_missing_claim()
4142
CreatePrincipal(),
4243
null,
4344
null,
44-
new[] {"MyPolicy"}
45+
new[] { "MyPolicy" }
4546
);
4647

4748
result.Succeeded.ShouldBeFalse();
@@ -55,7 +56,7 @@ public async Task fails_when_missing_policy()
5556
var result = await _evaluator.Evaluate(
5657
CreatePrincipal(claims: new Dictionary<string, string>
5758
{
58-
{"Admin", "true"}
59+
{ "Admin", "true" }
5960
}),
6061
null,
6162
null,
@@ -73,11 +74,11 @@ public async Task succeeds_when_policy_applied()
7374
var result = await _evaluator.Evaluate(
7475
CreatePrincipal(claims: new Dictionary<string, string>
7576
{
76-
{"Admin", "true"}
77+
{ "Admin", "true" }
7778
}),
7879
null,
7980
null,
80-
new[] {"MyPolicy"}
81+
new[] { "MyPolicy" }
8182
);
8283

8384
result.Succeeded.ShouldBeTrue();
@@ -91,11 +92,11 @@ public async Task succeeds_with_claim_value()
9192
var result = await _evaluator.Evaluate(
9293
CreatePrincipal(claims: new Dictionary<string, string>
9394
{
94-
{"Admin", "true"}
95+
{ "Admin", "true" }
9596
}),
9697
null,
9798
null,
98-
new[] {"MyPolicy"}
99+
new[] { "MyPolicy" }
99100
);
100101

101102
result.Succeeded.ShouldBeTrue();
@@ -109,7 +110,7 @@ public async Task succeeds_when_null_policies()
109110
var result = await _evaluator.Evaluate(
110111
CreatePrincipal(claims: new Dictionary<string, string>
111112
{
112-
{"Admin", "true"}
113+
{ "Admin", "true" }
113114
}),
114115
null,
115116
null,
@@ -119,6 +120,24 @@ public async Task succeeds_when_null_policies()
119120
result.Succeeded.ShouldBeTrue();
120121
}
121122

123+
[Fact]
124+
public async Task succeeds_when_empty_policies()
125+
{
126+
_settings.AddPolicy("MyPolicy", _ => { });
127+
128+
var result = await _evaluator.Evaluate(
129+
CreatePrincipal(claims: new Dictionary<string, string>
130+
{
131+
{ "Admin", "true" }
132+
}),
133+
null,
134+
null,
135+
Array.Empty<string>()
136+
);
137+
138+
result.Succeeded.ShouldBeTrue();
139+
}
140+
122141
[Fact]
123142
public async Task succeeds_when_null_principal()
124143
{

src/GraphQL.Authorization.Tests/AuthorizationValidationRuleTests.cs

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@ public class AuthorizationValidationRuleTests : ValidationTestBase
1010
[Fact]
1111
public void class_policy_success()
1212
{
13-
Settings.AddPolicy("ClassPolicy", _ => _.RequireClaim("admin"));
14-
Settings.AddPolicy("FieldPolicy", _ => _.RequireClaim("admin"));
13+
Settings.AddPolicy("ClassPolicy", builder => builder.RequireClaim("admin"));
14+
Settings.AddPolicy("FieldPolicy", builder => builder.RequireClaim("admin"));
1515

1616
ShouldPassRule(_ =>
1717
{
1818
_.Query = @"query { post }";
1919
_.Schema = BasicSchema();
2020
_.User = CreatePrincipal(claims: new Dictionary<string, string>
2121
{
22-
{"Admin", "true"}
22+
{ "Admin", "true" }
2323
});
2424
});
2525
}
@@ -39,16 +39,16 @@ public void class_policy_fail()
3939
[Fact]
4040
public void field_policy_success()
4141
{
42-
Settings.AddPolicy("ClassPolicy", _ => _.RequireClaim("admin"));
43-
Settings.AddPolicy("FieldPolicy", _ => _.RequireClaim("admin"));
42+
Settings.AddPolicy("ClassPolicy", builder => builder.RequireClaim("admin"));
43+
Settings.AddPolicy("FieldPolicy", builder => builder.RequireClaim("admin"));
4444

4545
ShouldPassRule(_ =>
4646
{
4747
_.Query = @"query { post }";
4848
_.Schema = BasicSchema();
4949
_.User = CreatePrincipal(claims: new Dictionary<string, string>
5050
{
51-
{"Admin", "true"}
51+
{ "Admin", "true" }
5252
});
5353
});
5454
}
@@ -76,7 +76,7 @@ public void nested_type_policy_success()
7676
_.Schema = NestedSchema();
7777
_.User = CreatePrincipal(claims: new Dictionary<string, string>
7878
{
79-
{"Admin", "true"}
79+
{ "Admin", "true" }
8080
});
8181
});
8282
}
@@ -128,7 +128,7 @@ public void passes_with_claim_on_input_type()
128128
_.Schema = TypedSchema();
129129
_.User = CreatePrincipal(claims: new Dictionary<string, string>
130130
{
131-
{"Admin", "true"}
131+
{ "Admin", "true" }
132132
});
133133
});
134134
}
@@ -148,17 +148,31 @@ public void fails_on_missing_claim_on_input_type()
148148
[Fact]
149149
public void passes_with_multiple_policies_on_field_and_single_on_input_type()
150150
{
151-
Settings.AddPolicy("FieldPolicy", _ => _.RequireClaim("admin"));
152-
Settings.AddPolicy("AdminPolicy", _ => _.RequireClaim("admin"));
153-
Settings.AddPolicy("ConfidentialPolicy", _ => _.RequireClaim("admin"));
151+
Settings.AddPolicy("FieldPolicy", builder => builder.RequireClaim("admin"));
152+
Settings.AddPolicy("AdminPolicy", builder => builder.RequireClaim("admin"));
153+
Settings.AddPolicy("ConfidentialPolicy", builder => builder.RequireClaim("admin"));
154154

155155
ShouldPassRule(_ =>
156156
{
157157
_.Query = @"query { author(input: { name: ""Quinn"" }) project(input: { name: ""TEST"" }) }";
158158
_.Schema = TypedSchema();
159159
_.User = CreatePrincipal(claims: new Dictionary<string, string>
160160
{
161-
{"Admin", "true"}
161+
{ "Admin", "true" }
162+
});
163+
});
164+
}
165+
166+
[Fact]
167+
public void Issue61()
168+
{
169+
ShouldPassRule(_ =>
170+
{
171+
_.Query = @"query { unknown(obj: {id: 7}) }";
172+
_.Schema = TypedSchema();
173+
_.User = CreatePrincipal(claims: new Dictionary<string, string>
174+
{
175+
{ "Admin", "true" }
162176
});
163177
});
164178
}
@@ -228,10 +242,10 @@ type Post {
228242
}
229243
";
230244

231-
return Schema.For(defs, _ =>
245+
return Schema.For(defs, builder =>
232246
{
233-
_.Types.Include<NestedQueryWithAttributes>();
234-
_.Types.Include<Post>();
247+
builder.Types.Include<NestedQueryWithAttributes>();
248+
builder.Types.Include<Post>();
235249
});
236250
}
237251

src/GraphQL.Authorization.Tests/ClaimAuthorizationRequirementTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public async Task produces_error_when_missing_claim_ignoring_value()
2828
[Fact]
2929
public async Task produces_error_when_missing_claim_with_single_value()
3030
{
31-
var req = new ClaimAuthorizationRequirement("Admin", new[] {"true"});
31+
var req = new ClaimAuthorizationRequirement("Admin", "true");
3232

3333
var context = new AuthorizationContext
3434
{
@@ -44,7 +44,7 @@ public async Task produces_error_when_missing_claim_with_single_value()
4444
[Fact]
4545
public async Task produces_error_when_missing_claim_with_multiple_values()
4646
{
47-
var req = new ClaimAuthorizationRequirement("Admin", new[] {"true", "maybe"});
47+
var req = new ClaimAuthorizationRequirement("Admin", "true", "maybe");
4848

4949
var context = new AuthorizationContext
5050
{
@@ -75,7 +75,7 @@ public async Task succeeds_when_claim_with_ignoring_value()
7575
[Fact]
7676
public async Task succeeds_when_claim_with_single_value()
7777
{
78-
var req = new ClaimAuthorizationRequirement("Admin", new[] {"true"});
78+
var req = new ClaimAuthorizationRequirement("Admin", "true");
7979

8080
var context = new AuthorizationContext
8181
{
@@ -90,7 +90,7 @@ public async Task succeeds_when_claim_with_single_value()
9090
[Fact]
9191
public async Task succeeds_when_claim_with_multiple_values()
9292
{
93-
var req = new ClaimAuthorizationRequirement("Admin", new[] {"true", "maybe"});
93+
var req = new ClaimAuthorizationRequirement("Admin", "true", "maybe");
9494

9595
var context = new AuthorizationContext
9696
{
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System.Collections.Generic;
2+
using System.Security.Claims;
3+
4+
namespace GraphQL.Authorization.Tests
5+
{
6+
internal class GraphQLUserContext : Dictionary<string, object>, IProvideClaimsPrincipal
7+
{
8+
public ClaimsPrincipal User { get; set; }
9+
}
10+
}

0 commit comments

Comments
 (0)