elsa-core/test/unit/Elsa.Identity.UnitTests/Services/CredentiallessUserTests.cs
2026-07-24 19:04:26 +02:00

55 lines
1.8 KiB
C#

using Elsa.Extensions;
using Elsa.Identity.Contracts;
using Elsa.Identity.Entities;
using Elsa.Identity.Models;
using Elsa.Identity.Services;
namespace Elsa.Identity.UnitTests.Services;
public class CredentiallessUserTests
{
[Fact(DisplayName = "Existing local-password users remain able to authenticate")]
public async Task ExistingLocalPasswordUserCanAuthenticate()
{
var hasher = new DefaultSecretHasher();
var password = hasher.HashSecret("correct-password");
var user = new User
{
Id = "local-user",
Name = "local-user",
HashedPassword = password.EncodeSecret(),
HashedPasswordSalt = password.EncodeSalt()
};
var validator = new DefaultUserCredentialsValidator(new StaticUserProvider(user), hasher);
var result = await validator.ValidateAsync(user.Name, "correct-password");
Assert.Same(user, result);
}
[Fact(DisplayName = "Credential-less users cannot authenticate with a local password")]
public async Task CredentiallessUserCannotAuthenticateLocally()
{
var user = new User
{
Id = "external-user",
Name = "external-user",
HashedPassword = null,
HashedPasswordSalt = null
};
var validator = new DefaultUserCredentialsValidator(new StaticUserProvider(user), new DefaultSecretHasher());
var result = await validator.ValidateAsync(user.Name, "any-password");
Assert.Null(result);
}
private sealed class StaticUserProvider(User user) : IUserProvider
{
public Task<User?> FindAsync(UserFilter filter, CancellationToken cancellationToken = default)
{
return Task.FromResult<User?>(filter.Name == user.Name ? user : null);
}
}
}