mirror of
https://github.com/bitwarden/server.git
synced 2025-06-25 13:18:48 -05:00

* PM-20574 fixing namespaces on reporting work that got moved over from tools * PM-20574 adding tables, stored procedures, and migration files * PM-20574 adding dapper and ef repos and migrations * PM-20574 changing table and repo names as requested * PM-20574 updating sql scripts to new names * PM-20574 updating sql scripts * PM-20574 updating migration script for org delete by id * PM-20574 adding mysql migration * PM-20574 updating sql migration to fix database test * PM-20574 fixing migration script * PM-20574 fixing migration script * PM-20574 fixing table scripts * PM-20574 fixing table scripts * PM-20574 fixing migration script formatting * PM-20574 fixing syntax in migration script * PM-20574 fixing file names and extensions * PM-20574 fixing sql file * PM-20574 fixing sql * PM-20574 fixing directory for entities and removing scripts from other databases * PM-20574 generating new migration scripts * PM-20574 fixed reference to a stored proc * PM-20574 adding index in scripts and missing table * PM-20574 fixing merge conflicts * PM-20574 set OUTPUT param for Id property in create and update proc * PM-20574 add CreateDate to the update proc * PM-20574 amend update proc for OrganizationApplication by adding createDate * PM-20576 Created OrganizationReportRepo and unit tests * PM-20576 Commands and Query for OrganizationReport * PM-20576 added additional unit tests to fix CodeCoverage report * PM-20574 formatted sql and updated as per PR comments * PM-20574 updated script to fix build error * PM-20574 fixed inconsistency in db script * PM-20577 organization-reports endpoints * PM-20574 removed revisionDate, update procedures and used views * PM-20574 removed RevisionDate from designer files * PM-20574 removed revisionDate column that was missed previously * PM-20574 added revision date back into the mix * PM-20574 updated database script to fix build error * PM-20574 fixed a procedure issue * PM-20574 fix dB build error * PM-020574 fixed additional PR comments - files cleaned up * PM-20574 updated procedure was inconsistent * PM-20576 added logs and updated errors as per PR comments * PM-20576 fixed a build error * PM-20576 removed RevisionDate from Repo and tests * PM-20576 added dependency * PM-20576 removed unwanted line from csproj file --------- Co-authored-by: Graham Walker <gwalker@bitwarden.com> Co-authored-by: Tom <144813356+ttalty@users.noreply.github.com>
284 lines
11 KiB
C#
284 lines
11 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));
|
|
}
|
|
|
|
[Theory, BitAutoData]
|
|
public async Task AddOrganizationReportAsync_withAccess_success(SutProvider<ReportsController> sutProvider)
|
|
{
|
|
// Arrange
|
|
sutProvider.GetDependency<ICurrentContext>().AccessReports(Arg.Any<Guid>()).Returns(true);
|
|
|
|
// Act
|
|
var request = new AddOrganizationReportRequest
|
|
{
|
|
OrganizationId = Guid.NewGuid(),
|
|
ReportData = "Report Data",
|
|
Date = DateTime.UtcNow
|
|
};
|
|
await sutProvider.Sut.AddOrganizationReport(request);
|
|
|
|
// Assert
|
|
_ = sutProvider.GetDependency<IAddOrganizationReportCommand>()
|
|
.Received(1)
|
|
.AddOrganizationReportAsync(Arg.Is<AddOrganizationReportRequest>(_ =>
|
|
_.OrganizationId == request.OrganizationId &&
|
|
_.ReportData == request.ReportData &&
|
|
_.Date == request.Date));
|
|
}
|
|
|
|
[Theory, BitAutoData]
|
|
public async Task AddOrganizationReportAsync_withoutAccess(SutProvider<ReportsController> sutProvider)
|
|
{
|
|
// Arrange
|
|
sutProvider.GetDependency<ICurrentContext>().AccessReports(Arg.Any<Guid>()).Returns(false);
|
|
// Act
|
|
var request = new AddOrganizationReportRequest
|
|
{
|
|
OrganizationId = Guid.NewGuid(),
|
|
ReportData = "Report Data",
|
|
Date = DateTime.UtcNow
|
|
};
|
|
await Assert.ThrowsAsync<NotFoundException>(async () =>
|
|
await sutProvider.Sut.AddOrganizationReport(request));
|
|
// Assert
|
|
_ = sutProvider.GetDependency<IAddOrganizationReportCommand>()
|
|
.Received(0);
|
|
}
|
|
|
|
[Theory, BitAutoData]
|
|
public async Task DropOrganizationReportAsync_withAccess_success(SutProvider<ReportsController> sutProvider)
|
|
{
|
|
// Arrange
|
|
sutProvider.GetDependency<ICurrentContext>().AccessReports(Arg.Any<Guid>()).Returns(true);
|
|
// Act
|
|
var request = new DropOrganizationReportRequest
|
|
{
|
|
OrganizationId = Guid.NewGuid(),
|
|
OrganizationReportIds = new List<Guid> { Guid.NewGuid(), Guid.NewGuid() }
|
|
};
|
|
await sutProvider.Sut.DropOrganizationReport(request);
|
|
// Assert
|
|
_ = sutProvider.GetDependency<IDropOrganizationReportCommand>()
|
|
.Received(1)
|
|
.DropOrganizationReportAsync(Arg.Is<DropOrganizationReportRequest>(_ =>
|
|
_.OrganizationId == request.OrganizationId &&
|
|
_.OrganizationReportIds.SequenceEqual(request.OrganizationReportIds)));
|
|
}
|
|
[Theory, BitAutoData]
|
|
public async Task DropOrganizationReportAsync_withoutAccess(SutProvider<ReportsController> sutProvider)
|
|
{
|
|
// Arrange
|
|
sutProvider.GetDependency<ICurrentContext>().AccessReports(Arg.Any<Guid>()).Returns(false);
|
|
// Act
|
|
var request = new DropOrganizationReportRequest
|
|
{
|
|
OrganizationId = Guid.NewGuid(),
|
|
OrganizationReportIds = new List<Guid> { Guid.NewGuid(), Guid.NewGuid() }
|
|
};
|
|
await Assert.ThrowsAsync<NotFoundException>(async () =>
|
|
await sutProvider.Sut.DropOrganizationReport(request));
|
|
// Assert
|
|
_ = sutProvider.GetDependency<IDropOrganizationReportCommand>()
|
|
.Received(0);
|
|
}
|
|
[Theory, BitAutoData]
|
|
public async Task GetOrganizationReportAsync_withAccess_success(SutProvider<ReportsController> sutProvider)
|
|
{
|
|
// Arrange
|
|
sutProvider.GetDependency<ICurrentContext>().AccessReports(Arg.Any<Guid>()).Returns(true);
|
|
// Act
|
|
var orgId = Guid.NewGuid();
|
|
var result = await sutProvider.Sut.GetOrganizationReports(orgId);
|
|
// Assert
|
|
_ = sutProvider.GetDependency<IGetOrganizationReportQuery>()
|
|
.Received(1)
|
|
.GetOrganizationReportAsync(Arg.Is<Guid>(_ => _ == orgId));
|
|
}
|
|
|
|
[Theory, BitAutoData]
|
|
public async Task GetOrganizationReportAsync_withoutAccess(SutProvider<ReportsController> sutProvider)
|
|
{
|
|
// Arrange
|
|
sutProvider.GetDependency<ICurrentContext>().AccessReports(Arg.Any<Guid>()).Returns(false);
|
|
// Act
|
|
var orgId = Guid.NewGuid();
|
|
await Assert.ThrowsAsync<NotFoundException>(async () => await sutProvider.Sut.GetOrganizationReports(orgId));
|
|
// Assert
|
|
_ = sutProvider.GetDependency<IGetOrganizationReportQuery>()
|
|
.Received(0);
|
|
|
|
}
|
|
|
|
[Theory, BitAutoData]
|
|
public async Task GetLastestOrganizationReportAsync_withAccess_success(SutProvider<ReportsController> sutProvider)
|
|
{
|
|
// Arrange
|
|
sutProvider.GetDependency<ICurrentContext>().AccessReports(Arg.Any<Guid>()).Returns(true);
|
|
|
|
// Act
|
|
var orgId = Guid.NewGuid();
|
|
var result = await sutProvider.Sut.GetLatestOrganizationReport(orgId);
|
|
|
|
// Assert
|
|
_ = sutProvider.GetDependency<IGetOrganizationReportQuery>()
|
|
.Received(1)
|
|
.GetLatestOrganizationReportAsync(Arg.Is<Guid>(_ => _ == orgId));
|
|
}
|
|
|
|
[Theory, BitAutoData]
|
|
public async Task GetLastestOrganizationReportAsync_withoutAccess(SutProvider<ReportsController> sutProvider)
|
|
{
|
|
// Arrange
|
|
sutProvider.GetDependency<ICurrentContext>().AccessReports(Arg.Any<Guid>()).Returns(false);
|
|
|
|
// Act
|
|
var orgId = Guid.NewGuid();
|
|
await Assert.ThrowsAsync<NotFoundException>(async () => await sutProvider.Sut.GetLatestOrganizationReport(orgId));
|
|
|
|
// Assert
|
|
_ = sutProvider.GetDependency<IGetOrganizationReportQuery>()
|
|
.Received(0);
|
|
}
|
|
}
|