Skip to content

Commit 708f564

Browse files
TRybina132Vitaliy Basanets
andauthored
Change structure, use persistent state in grain and add tests (#1)
* add grain state * add package * move types to namespaces * delete old project * change some structures and models * add serialization atribute to SessionEnity * add class for controller tests * added implementation for sessiongrain * add grain tests * move create session model to separate method * add tests for validate session method * add pause session method test * add pause session failture test * check if state exists by RecordExists property * added methods to sessiongrain * replace conditions with patterns * change pattern * fixed sessiongrain * refactor extensions and grain * add close session test * add grain tests * add regions for tests for each method * change option in test * add tests for claims * add update property test * add more cases for remove property tests * remove property return fail if property not exists * add session helper * added controller tests and class with routes * add send request to autorized route test * add autorize test * add test for routes with roles * add tests for authorized controller * add tests for unauthorized route in role authorized controller * add test for autorized controller * add test with 2 roles * add grain filter test * test when user and grain are authorized but route is not Co-authored-by: Vitaliy Basanets <vitaliy@managed-code.com>
1 parent a847af1 commit 708f564

50 files changed

Lines changed: 1231 additions & 2089 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace ManagedCode.Orleans.Identity.Tests.Cluster.Grains.Interfaces;
2+
3+
public interface IUserGrain : IGrainWithStringKey
4+
{
5+
Task<string> GetUser();
6+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using ManagedCode.Orleans.Identity.Tests.Cluster.Grains.Interfaces;
2+
using Microsoft.AspNetCore.Authorization;
3+
4+
namespace ManagedCode.Orleans.Identity.Tests.Cluster.Grains;
5+
6+
[Authorize]
7+
public class UserGrain : Grain, IUserGrain
8+
{
9+
public Task<string> GetUser()
10+
{
11+
return Task.FromResult("user");
12+
}
13+
}
Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
using ManagedCode.Orleans.Identity.Options;
2+
using ManagedCode.Orleans.Identity.Shared.Constants;
3+
using Microsoft.Extensions.DependencyInjection;
14
using Orleans.Serialization;
25
using Orleans.TestingHost;
36

@@ -9,18 +12,17 @@ public void Configure(ISiloBuilder siloBuilder)
912
{
1013
siloBuilder.Services.AddSerializer(serializerBuilder =>
1114
{
12-
//serializerBuilder.AddJsonSerializer();
15+
serializerBuilder.AddJsonSerializer();
1316
});
14-
//siloBuilder.ConfigureApplicationParts(parts =>
15-
//{
16-
// parts.AddFrameworkPart(typeof(IRequestTrackerGrain).Assembly);
17-
// parts.AddFrameworkPart(typeof(RequestTrackerGrain).Assembly);
18-
//});
17+
18+
// For test purpose
19+
siloBuilder.AddMemoryGrainStorage(OrleansIdentityConstants.SESSION_STORAGE_NAME);
1920

2021
siloBuilder.ConfigureServices(services =>
2122
{
23+
services.AddSingleton<SessionOption>(TestSiloOptions.SessionOption);
2224
// services.AddGrpcOrleansScaling();
23-
// services.AddApiOrleansScaling();
25+
// services.AddApiOrleansScaling();
2426
});
2527
}
2628
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using ManagedCode.Orleans.Identity.Options;
2+
3+
namespace ManagedCode.Orleans.Identity.Tests.Cluster;
4+
5+
public static class TestSiloOptions
6+
{
7+
public static SessionOption SessionOption { get; } = new SessionOption();
8+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
namespace ManagedCode.Orleans.Identity.Tests.Constants
2+
{
3+
public static class TestControllerRoutes
4+
{
5+
public const string ANONYMOUS_ROUTE = "/anonymous";
6+
public const string AUTHORIZE_ROUTE = "/authorize";
7+
public const string ADMIN_ROUTE = "/admin";
8+
public const string MODERATOR_ROUTE = "/moderator";
9+
public const string COMMON_ROUTE = "/common";
10+
11+
public const string ADMIN_CONTROLLER_DEFAULT_ROUTE = "/adminController";
12+
public const string ADMIN_CONTROLLER_ADMINS_LIST = "/adminController/adminsList";
13+
public const string ADMIN_CONTROLLER_ADMIN_GET_ADMIN = "/adminController/getAdmin";
14+
15+
public const string USER_CONTROLLER_DEFAULT_ROUTE = "/userController";
16+
public const string USER_CONTROLLER_ANONYMOUS_ROUTE = "/userController/anonymous";
17+
}
18+
}
Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
using FluentAssertions;
2+
using ManagedCode.Orleans.Identity.Grains.Interfaces;
3+
using ManagedCode.Orleans.Identity.Models;
4+
using ManagedCode.Orleans.Identity.Shared.Constants;
5+
using ManagedCode.Orleans.Identity.Tests.Cluster;
6+
using ManagedCode.Orleans.Identity.Tests.Constants;
7+
using ManagedCode.Orleans.Identity.Tests.Helpers;
8+
using System.Net;
9+
using System.Security.Claims;
10+
using Xunit;
11+
using Xunit.Abstractions;
12+
13+
namespace ManagedCode.Orleans.Identity.Tests;
14+
15+
[Collection(nameof(TestClusterApplication))]
16+
public class ControllerTests
17+
{
18+
private readonly TestClusterApplication _testApp;
19+
private readonly ITestOutputHelper _outputHelper;
20+
21+
private Dictionary<string, string> claimsForAdminController = new Dictionary<string, string>()
22+
{
23+
{ ClaimTypes.Role, "Moderator" },
24+
{ ClaimTypes.Email, "test2@gmail.com" }
25+
};
26+
27+
public ControllerTests(TestClusterApplication testApp, ITestOutputHelper outputHelper)
28+
{
29+
_testApp = testApp;
30+
_outputHelper = outputHelper;
31+
}
32+
33+
private async Task CreateSession(string sessionId, Dictionary<string, string> claims = null, bool replaceClaims = false)
34+
{
35+
var createSessionModel = SessionHelper.GetTestCreateSessionModel(sessionId, claims, replaceClaims);
36+
var sessionGrain = _testApp.Cluster.Client.GetGrain<ISessionGrain>(sessionId);
37+
await sessionGrain.CreateAsync(createSessionModel);
38+
}
39+
40+
#region Route tests
41+
42+
[Fact]
43+
public async Task SendRequestToUnauthorizedRoute_ReturnOk()
44+
{
45+
// Arrange
46+
var client = _testApp.CreateClient();
47+
48+
// Act
49+
var response = await client.GetAsync(TestControllerRoutes.ANONYMOUS_ROUTE);
50+
51+
// Assert
52+
response.IsSuccessStatusCode.Should().BeTrue();
53+
}
54+
55+
[Fact]
56+
public async Task SendRequestToAuthorizedRoute_WhenNotAuthorized_ReturnUnauthorizedCode()
57+
{
58+
// Arrange
59+
var client = _testApp.CreateClient();
60+
61+
// Act
62+
var response = await client.GetAsync(TestControllerRoutes.AUTHORIZE_ROUTE);
63+
64+
// Assert
65+
response.IsSuccessStatusCode.Should().BeFalse();
66+
response.StatusCode.Should().Be(HttpStatusCode.Unauthorized);
67+
}
68+
69+
[Fact]
70+
public async Task SendRequestToAuthorizedRoute_WhenAuthorized_ReturnOk()
71+
{
72+
// Arrange
73+
var client = _testApp.CreateClient();
74+
var sessionId = Guid.NewGuid().ToString();
75+
await CreateSession(sessionId);
76+
client.DefaultRequestHeaders.Add(OrleansIdentityConstants.AUTH_TOKEN, sessionId);
77+
78+
// Act
79+
var response = await client.GetAsync(TestControllerRoutes.AUTHORIZE_ROUTE);
80+
81+
// Assert
82+
response.IsSuccessStatusCode.Should().BeTrue();
83+
}
84+
85+
[Fact]
86+
public async Task SendRequestToAuthorizedRouteWithRole_WhenAuthorizedWithRole_ReturnOk()
87+
{
88+
// Arrange
89+
var client = _testApp.CreateClient();
90+
var sessionId = Guid.NewGuid().ToString();
91+
await CreateSession(sessionId);
92+
client.DefaultRequestHeaders.Add(OrleansIdentityConstants.AUTH_TOKEN, sessionId);
93+
94+
// Act
95+
var response = await client.GetAsync(TestControllerRoutes.ADMIN_ROUTE);
96+
97+
// Assert
98+
response.IsSuccessStatusCode.Should().BeTrue();
99+
}
100+
101+
[Fact]
102+
public async Task SendRequestToAuthorizedRouteWithRole_WhenAuthorizedWithoutRole_ReturnForbidden()
103+
{
104+
// Arrange
105+
var client = _testApp.CreateClient();
106+
var sessionId = Guid.NewGuid().ToString();
107+
await CreateSession(sessionId);
108+
client.DefaultRequestHeaders.Add(OrleansIdentityConstants.AUTH_TOKEN, sessionId);
109+
110+
// Act
111+
var response = await client.GetAsync(TestControllerRoutes.MODERATOR_ROUTE);
112+
113+
// Assert
114+
response.IsSuccessStatusCode.Should().BeFalse();
115+
response.StatusCode.Should().Be(HttpStatusCode.Forbidden);
116+
}
117+
118+
[Fact]
119+
public async Task SendRequestToAuthorizedRouteWitheRoles_WhenAuthorizedWithRoles_ReturnOk()
120+
{
121+
// Arrange
122+
var client = _testApp.CreateClient();
123+
var sessionId = Guid.NewGuid().ToString();
124+
var roles = new Dictionary<string, string>()
125+
{
126+
{ ClaimTypes.Role, "moderator" }
127+
};
128+
await CreateSession(sessionId, roles);
129+
client.DefaultRequestHeaders.Add(OrleansIdentityConstants.AUTH_TOKEN, sessionId);
130+
131+
// Act
132+
var response = await client.GetAsync(TestControllerRoutes.COMMON_ROUTE);
133+
134+
// Assert
135+
response.IsSuccessStatusCode.Should().BeTrue();
136+
}
137+
138+
[Fact]
139+
public async Task SendRequestToAuthorizedRouteWitheRoles_WhenAuthorizedWithNotAllRoles_ReturnOk()
140+
{
141+
// Arrange
142+
var client = _testApp.CreateClient();
143+
var sessionId = Guid.NewGuid().ToString();
144+
await CreateSession(sessionId);
145+
client.DefaultRequestHeaders.Add(OrleansIdentityConstants.AUTH_TOKEN, sessionId);
146+
147+
// Act
148+
var response = await client.GetAsync(TestControllerRoutes.COMMON_ROUTE);
149+
150+
// Assert
151+
response.IsSuccessStatusCode.Should().BeTrue();
152+
}
153+
154+
#endregion
155+
156+
#region Controller tests
157+
158+
[Fact]
159+
public async Task SendRequestToAuthorizedController_WhenHasRole_ReturnOk()
160+
{
161+
// Arrange
162+
var client = _testApp.CreateClient();
163+
var sessionId = Guid.NewGuid().ToString();
164+
await CreateSession(sessionId);
165+
client.DefaultRequestHeaders.Add(OrleansIdentityConstants.AUTH_TOKEN, sessionId);
166+
167+
// Act
168+
var response = await client.GetAsync(TestControllerRoutes.ADMIN_CONTROLLER_DEFAULT_ROUTE);
169+
170+
// Assert
171+
response.IsSuccessStatusCode.Should().BeTrue();
172+
}
173+
174+
[Fact]
175+
public async Task SendRequestToAuthorizedControllerToUnauthorizedRoute_WithoutRole_ReturnOk()
176+
{
177+
// Arrange
178+
var client = _testApp.CreateClient();
179+
var sessionId = Guid.NewGuid().ToString();
180+
await CreateSession(sessionId, claimsForAdminController, true);
181+
client.DefaultRequestHeaders.Add(OrleansIdentityConstants.AUTH_TOKEN, sessionId);
182+
183+
// Act
184+
var response = await client.GetAsync(TestControllerRoutes.ADMIN_CONTROLLER_ADMINS_LIST);
185+
186+
// Assert
187+
response.IsSuccessStatusCode.Should().BeTrue();
188+
}
189+
190+
[Fact]
191+
public async Task SendRequestToAuthorizedControllerToUnauthorizedRoute_NotAuthorized_ReturnOk()
192+
{
193+
// Arrange
194+
var client = _testApp.CreateClient();
195+
196+
// Act
197+
var response = await client.GetAsync(TestControllerRoutes.ADMIN_CONTROLLER_ADMINS_LIST);
198+
199+
// Assert
200+
response.IsSuccessStatusCode.Should().BeTrue();
201+
}
202+
203+
[Fact]
204+
public async Task SendRequestToAuthorizedControllerToAuthorizedRoute_WhenAutorized_ReturnForbidden()
205+
{
206+
// Arrange
207+
var client = _testApp.CreateClient();
208+
var sessionId = Guid.NewGuid().ToString();
209+
await CreateSession(sessionId, claimsForAdminController, true);
210+
client.DefaultRequestHeaders.Add(OrleansIdentityConstants.AUTH_TOKEN, sessionId);
211+
212+
// Act
213+
var response = await client.GetAsync(TestControllerRoutes.ADMIN_CONTROLLER_ADMIN_GET_ADMIN);
214+
215+
// Assert
216+
response.IsSuccessStatusCode.Should().BeFalse();
217+
response.StatusCode.Should().Be(HttpStatusCode.Forbidden);
218+
}
219+
220+
[Fact]
221+
public async Task SendRequestToToAuthorizedControllerToAuthorizedRouteWithRole_WhenAutorizedWithRole_ReturnOk()
222+
{
223+
// Arrange
224+
var client = _testApp.CreateClient();
225+
var sessionId = Guid.NewGuid().ToString();
226+
var userClaims = new Dictionary<string, string>
227+
{
228+
{ ClaimTypes.Role, "admin" },
229+
{ ClaimTypes.Role, "moderator" }
230+
};
231+
232+
await CreateSession(sessionId, userClaims, true);
233+
client.DefaultRequestHeaders.Add(OrleansIdentityConstants.AUTH_TOKEN, sessionId);
234+
235+
// Act
236+
var response = await client.GetAsync(TestControllerRoutes.ADMIN_CONTROLLER_ADMIN_GET_ADMIN);
237+
238+
// Assert
239+
response.IsSuccessStatusCode.Should().BeTrue();
240+
}
241+
242+
243+
#endregion
244+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using FluentAssertions;
2+
using ManagedCode.Orleans.Identity.Grains.Interfaces;
3+
using ManagedCode.Orleans.Identity.Shared.Constants;
4+
using ManagedCode.Orleans.Identity.Tests.Cluster;
5+
using ManagedCode.Orleans.Identity.Tests.Constants;
6+
using ManagedCode.Orleans.Identity.Tests.Helpers;
7+
using Xunit;
8+
using Xunit.Abstractions;
9+
10+
namespace ManagedCode.Orleans.Identity.Tests;
11+
12+
[Collection(nameof(TestClusterApplication))]
13+
public class GrainFilterTests
14+
{
15+
private readonly TestClusterApplication _testApp;
16+
private readonly ITestOutputHelper _outputHelper;
17+
18+
public GrainFilterTests(TestClusterApplication testApp, ITestOutputHelper outputHelper)
19+
{
20+
_testApp = testApp;
21+
_outputHelper = outputHelper;
22+
}
23+
24+
private async Task CreateSession(string sessionId, Dictionary<string, string> claims = null, bool replaceClaims = false)
25+
{
26+
var createSessionModel = SessionHelper.GetTestCreateSessionModel(sessionId, claims, replaceClaims);
27+
var sessionGrain = _testApp.Cluster.Client.GetGrain<ISessionGrain>(sessionId);
28+
await sessionGrain.CreateAsync(createSessionModel);
29+
}
30+
31+
#region User authorized
32+
33+
[Fact]
34+
public async Task SendRequestToAuthorizedGrain_WhenAuthorized_ReturnOk()
35+
{
36+
// Arrange
37+
var client = _testApp.CreateClient();
38+
var sessionId = Guid.NewGuid().ToString();
39+
await CreateSession(sessionId);
40+
client.DefaultRequestHeaders.Add(OrleansIdentityConstants.AUTH_TOKEN, sessionId);
41+
42+
// Act
43+
var response = await client.GetAsync(TestControllerRoutes.USER_CONTROLLER_DEFAULT_ROUTE);
44+
45+
// Assert
46+
response.IsSuccessStatusCode.Should().BeTrue();
47+
}
48+
49+
[Fact]
50+
public async Task SendRequestToAuthorizedRoute_WhenGrainAndUserAreAuthorized_ReturnOk()
51+
{
52+
// Arrange
53+
var client = _testApp.CreateClient();
54+
var sessionId = Guid.NewGuid().ToString();
55+
await CreateSession(sessionId);
56+
client.DefaultRequestHeaders.Add(OrleansIdentityConstants.AUTH_TOKEN, sessionId);
57+
58+
// Act
59+
var response = await client.GetAsync(TestControllerRoutes.USER_CONTROLLER_ANONYMOUS_ROUTE);
60+
61+
// Assert
62+
response.IsSuccessStatusCode.Should().BeTrue();
63+
}
64+
65+
#endregion
66+
}

0 commit comments

Comments
 (0)