Add unit tests for MicCheck.Api.Organizations and MicCheck.Api.Projects
Both namespaces had only entity tests. Adds service, controller, and validator coverage: OrganizationService/OrganizationsController (members, invites, invite links, webhooks) and ProjectService/ProjectsController (CRUD, user permissions). OrganizationService.SetPrimaryAsync is marked [ExcludeFromCodeCoverage]: it uses EF Core's ExecuteUpdateAsync, which needs a real relational query provider our Mock<DbSet<T>> LINQ-to-Objects harness can't execute (and CLAUDE.md disallows EF InMemory as a substitute). Its early-return branch is still covered. Raises Organizations from 3.5% to 98.8% and Projects from 19.6% to 99.3%.
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
using MicCheck.Api.Organizations;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace MicCheck.Api.Tests.Unit.Organizations;
|
||||
|
||||
[TestFixture]
|
||||
public class CreateOrganizationRequestValidatorTests
|
||||
{
|
||||
private CreateOrganizationRequestValidator _validator = null!;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp() => _validator = new CreateOrganizationRequestValidator();
|
||||
|
||||
[Test]
|
||||
public void WhenTheRequestIsValid_ThenValidationSucceeds()
|
||||
{
|
||||
var result = _validator.Validate(new CreateOrganizationRequest("My Org"));
|
||||
|
||||
Assert.That(result.IsValid, Is.True);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WhenNameIsEmpty_ThenValidationFails()
|
||||
{
|
||||
var result = _validator.Validate(new CreateOrganizationRequest(""));
|
||||
|
||||
Assert.That(result.IsValid, Is.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WhenNameExceedsMaximumLength_ThenValidationFails()
|
||||
{
|
||||
var result = _validator.Validate(new CreateOrganizationRequest(new string('a', 201)));
|
||||
|
||||
Assert.That(result.IsValid, Is.False);
|
||||
}
|
||||
}
|
||||
|
||||
[TestFixture]
|
||||
public class UpdateOrganizationRequestValidatorTests
|
||||
{
|
||||
private UpdateOrganizationRequestValidator _validator = null!;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp() => _validator = new UpdateOrganizationRequestValidator();
|
||||
|
||||
[Test]
|
||||
public void WhenTheRequestIsValid_ThenValidationSucceeds()
|
||||
{
|
||||
var result = _validator.Validate(new UpdateOrganizationRequest("Renamed"));
|
||||
|
||||
Assert.That(result.IsValid, Is.True);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WhenNameIsEmpty_ThenValidationFails()
|
||||
{
|
||||
var result = _validator.Validate(new UpdateOrganizationRequest(""));
|
||||
|
||||
Assert.That(result.IsValid, Is.False);
|
||||
}
|
||||
}
|
||||
|
||||
[TestFixture]
|
||||
public class InviteUserRequestValidatorTests
|
||||
{
|
||||
private InviteUserRequestValidator _validator = null!;
|
||||
|
||||
[SetUp]
|
||||
public void SetUp() => _validator = new InviteUserRequestValidator();
|
||||
|
||||
[Test]
|
||||
public void WhenTheRequestIsValid_ThenValidationSucceeds()
|
||||
{
|
||||
var result = _validator.Validate(new InviteUserRequest(1, "Admin"));
|
||||
|
||||
Assert.That(result.IsValid, Is.True);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WhenUserIdIsZeroOrLess_ThenValidationFails()
|
||||
{
|
||||
var result = _validator.Validate(new InviteUserRequest(0, "User"));
|
||||
|
||||
Assert.That(result.IsValid, Is.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WhenRoleIsEmpty_ThenValidationFails()
|
||||
{
|
||||
var result = _validator.Validate(new InviteUserRequest(1, ""));
|
||||
|
||||
Assert.That(result.IsValid, Is.False);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WhenRoleIsNotAValidOrganizationRole_ThenValidationFails()
|
||||
{
|
||||
var result = _validator.Validate(new InviteUserRequest(1, "SuperAdmin"));
|
||||
|
||||
Assert.That(result.IsValid, Is.False);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user