< Summary

Information
Class: Elsa.Identity.Services.UserManager
Assembly: Elsa.Identity
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Identity/Services/UserManager.cs
Line coverage
100%
Covered lines: 24
Uncovered lines: 0
Coverable lines: 24
Total lines: 48
Line coverage: 100%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
CreateUserAsync()100%44100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Identity/Services/UserManager.cs

#LineLine coverage
 1using Elsa.Common.Multitenancy;
 2using Elsa.Identity.Contracts;
 3using Elsa.Identity.Entities;
 4using Elsa.Identity.Models;
 5using Elsa.Workflows;
 6
 7namespace Elsa.Identity.Services;
 8
 9/// <summary>
 10/// Default implementation of <see cref="IUserManager"/>.
 11/// </summary>
 712public class UserManager(
 713    IIdentityGenerator identityGenerator,
 714    ISecretGenerator secretGenerator,
 715    ISecretHasher secretHasher,
 716    IUserStore userStore,
 717    ITenantAccessor tenantAccessor)
 18    : IUserManager
 19{
 20    /// <inheritdoc />
 21    public async Task<CreateUserResult> CreateUserAsync(
 22        string name,
 23        string? password = null,
 24        ICollection<string>? roles = null,
 25        CancellationToken cancellationToken = default)
 26    {
 427        var id = identityGenerator.GenerateId();
 428        var isPasswordGenerated = string.IsNullOrWhiteSpace(password);
 429        var plainTextPassword = isPasswordGenerated ? secretGenerator.Generate() : password!.Trim();
 430        var hashedPassword = secretHasher.HashSecret(plainTextPassword);
 31
 432        var user = new User
 433        {
 434            Id = id,
 435            Name = name,
 436            // Set explicitly rather than relying on the Entity Framework saving handler, which does not run
 437            // on the in-memory path and left users unassigned there.
 438            TenantId = tenantAccessor.TenantId,
 439            Roles = roles ?? new List<string>(),
 440            HashedPassword = hashedPassword.EncodeSecret(),
 441            HashedPasswordSalt = hashedPassword.EncodeSalt()
 442        };
 43
 444        await userStore.SaveAsync(user, cancellationToken);
 45
 446        return new CreateUserResult(user, plainTextPassword, isPasswordGenerated);
 447    }
 48}