Skip to content

Commit 38a41c7

Browse files
committed
Clarify external account lookup and test structure
1 parent 1f0fd38 commit 38a41c7

3 files changed

Lines changed: 29 additions & 10 deletions

File tree

‎src/Exceptionless.Core/Repositories/UserRepository.cs‎

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,17 +131,21 @@ public Task<bool> SetSavedViewOrdersAsync(User user, CommandOptionsDescriptor<Us
131131
provider = provider.ToLowerInvariant();
132132
var results = await FindAsync(q => q.FieldEquals(u => u.OAuthAccounts.First().ProviderUserId, providerUserId),
133133
o => o.SearchAfterPaging().PageLimit(100));
134-
User? owner = null;
134+
User? matchingUser = null;
135135
do
136136
{
137-
foreach (var user in results.Documents.Where(u => u.OAuthAccounts.Any(o => o.Provider == provider && o.ProviderUserId == providerUserId)))
137+
foreach (var user in results.Documents.Where(u => u.OAuthAccounts.Any(account =>
138+
String.Equals(account.Provider, provider, StringComparison.Ordinal) &&
139+
String.Equals(account.ProviderUserId, providerUserId, StringComparison.Ordinal))))
138140
{
139-
if (owner is not null)
141+
if (matchingUser is not null)
140142
throw new UnauthorizedAccessException("The external account is linked to multiple users.");
141-
owner = user;
143+
144+
matchingUser = user;
142145
}
143146
} while (await results.NextPageAsync());
144-
return owner;
147+
148+
return matchingUser;
145149
}
146150

147151
public async Task<User?> GetByVerifyEmailAddressTokenAsync(string token)

‎tests/Exceptionless.Tests/Api/Endpoints/AuthEndpointTests.cs‎

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2101,26 +2101,43 @@ await SendRequestAsync(request => request
21012101
[Fact]
21022102
public async Task GetUserByOAuthProviderAsync_DifferentAccountEntries_DoNotMatch()
21032103
{
2104+
// Arrange
21042105
var user = await _userRepository.GetByEmailAddressAsync(SampleDataService.TEST_USER_EMAIL);
21052106
Assert.NotNull(user);
21062107
user.AddOAuthAccount("google", "shared-subject", user.EmailAddress);
21072108
user.AddOAuthAccount("github", "other-subject", user.EmailAddress);
21082109
await _userRepository.SaveAsync(user, o => o.ImmediateConsistency());
2109-
Assert.Null(await _userRepository.GetUserByOAuthProviderAsync("github", "shared-subject"));
2110-
Assert.Equal(user.Id, (await _userRepository.GetUserByOAuthProviderAsync("google", "shared-subject"))!.Id);
2110+
2111+
// Act
2112+
var githubUser = await _userRepository.GetUserByOAuthProviderAsync("github", "shared-subject");
2113+
var googleUser = await _userRepository.GetUserByOAuthProviderAsync("google", "shared-subject");
2114+
2115+
// Assert
2116+
Assert.Null(githubUser);
2117+
Assert.NotNull(googleUser);
2118+
Assert.Equal(user.Id, googleUser.Id);
21112119
}
21122120

21132121
[Fact]
21142122
public async Task GetUserByOAuthProviderAsync_DuplicateIdentity_RejectsAmbiguousOwner()
21152123
{
2124+
// Arrange
21162125
foreach (string email in new[] { SampleDataService.TEST_USER_EMAIL, SampleDataService.TEST_ORG_USER_EMAIL })
21172126
{
21182127
var user = await _userRepository.GetByEmailAddressAsync(email);
21192128
Assert.NotNull(user);
21202129
user.AddOAuthAccount("github", "duplicate-subject", user.EmailAddress);
21212130
await _userRepository.SaveAsync(user, o => o.ImmediateConsistency());
21222131
}
2123-
await Assert.ThrowsAsync<UnauthorizedAccessException>(() => _userRepository.GetUserByOAuthProviderAsync("github", "duplicate-subject"));
2132+
2133+
// Act
2134+
var exception = await Record.ExceptionAsync(async () =>
2135+
{
2136+
_ = await _userRepository.GetUserByOAuthProviderAsync("github", "duplicate-subject");
2137+
});
2138+
2139+
// Assert
2140+
Assert.IsType<UnauthorizedAccessException>(exception);
21242141
}
21252142

21262143
private async Task AssertExternalLoginAsync(TokenResult? result, string providerName, string providerUserId)

‎tests/http/users.http‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
@email = admin@exceptionless.test
33
@password = tester
44

5-
# External sign-in returns 401 when the account is unavailable. Existing provider links identify their exact provider and subject.
6-
75
### login to test account
86
# @name login
97
POST {{apiUrl}}/auth/login

0 commit comments

Comments
 (0)