Files
HopFrame/tests/HopFrame.Tests.Api/Controllers/GroupControllerTests.cs

369 lines
16 KiB
C#

using System.Net;
using HopFrame.Api.Controller;
using HopFrame.Api.Logic;
using HopFrame.Database.Models;
using HopFrame.Database.Repositories;
using HopFrame.Security.Authorization;
using HopFrame.Security.Claims;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Moq;
namespace HopFrame.Tests.Api.Controllers;
public class GroupControllerTests {
private (Mock<IGroupLogic>, Mock<IOptions<AdminPermissionOptions>>, Mock<IPermissionRepository>, Mock<ITokenContext>
, GroupController) SetupEnvironment() {
var mockGroups = new Mock<IGroupLogic>();
var mockPermissions = new Mock<IOptions<AdminPermissionOptions>>();
var mockPerms = new Mock<IPermissionRepository>();
var mockContext = new Mock<ITokenContext>();
var options = new AdminPermissionOptions();
mockPermissions.Setup(o => o.Value).Returns(options);
mockPerms.Setup(p => p.HasPermission(It.IsAny<User>(), It.IsAny<string>())).ReturnsAsync(true);
var controller = new GroupController(mockPermissions.Object, mockPerms.Object, mockContext.Object,
mockGroups.Object);
return (mockGroups, mockPermissions, mockPerms, mockContext, controller);
}
[Fact]
public async Task GetGroups_ShouldReturnUnauthorized_WhenUserIsNotAuthorized() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockPerms.Setup(p => p.HasPermission(It.IsAny<User>(), It.IsAny<string>())).ReturnsAsync(false);
// Act
var result = await controller.GetGroups();
// Assert
Assert.IsType<UnauthorizedResult>(result.Result);
}
[Fact]
public async Task GetGroups_ShouldReturnGroups_WhenUserIsAuthorized() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
var groups = new List<PermissionGroup> { new PermissionGroup { Name = "testgroup" } };
mockGroups.Setup(g => g.GetGroups()).ReturnsAsync(LogicResult<IList<PermissionGroup>>.Ok(groups));
// Act
var result = await controller.GetGroups();
// Assert
var okResult = Assert.IsType<OkObjectResult>(result.Result);
var returnedGroups = Assert.IsAssignableFrom<IList<PermissionGroup>>(okResult.Value);
Assert.Single(returnedGroups);
Assert.Equal("testgroup", returnedGroups.First().Name);
}
[Fact]
public async Task GetDefaultGroups_ShouldReturnUnauthorized_WhenUserIsNotAuthorized() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockPerms.Setup(p => p.HasPermission(It.IsAny<User>(), It.IsAny<string>())).ReturnsAsync(false);
// Act
var result = await controller.GetDefaultGroups();
// Assert
Assert.IsType<UnauthorizedResult>(result.Result);
}
[Fact]
public async Task GetDefaultGroups_ShouldReturnGroups_WhenUserIsAuthorized() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
var groups = new List<PermissionGroup> { new PermissionGroup { Name = "defaultgroup" } };
mockGroups.Setup(g => g.GetDefaultGroups()).ReturnsAsync(LogicResult<IList<PermissionGroup>>.Ok(groups));
// Act
var result = await controller.GetDefaultGroups();
// Assert
var okResult = Assert.IsType<OkObjectResult>(result.Result);
var returnedGroups = Assert.IsAssignableFrom<IList<PermissionGroup>>(okResult.Value);
Assert.Single(returnedGroups);
Assert.Equal("defaultgroup", returnedGroups.First().Name);
}
[Fact]
public async Task GetUserGroups_ShouldReturnUnauthorized_WhenUserIsNotAuthorized() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockPerms.Setup(p => p.HasPermission(It.IsAny<User>(), It.IsAny<string>())).ReturnsAsync(false);
// Act
var result = await controller.GetUserGroups("valid-user-id");
// Assert
Assert.IsType<UnauthorizedResult>(result.Result);
}
[Fact]
public async Task GetUserGroups_ShouldReturnGroups_WhenUserIsAuthorized() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockPerms.Setup(p => p.HasPermission(It.IsAny<User>(), It.IsAny<string>())).ReturnsAsync(true);
var groups = new List<PermissionGroup> { new PermissionGroup { Name = "usergroup" } };
mockGroups.Setup(g => g.GetUserGroups(It.IsAny<string>()))
.ReturnsAsync(LogicResult<IList<PermissionGroup>>.Ok(groups));
// Act
var result = await controller.GetUserGroups("valid-user-id");
// Assert
var okResult = Assert.IsType<OkObjectResult>(result.Result);
var returnedGroups = Assert.IsAssignableFrom<IList<PermissionGroup>>(okResult.Value);
Assert.Single(returnedGroups);
Assert.Equal("usergroup", returnedGroups.First().Name);
}
[Fact]
public async Task GetGroup_ShouldReturnUnauthorized_WhenUserIsNotAuthorized() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockPerms.Setup(p => p.HasPermission(It.IsAny<User>(), It.IsAny<string>())).ReturnsAsync(false);
// Act
var result = await controller.GetGroup("group-name");
// Assert
Assert.IsType<UnauthorizedResult>(result.Result);
}
[Fact]
public async Task GetGroup_ShouldReturnGroup_WhenUserIsAuthorized() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockPerms.Setup(p => p.HasPermission(It.IsAny<User>(), It.IsAny<string>())).ReturnsAsync(true);
var group = new PermissionGroup { Name = "group-name" };
mockGroups.Setup(g => g.GetGroup(It.IsAny<string>())).ReturnsAsync(LogicResult<PermissionGroup>.Ok(group));
// Act
var result = await controller.GetGroup("group-name");
// Assert
var okResult = Assert.IsType<OkObjectResult>(result.Result);
var returnedGroup = Assert.IsType<PermissionGroup>(okResult.Value);
Assert.Equal("group-name", returnedGroup.Name);
}
[Fact]
public async Task CreateGroup_ShouldReturnUnauthorized_WhenUserIsNotAuthorized() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockPerms.Setup(p => p.HasPermission(It.IsAny<User>(), It.IsAny<string>())).ReturnsAsync(false);
// Act
var result = await controller.CreateGroup(new PermissionGroup { Name = "newgroup" });
// Assert
Assert.IsType<UnauthorizedResult>(result.Result);
}
[Fact]
public async Task CreateGroup_ShouldReturnGroup_WhenUserIsAuthorized() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockPerms.Setup(p => p.HasPermission(It.IsAny<User>(), It.IsAny<string>())).ReturnsAsync(true);
var group = new PermissionGroup { Name = "newgroup" };
mockGroups.Setup(g => g.CreateGroup(It.IsAny<PermissionGroup>()))
.ReturnsAsync(LogicResult<PermissionGroup>.Ok(group));
// Act
var result = await controller.CreateGroup(new PermissionGroup { Name = "newgroup" });
// Assert
var okResult = Assert.IsType<OkObjectResult>(result.Result);
var createdGroup = Assert.IsType<PermissionGroup>(okResult.Value);
Assert.Equal("newgroup", createdGroup.Name);
}
[Fact]
public async Task UpdateGroup_ShouldReturnUnauthorized_WhenUserIsNotAuthorized() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockPerms.Setup(p => p.HasPermission(It.IsAny<User>(), It.IsAny<string>())).ReturnsAsync(false);
// Act
var result = await controller.UpdateGroup(new PermissionGroup { Name = "updategroup" });
// Assert
Assert.IsType<UnauthorizedResult>(result.Result);
}
[Fact]
public async Task UpdateGroup_ShouldReturnGroup_WhenUserIsAuthorized() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockPerms.Setup(p => p.HasPermission(It.IsAny<User>(), It.IsAny<string>())).ReturnsAsync(true);
var group = new PermissionGroup { Name = "updategroup" };
mockGroups.Setup(g => g.UpdateGroup(It.IsAny<PermissionGroup>()))
.ReturnsAsync(LogicResult<PermissionGroup>.Ok(group));
// Act
var result = await controller.UpdateGroup(new PermissionGroup { Name = "updategroup" });
// Assert
var okResult = Assert.IsType<OkObjectResult>(result.Result);
var updatedGroup = Assert.IsType<PermissionGroup>(okResult.Value);
Assert.Equal("updategroup", updatedGroup.Name);
}
[Fact]
public async Task DeleteGroup_ShouldReturnUnauthorized_WhenUserIsNotAuthorized() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockPerms.Setup(p => p.HasPermission(It.IsAny<User>(), It.IsAny<string>())).ReturnsAsync(false);
// Act
var result = await controller.DeleteGroup("group-name");
// Assert
Assert.IsType<UnauthorizedResult>(result);
}
[Fact]
public async Task DeleteGroup_ShouldReturnOk_WhenUserIsAuthorized() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockPerms.Setup(p => p.HasPermission(It.IsAny<User>(), It.IsAny<string>())).ReturnsAsync(true);
mockGroups.Setup(g => g.DeleteGroup(It.IsAny<string>())).ReturnsAsync(LogicResult.Ok());
// Act
var result = await controller.DeleteGroup("group-name");
// Assert
Assert.IsType<OkResult>(result);
}
[Fact]
public async Task GetUserGroups_ShouldReturnBadRequest_WhenUserIdIsInvalid() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockGroups.Setup(g => g.GetUserGroups(It.IsAny<string>()))
.ReturnsAsync(LogicResult<IList<PermissionGroup>>.BadRequest("Invalid user id"));
// Act
var result = await controller.GetUserGroups("invalid-user-id");
// Assert
var badRequestResult = Assert.IsType<ObjectResult>(result.Result);
Assert.Equal((int)HttpStatusCode.BadRequest, badRequestResult.StatusCode);
Assert.Equal("Invalid user id", badRequestResult.Value);
}
[Fact]
public async Task GetUserGroups_ShouldReturnNotFound_WhenUserDoesNotExist() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockGroups.Setup(g => g.GetUserGroups(It.IsAny<string>()))
.ReturnsAsync(LogicResult<IList<PermissionGroup>>.NotFound("That user does not exist"));
// Act
var result = await controller.GetUserGroups("nonexistent-user-id");
// Assert
var notFoundResult = Assert.IsType<ObjectResult>(result.Result);
Assert.Equal((int)HttpStatusCode.NotFound, notFoundResult.StatusCode);
Assert.Equal("That user does not exist", notFoundResult.Value);
}
[Fact]
public async Task GetGroup_ShouldReturnNotFound_WhenGroupDoesNotExist() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockGroups.Setup(g => g.GetGroup(It.IsAny<string>()))
.ReturnsAsync(LogicResult<PermissionGroup>.NotFound("That group does not exist"));
// Act
var result = await controller.GetGroup("nonexistent-group-name");
// Assert
var notFoundResult = Assert.IsType<ObjectResult>(result.Result);
Assert.Equal((int)HttpStatusCode.NotFound, notFoundResult.StatusCode);
Assert.Equal("That group does not exist", notFoundResult.Value);
}
[Fact]
public async Task CreateGroup_ShouldReturnBadRequest_WhenGroupIsNull() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockGroups.Setup(g => g.CreateGroup(It.IsAny<PermissionGroup>()))
.ReturnsAsync(LogicResult<PermissionGroup>.BadRequest("Provide a group"));
// Act
var result = await controller.CreateGroup(null);
// Assert
var badRequestResult = Assert.IsType<ObjectResult>(result.Result);
Assert.Equal((int)HttpStatusCode.BadRequest, badRequestResult.StatusCode);
Assert.Equal("Provide a group", badRequestResult.Value);
}
[Fact]
public async Task CreateGroup_ShouldReturnBadRequest_WhenGroupNameIsInvalid() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockGroups.Setup(g => g.CreateGroup(It.IsAny<PermissionGroup>()))
.ReturnsAsync(LogicResult<PermissionGroup>.BadRequest("Group names must start with 'group.'"));
// Act
var result = await controller.CreateGroup(new PermissionGroup { Name = "invalidgroupname" });
// Assert
var badRequestResult = Assert.IsType<ObjectResult>(result.Result);
Assert.Equal((int)HttpStatusCode.BadRequest, badRequestResult.StatusCode);
Assert.Equal("Group names must start with 'group.'", badRequestResult.Value);
}
[Fact]
public async Task CreateGroup_ShouldReturnConflict_WhenGroupAlreadyExists() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockGroups.Setup(g => g.CreateGroup(It.IsAny<PermissionGroup>()))
.ReturnsAsync(LogicResult<PermissionGroup>.Conflict("That group already exists"));
// Act
var result = await controller.CreateGroup(new PermissionGroup { Name = "group.exists" });
// Assert
var conflictResult = Assert.IsType<ObjectResult>(result.Result);
Assert.Equal((int)HttpStatusCode.Conflict, conflictResult.StatusCode);
Assert.Equal("That group already exists", conflictResult.Value);
}
[Fact]
public async Task UpdateGroup_ShouldReturnNotFound_WhenGroupDoesNotExist() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockGroups.Setup(g => g.UpdateGroup(It.IsAny<PermissionGroup>())).ReturnsAsync(LogicResult<PermissionGroup>.NotFound("That group does not exist"));
// Act
var result = await controller.UpdateGroup(new PermissionGroup { Name = "nonexistent-group-name" });
// Assert
var notFoundResult = Assert.IsType<ObjectResult>(result.Result);
Assert.Equal((int)HttpStatusCode.NotFound, notFoundResult.StatusCode);
Assert.Equal("That group does not exist", notFoundResult.Value);
}
[Fact]
public async Task DeleteGroup_ShouldReturnNotFound_WhenGroupDoesNotExist() {
// Arrange
var (mockGroups, mockPermissions, mockPerms, mockContext, controller) = SetupEnvironment();
mockGroups.Setup(g => g.DeleteGroup(It.IsAny<string>())).ReturnsAsync(LogicResult.NotFound("That group does not exist"));
// Act
var result = await controller.DeleteGroup("nonexistent-group-name");
// Assert
var notFoundResult = Assert.IsType<ObjectResult>(result);
Assert.Equal((int)HttpStatusCode.NotFound, notFoundResult.StatusCode);
Assert.Equal("That group does not exist", notFoundResult.Value);
}
}