Skip to content

Commit 372da26

Browse files
authored
Client Tests (#29)
* Added Client Credentials Tests * Added Client Authorization Tests * Added Client Session Tests * Added Client User Tests * Added Client Flow Tests * Added Missing Flow Tests * Added Options & Runtime Tests * Added UAuthLoginForm Tests * Fix Test * UAuthApp & UAuthStateView Tests
1 parent 0f7c3d9 commit 372da26

19 files changed

+2583
-18
lines changed

src/client/CodeBeam.UltimateAuth.Client.Blazor/Components/UAuthStateView.razor.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,18 @@ private async Task<bool> EvaluateAuthorizationAsync()
9898
var results = new List<bool>();
9999

100100
if (roles.Count > 0)
101-
results.Add(roles.Any(AuthState.IsInRole));
101+
{
102+
results.Add(MatchAll
103+
? roles.All(AuthState.IsInRole)
104+
: roles.Any(AuthState.IsInRole));
105+
}
102106

103107
if (permissions.Count > 0)
104-
results.Add(permissions.Any(AuthState.HasPermission));
108+
{
109+
results.Add(MatchAll
110+
? permissions.All(AuthState.HasPermission)
111+
: permissions.Any(AuthState.HasPermission));
112+
}
105113

106114
if (!string.IsNullOrWhiteSpace(Policy))
107115
results.Add(await EvaluatePolicyAsync());

src/client/CodeBeam.UltimateAuth.Client/Services/UAuthAuthorizationClient.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public async Task<UAuthResult<UserRolesResponse>> GetMyRolesAsync(PageRequest? r
3939
public async Task<UAuthResult<UserRolesResponse>> GetUserRolesAsync(UserKey userKey, PageRequest? request = null)
4040
{
4141
request ??= new PageRequest();
42-
var raw = await _request.SendJsonAsync(Url($"/admin/authorization/users/{userKey}/roles/get"), request);
42+
var raw = await _request.SendJsonAsync(Url($"/admin/authorization/users/{userKey.Value}/roles/get"), request);
4343
return UAuthResultMapper.FromJson<UserRolesResponse>(raw);
4444
}
4545

src/client/CodeBeam.UltimateAuth.Client/Services/UAuthSessionClient.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ public async Task<UAuthResult<PagedResult<SessionChainSummary>>> GetMyChainsAsyn
3333

3434
public async Task<UAuthResult<SessionChainDetail>> GetMyChainDetailAsync(SessionChainId chainId)
3535
{
36-
var raw = await _request.SendFormAsync(Url($"/me/sessions/chains/{chainId}"));
36+
var raw = await _request.SendFormAsync(Url($"/me/sessions/chains/{chainId.Value}"));
3737
return UAuthResultMapper.FromJson<SessionChainDetail>(raw);
3838
}
3939

4040
public async Task<UAuthResult<RevokeResult>> RevokeMyChainAsync(SessionChainId chainId)
4141
{
42-
var raw = await _request.SendJsonAsync(Url($"/me/sessions/chains/{chainId}/revoke"));
42+
var raw = await _request.SendJsonAsync(Url($"/me/sessions/chains/{chainId.Value}/revoke"));
4343
var result = UAuthResultMapper.FromJson<RevokeResult>(raw);
4444

4545
if (result.Value?.CurrentChain == true)
@@ -73,37 +73,37 @@ public async Task<UAuthResult> RevokeAllMyChainsAsync()
7373
public async Task<UAuthResult<PagedResult<SessionChainSummary>>> GetUserChainsAsync(UserKey userKey, PageRequest? request = null)
7474
{
7575
request ??= new PageRequest();
76-
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/sessions/chains"), request);
76+
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey.Value}/sessions/chains"), request);
7777
return UAuthResultMapper.FromJson<PagedResult<SessionChainSummary>>(raw);
7878
}
7979

8080
public async Task<UAuthResult<SessionChainDetail>> GetUserChainDetailAsync(UserKey userKey, SessionChainId chainId)
8181
{
82-
var raw = await _request.SendFormAsync(Url($"/admin/users/{userKey}/sessions/chains/{chainId}"));
82+
var raw = await _request.SendFormAsync(Url($"/admin/users/{userKey.Value}/sessions/chains/{chainId.Value}"));
8383
return UAuthResultMapper.FromJson<SessionChainDetail>(raw);
8484
}
8585

8686
public async Task<UAuthResult> RevokeUserSessionAsync(UserKey userKey, AuthSessionId sessionId)
8787
{
88-
var raw = await _request.SendFormAsync(Url($"/admin/users/{userKey}/sessions/{sessionId}/revoke"));
88+
var raw = await _request.SendFormAsync(Url($"/admin/users/{userKey.Value}/sessions/{sessionId.Value}/revoke"));
8989
return UAuthResultMapper.From(raw);
9090
}
9191

9292
public async Task<UAuthResult<RevokeResult>> RevokeUserChainAsync(UserKey userKey, SessionChainId chainId)
9393
{
94-
var raw = await _request.SendFormAsync(Url($"/admin/users/{userKey}/sessions/chains/{chainId}/revoke"));
94+
var raw = await _request.SendFormAsync(Url($"/admin/users/{userKey.Value}/sessions/chains/{chainId.Value}/revoke"));
9595
return UAuthResultMapper.FromJson<RevokeResult>(raw);
9696
}
9797

9898
public async Task<UAuthResult> RevokeUserRootAsync(UserKey userKey)
9999
{
100-
var raw = await _request.SendFormAsync(Url($"/admin/users/{userKey}/sessions/revoke-root"));
100+
var raw = await _request.SendFormAsync(Url($"/admin/users/{userKey.Value}/sessions/revoke-root"));
101101
return UAuthResultMapper.From(raw);
102102
}
103103

104104
public async Task<UAuthResult> RevokeAllUserChainsAsync(UserKey userKey)
105105
{
106-
var raw = await _request.SendFormAsync(Url($"/admin/users/{userKey}/sessions/revoke-all"));
106+
var raw = await _request.SendFormAsync(Url($"/admin/users/{userKey.Value}/sessions/revoke-all"));
107107
return UAuthResultMapper.From(raw);
108108
}
109109
}

src/client/CodeBeam.UltimateAuth.Client/Services/UAuthUserIdentifierClient.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,37 +99,37 @@ public async Task<UAuthResult<PagedResult<UserIdentifierInfo>>> GetUserAsync(Use
9999

100100
public async Task<UAuthResult> AddUserAsync(UserKey userKey, AddUserIdentifierRequest request)
101101
{
102-
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/identifiers/add"), request);
102+
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey.Value}/identifiers/add"), request);
103103
return UAuthResultMapper.From(raw);
104104
}
105105

106106
public async Task<UAuthResult> UpdateUserAsync(UserKey userKey, UpdateUserIdentifierRequest request)
107107
{
108-
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/identifiers/update"), request);
108+
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey.Value}/identifiers/update"), request);
109109
return UAuthResultMapper.From(raw);
110110
}
111111

112112
public async Task<UAuthResult> SetUserPrimaryAsync(UserKey userKey, SetPrimaryUserIdentifierRequest request)
113113
{
114-
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/identifiers/set-primary"), request);
114+
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey.Value}/identifiers/set-primary"), request);
115115
return UAuthResultMapper.From(raw);
116116
}
117117

118118
public async Task<UAuthResult> UnsetUserPrimaryAsync(UserKey userKey, UnsetPrimaryUserIdentifierRequest request)
119119
{
120-
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/identifiers/unset-primary"), request);
120+
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey.Value}/identifiers/unset-primary"), request);
121121
return UAuthResultMapper.From(raw);
122122
}
123123

124124
public async Task<UAuthResult> VerifyUserAsync(UserKey userKey, VerifyUserIdentifierRequest request)
125125
{
126-
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/identifiers/verify"), request);
126+
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey.Value}/identifiers/verify"), request);
127127
return UAuthResultMapper.From(raw);
128128
}
129129

130130
public async Task<UAuthResult> DeleteUserAsync(UserKey userKey, DeleteUserIdentifierRequest request)
131131
{
132-
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey}/identifiers/delete"), request);
132+
var raw = await _request.SendJsonAsync(Url($"/admin/users/{userKey.Value}/identifiers/delete"), request);
133133
return UAuthResultMapper.From(raw);
134134
}
135135
}
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
using Bunit;
2+
using CodeBeam.UltimateAuth.Client;
3+
using CodeBeam.UltimateAuth.Client.Abstractions;
4+
using CodeBeam.UltimateAuth.Client.Blazor;
5+
using CodeBeam.UltimateAuth.Client.Infrastructure;
6+
using CodeBeam.UltimateAuth.Tests.Unit.Helpers;
7+
using FluentAssertions;
8+
using Microsoft.AspNetCore.Components;
9+
using Microsoft.Extensions.DependencyInjection;
10+
using Moq;
11+
12+
namespace CodeBeam.UltimateAuth.Tests.Unit;
13+
14+
public class UAuthAppTests
15+
{
16+
17+
private (BunitContext ctx, Mock<IUAuthStateManager> stateManager, Mock<IUAuthClientBootstrapper> bootstrapper, Mock<ISessionCoordinator> coordinator)
18+
19+
CreateUAuthAppTestContext(UAuthState state, bool authenticated = true)
20+
{
21+
var ctx = new BunitContext();
22+
23+
var stateManager = new Mock<IUAuthStateManager>();
24+
stateManager.Setup(x => x.State).Returns(state);
25+
stateManager.Setup(x => x.EnsureAsync(It.IsAny<bool>()))
26+
.Returns(Task.CompletedTask);
27+
28+
var bootstrapper = new Mock<IUAuthClientBootstrapper>();
29+
bootstrapper.Setup(x => x.EnsureStartedAsync())
30+
.Returns(Task.CompletedTask);
31+
32+
var coordinator = new Mock<ISessionCoordinator>();
33+
coordinator.Setup(x => x.StartAsync()).Returns(Task.CompletedTask);
34+
coordinator.Setup(x => x.StopAsync()).Returns(Task.CompletedTask);
35+
36+
ctx.Services.AddSingleton(stateManager.Object);
37+
ctx.Services.AddSingleton(bootstrapper.Object);
38+
ctx.Services.AddSingleton(coordinator.Object);
39+
40+
var auth = ctx.AddAuthorization();
41+
if (authenticated)
42+
auth.SetAuthorized("test-user");
43+
else
44+
auth.SetNotAuthorized();
45+
46+
return (ctx, stateManager, bootstrapper, coordinator);
47+
}
48+
49+
[Fact]
50+
public async Task Should_Initialize_And_Bootstrap_On_First_Render()
51+
{
52+
var state = TestAuthState.Anonymous();
53+
var (ctx, stateManager, bootstrapper, _) = CreateUAuthAppTestContext(state);
54+
var cut = ctx.Render<UAuthApp>();
55+
await cut.InvokeAsync(() => Task.CompletedTask);
56+
57+
bootstrapper.Verify(x => x.EnsureStartedAsync(), Times.Once);
58+
stateManager.Verify(x => x.EnsureAsync(It.IsAny<bool>()), Times.AtLeastOnce);
59+
}
60+
61+
[Fact]
62+
public async Task Should_Start_Coordinator_When_Authenticated()
63+
{
64+
var state = TestAuthState.Authenticated();
65+
var (ctx, _, _, coordinator) = CreateUAuthAppTestContext(state);
66+
var cut = ctx.Render<UAuthApp>();
67+
await cut.InvokeAsync(() => Task.CompletedTask);
68+
69+
coordinator.Verify(x => x.StartAsync(), Times.Once);
70+
}
71+
72+
[Fact]
73+
public async Task Should_Stop_Coordinator_When_State_Cleared()
74+
{
75+
var state = TestAuthState.Authenticated();
76+
var (ctx, _, _, coordinator) = CreateUAuthAppTestContext(state);
77+
var cut = ctx.Render<UAuthApp>();
78+
state.Clear();
79+
await cut.InvokeAsync(() => Task.CompletedTask);
80+
81+
coordinator.Verify(x => x.StopAsync(), Times.Once);
82+
}
83+
84+
[Fact]
85+
public async Task Should_Stop_Coordinator_On_Dispose()
86+
{
87+
var state = TestAuthState.Authenticated();
88+
var (ctx, _, _, coordinator) = CreateUAuthAppTestContext(state);
89+
var cut = ctx.Render<UAuthApp>();
90+
await cut.Instance.DisposeAsync();
91+
92+
coordinator.Verify(x => x.StopAsync(), Times.Once);
93+
}
94+
95+
[Fact]
96+
public async Task Should_Call_Ensure_When_State_Is_Stale()
97+
{
98+
var state = TestAuthState.Authenticated();
99+
state.MarkStale();
100+
var (ctx, stateManager, _, _) = CreateUAuthAppTestContext(state);
101+
var cut = ctx.Render<UAuthApp>();
102+
await cut.InvokeAsync(() => Task.CompletedTask);
103+
104+
stateManager.Verify(x => x.EnsureAsync(true), Times.AtLeastOnce);
105+
}
106+
107+
[Fact]
108+
public async Task Should_Invoke_Callback_On_Reauth()
109+
{
110+
var state = TestAuthState.Authenticated();
111+
var (ctx, _, _, coordinator) = CreateUAuthAppTestContext(state);
112+
var called = false;
113+
var cut = ctx.Render<UAuthApp>(p => p.Add(x => x.OnReauthRequired, EventCallback.Factory.Create(this, () => called = true)));
114+
115+
await cut.InvokeAsync(() => Task.CompletedTask);
116+
coordinator.Raise(x => x.ReauthRequired += null);
117+
await cut.InvokeAsync(() => Task.CompletedTask);
118+
119+
called.Should().BeTrue();
120+
}
121+
}

0 commit comments

Comments
 (0)