mirror of
https://github.com/bitwarden/server
synced 2025-12-06 00:03:34 +00:00
* PM-23754 initial commit * pm-23754 fixing controller tests * pm-23754 adding commands and queries * pm-23754 adding endpoints, command/queries, repositories, and sql migrations * pm-23754 add new sql scripts * PM-23754 adding sql scripts * pm-23754 * PM-23754 fixing migration script * PM-23754 fixing migration script again * PM-23754 fixing migration script validation * PM-23754 fixing db validation script issue * PM-23754 fixing endpoint and db validation * PM-23754 fixing unit tests * PM-23754 fixing implementation based on comments and tests * PM-23754 updating logging statements * PM-23754 making changes based on PR comments. * updating migration scripts * removing old migration files * update code based testing for whole data object for OrganizationReport and add a stored procedure. * updating services, unit tests, repository tests * fixing unit tests * fixing migration script * fixing migration script again * fixing migration script * another fix * fixing sql file, updating controller to account for different orgIds in the url and body. * updating error message in controllers without a body * making a change to the command * Refactor ReportsController by removing organization reports The IDropOrganizationReportCommand is no longer needed * will code based on PR comments. * fixing unit test * fixing migration script based on last changes. * adding another check in endpoint and adding unit tests * fixing route parameter. * PM-23754 updating data fields to return just the column * PM-23754 fixing repository method signatures * PM-23754 making change to orgId parameter through out code to align with api naming --------- Co-authored-by: Tom <144813356+ttalty@users.noreply.github.com>
146 lines
5.5 KiB
C#
146 lines
5.5 KiB
C#
using AutoFixture;
|
|
using Bit.Api.Dirt.Controllers;
|
|
using Bit.Api.Dirt.Models;
|
|
using Bit.Core.Context;
|
|
using Bit.Core.Dirt.Reports.ReportFeatures.Interfaces;
|
|
using Bit.Core.Dirt.Reports.ReportFeatures.Requests;
|
|
using Bit.Core.Exceptions;
|
|
using Bit.Test.Common.AutoFixture;
|
|
using Bit.Test.Common.AutoFixture.Attributes;
|
|
using NSubstitute;
|
|
using Xunit;
|
|
|
|
namespace Bit.Api.Test.Dirt;
|
|
|
|
|
|
[ControllerCustomize(typeof(ReportsController))]
|
|
[SutProviderCustomize]
|
|
public class ReportsControllerTests
|
|
{
|
|
[Theory, BitAutoData]
|
|
public async Task GetPasswordHealthReportApplicationAsync_Success(SutProvider<ReportsController> sutProvider)
|
|
{
|
|
// Arrange
|
|
sutProvider.GetDependency<ICurrentContext>().AccessReports(Arg.Any<Guid>()).Returns(true);
|
|
|
|
// Act
|
|
var orgId = Guid.NewGuid();
|
|
var result = await sutProvider.Sut.GetPasswordHealthReportApplications(orgId);
|
|
|
|
// Assert
|
|
_ = sutProvider.GetDependency<IGetPasswordHealthReportApplicationQuery>()
|
|
.Received(1)
|
|
.GetPasswordHealthReportApplicationAsync(Arg.Is<Guid>(_ => _ == orgId));
|
|
}
|
|
|
|
[Theory, BitAutoData]
|
|
public async Task GetPasswordHealthReportApplicationAsync_withoutAccess(SutProvider<ReportsController> sutProvider)
|
|
{
|
|
// Arrange
|
|
sutProvider.GetDependency<ICurrentContext>().AccessReports(Arg.Any<Guid>()).Returns(false);
|
|
|
|
// Act & Assert
|
|
var orgId = Guid.NewGuid();
|
|
await Assert.ThrowsAsync<NotFoundException>(async () => await sutProvider.Sut.GetPasswordHealthReportApplications(orgId));
|
|
|
|
// Assert
|
|
_ = sutProvider.GetDependency<IGetPasswordHealthReportApplicationQuery>()
|
|
.Received(0);
|
|
}
|
|
|
|
[Theory, BitAutoData]
|
|
public async Task AddPasswordHealthReportApplicationAsync_withAccess_success(SutProvider<ReportsController> sutProvider)
|
|
{
|
|
// Arrange
|
|
sutProvider.GetDependency<ICurrentContext>().AccessReports(Arg.Any<Guid>()).Returns(true);
|
|
|
|
// Act
|
|
var request = new PasswordHealthReportApplicationModel
|
|
{
|
|
OrganizationId = Guid.NewGuid(),
|
|
Url = "https://example.com",
|
|
};
|
|
await sutProvider.Sut.AddPasswordHealthReportApplication(request);
|
|
|
|
// Assert
|
|
_ = sutProvider.GetDependency<IAddPasswordHealthReportApplicationCommand>()
|
|
.Received(1)
|
|
.AddPasswordHealthReportApplicationAsync(Arg.Is<AddPasswordHealthReportApplicationRequest>(_ =>
|
|
_.OrganizationId == request.OrganizationId && _.Url == request.Url));
|
|
}
|
|
|
|
[Theory, BitAutoData]
|
|
public async Task AddPasswordHealthReportApplicationAsync_multiple_withAccess_success(
|
|
SutProvider<ReportsController> sutProvider)
|
|
{
|
|
// Arrange
|
|
sutProvider.GetDependency<ICurrentContext>().AccessReports(Arg.Any<Guid>()).Returns(true);
|
|
|
|
// Act
|
|
var fixture = new Fixture();
|
|
var request = fixture.CreateMany<PasswordHealthReportApplicationModel>(2);
|
|
await sutProvider.Sut.AddPasswordHealthReportApplications(request);
|
|
|
|
// Assert
|
|
_ = sutProvider.GetDependency<IAddPasswordHealthReportApplicationCommand>()
|
|
.Received(1)
|
|
.AddPasswordHealthReportApplicationAsync(Arg.Any<IEnumerable<AddPasswordHealthReportApplicationRequest>>());
|
|
}
|
|
|
|
[Theory, BitAutoData]
|
|
public async Task AddPasswordHealthReportApplicationAsync_withoutAccess(SutProvider<ReportsController> sutProvider)
|
|
{
|
|
// Arrange
|
|
sutProvider.GetDependency<ICurrentContext>().AccessReports(Arg.Any<Guid>()).Returns(false);
|
|
|
|
// Act
|
|
var request = new PasswordHealthReportApplicationModel
|
|
{
|
|
OrganizationId = Guid.NewGuid(),
|
|
Url = "https://example.com",
|
|
};
|
|
await Assert.ThrowsAsync<NotFoundException>(async () =>
|
|
await sutProvider.Sut.AddPasswordHealthReportApplication(request));
|
|
|
|
// Assert
|
|
_ = sutProvider.GetDependency<IAddPasswordHealthReportApplicationCommand>()
|
|
.Received(0);
|
|
}
|
|
|
|
[Theory, BitAutoData]
|
|
public async Task DropPasswordHealthReportApplicationAsync_withoutAccess(SutProvider<ReportsController> sutProvider)
|
|
{
|
|
// Arrange
|
|
sutProvider.GetDependency<ICurrentContext>().AccessReports(Arg.Any<Guid>()).Returns(false);
|
|
|
|
// Act
|
|
var fixture = new Fixture();
|
|
var request = fixture.Create<PasswordHealthReportApplicationModel>();
|
|
await Assert.ThrowsAsync<NotFoundException>(async () =>
|
|
await sutProvider.Sut.AddPasswordHealthReportApplication(request));
|
|
|
|
// Assert
|
|
_ = sutProvider.GetDependency<IDropPasswordHealthReportApplicationCommand>()
|
|
.Received(0);
|
|
}
|
|
|
|
[Theory, BitAutoData]
|
|
public async Task DropPasswordHealthReportApplicationAsync_withAccess_success(SutProvider<ReportsController> sutProvider)
|
|
{
|
|
// Arrange
|
|
sutProvider.GetDependency<ICurrentContext>().AccessReports(Arg.Any<Guid>()).Returns(true);
|
|
|
|
// Act
|
|
var fixture = new Fixture();
|
|
var request = fixture.Create<DropPasswordHealthReportApplicationRequest>();
|
|
await sutProvider.Sut.DropPasswordHealthReportApplication(request);
|
|
|
|
// Assert
|
|
_ = sutProvider.GetDependency<IDropPasswordHealthReportApplicationCommand>()
|
|
.Received(1)
|
|
.DropPasswordHealthReportApplicationAsync(Arg.Is<DropPasswordHealthReportApplicationRequest>(_ =>
|
|
_.OrganizationId == request.OrganizationId &&
|
|
_.PasswordHealthReportApplicationIds == request.PasswordHealthReportApplicationIds));
|
|
}
|
|
}
|