Refactor return type to include user ID

This commit is contained in:
Sven
2026-01-26 15:36:37 -06:00
parent 502e3d9c66
commit b36f775f3b
3 changed files with 24 additions and 18 deletions

View File

@@ -21,11 +21,11 @@ public interface IPolicyRequirementQuery
/// The policy requirement represents how one or more policy types should be enforced against the users.
/// </summary>
/// <returns>
/// A list of applicable policy requirements in corresponding order of the submitted user IDs.
/// A collection of tuples pairing each user ID with their corresponding policy requirement.
/// </returns>
/// <param name="userIds">The users that you need to enforce the policy against.</param>
/// <typeparam name="T">The IPolicyRequirement that corresponds to the policy you want to enforce.</typeparam>
Task<IEnumerable<T>> GetAsync<T>(IEnumerable<Guid> userIds) where T : IPolicyRequirement;
Task<IEnumerable<(Guid UserId, T Requirement)>> GetAsync<T>(IEnumerable<Guid> userIds) where T : IPolicyRequirement;
/// <summary>
/// Get all organization user IDs within an organization that are affected by a given policy type.

View File

@@ -11,9 +11,9 @@ public class PolicyRequirementQuery(
: IPolicyRequirementQuery
{
public async Task<T> GetAsync<T>(Guid userId) where T : IPolicyRequirement
=> (await GetAsync<T>([userId])).Single();
=> (await GetAsync<T>([userId])).Single().Requirement;
public async Task<IEnumerable<T>> GetAsync<T>(IEnumerable<Guid> userIds) where T : IPolicyRequirement
public async Task<IEnumerable<(Guid UserId, T Requirement)>> GetAsync<T>(IEnumerable<Guid> userIds) where T : IPolicyRequirement
{
var factory = factories.OfType<IPolicyRequirementFactory<T>>().SingleOrDefault();
if (factory is null)
@@ -27,7 +27,7 @@ public class PolicyRequirementQuery(
.Where(factory.Enforce)
.ToLookup(l => l.UserId);
var policyRequirements = userIdList.Select(u => factory.Create(policyDetailsByUser[u]));
var policyRequirements = userIdList.Select(u => (u, factory.Create(policyDetailsByUser[u])));
return policyRequirements;
}

View File

@@ -83,10 +83,12 @@ public class PolicyRequirementQueryTests
var requirements = (await sut.GetAsync<TestPolicyRequirement>([userIdA, userIdB])).ToList();
Assert.Equal(2, requirements.Count);
Assert.Contains(policyA, requirements[0].Policies);
Assert.DoesNotContain(policyB, requirements[0].Policies);
Assert.Contains(policyB, requirements[1].Policies);
Assert.DoesNotContain(policyA, requirements[1].Policies);
Assert.Equal(userIdA, requirements[0].UserId);
Assert.Equal(userIdB, requirements[1].UserId);
Assert.Contains(policyA, requirements[0].Requirement.Policies);
Assert.DoesNotContain(policyB, requirements[0].Requirement.Policies);
Assert.Contains(policyB, requirements[1].Requirement.Policies);
Assert.DoesNotContain(policyA, requirements[1].Requirement.Policies);
}
[Theory, BitAutoData]
@@ -107,8 +109,8 @@ public class PolicyRequirementQueryTests
var requirements = (await sut.GetAsync<TestPolicyRequirement>([userIdA, userIdB])).ToList();
Assert.Contains(policyA, requirements[0].Policies);
Assert.Empty(requirements[1].Policies);
Assert.Contains(policyA, requirements[0].Requirement.Policies);
Assert.Empty(requirements[1].Requirement.Policies);
callback.Received()(Arg.Is(policyA));
callback.Received()(Arg.Is(policyB));
}
@@ -134,9 +136,9 @@ public class PolicyRequirementQueryTests
var requirements = (await sut.GetAsync<TestPolicyRequirement>([userIdA, userIdB])).ToList();
Assert.Equal(2, requirements.Count);
Assert.Contains(enforcedPolicyA, requirements[0].Policies);
Assert.DoesNotContain(notEnforcedPolicyA, requirements[0].Policies);
Assert.Contains(enforcedPolicyB, requirements[1].Policies);
Assert.Contains(enforcedPolicyA, requirements[0].Requirement.Policies);
Assert.DoesNotContain(notEnforcedPolicyA, requirements[0].Requirement.Policies);
Assert.Contains(enforcedPolicyB, requirements[1].Requirement.Policies);
}
[Theory, BitAutoData]
@@ -164,8 +166,10 @@ public class PolicyRequirementQueryTests
var requirements = (await sut.GetAsync<TestPolicyRequirement>([userIdA, userIdB])).ToList();
Assert.Equal(2, requirements.Count);
Assert.Empty(requirements[0].Policies);
Assert.Empty(requirements[1].Policies);
Assert.Equal(userIdA, requirements[0].UserId);
Assert.Equal(userIdB, requirements[1].UserId);
Assert.Empty(requirements[0].Requirement.Policies);
Assert.Empty(requirements[1].Requirement.Policies);
}
[Theory, BitAutoData]
@@ -185,8 +189,10 @@ public class PolicyRequirementQueryTests
var requirements = (await sut.GetAsync<TestPolicyRequirement>([userIdA, userIdB])).ToList();
Assert.Equal(2, requirements.Count);
Assert.Contains(policyA, requirements[0].Policies);
Assert.Empty(requirements[1].Policies);
Assert.Equal(userIdA, requirements[0].UserId);
Assert.Equal(userIdB, requirements[1].UserId);
Assert.Contains(policyA, requirements[0].Requirement.Policies);
Assert.Empty(requirements[1].Requirement.Policies);
}
[Theory, BitAutoData]