Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ees 4944 read next data set version metadata #4952

Merged
merged 15 commits into from
Jun 25, 2024
Merged
Changes from 13 commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
0e4494a
EES-4944 and EES-4953 - added new Function orchestration to import th…
duncan-at-hiveit Jun 10, 2024
78f751a
EES-4944 - split CompleteProcessing into its own Function file. Added…
duncan-at-hiveit Jun 11, 2024
564a609
EES-4944 - added tests for Admin DataSetVersioncontroller when creati…
duncan-at-hiveit Jun 12, 2024
793d4f6
EES-4944 - adding tests for new CreateNextDataSetVersionFunction.
duncan-at-hiveit Jun 12, 2024
73cf53d
EES-4944 - updating class and method names to fit in with updated wor…
duncan-at-hiveit Jun 12, 2024
bb7ad31
EES-4944 - refactoring creation of initial and next DataSetVersion co…
duncan-at-hiveit Jun 12, 2024
448c18a
EES-4944 - cleanup before raising PR
duncan-at-hiveit Jun 13, 2024
9639bdf
EES-4944 - removing the persisting of DataSetVersion metadata during …
duncan-at-hiveit Jun 18, 2024
906103f
EES-4994 - more refactoring following rework of metadata extraction t…
duncan-at-hiveit Jun 19, 2024
abdc95b
EES-4944 - responding to PR comments and lots of formatting change re…
duncan-at-hiveit Jun 20, 2024
c72894d
EES-4944 - responding to various PR suggestions. Method renames, remo…
duncan-at-hiveit Jun 21, 2024
c52407b
EES-4944 - resolving merge conflicts with dev. Pulling resetting of …
duncan-at-hiveit Jun 24, 2024
7929a22
EES-4944 - reinstated specia-case handling of 404s for DeleteDataSetV…
duncan-at-hiveit Jun 24, 2024
8354ed0
EES-4944 - final PR changes upon request
duncan-at-hiveit Jun 25, 2024
4b5b02a
EES-4944 - final PR changes upon request
duncan-at-hiveit Jun 25, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -4,62 +4,146 @@
using System.Security.Claims;
using System.Threading;
using System.Threading.Tasks;
using GovUk.Education.ExploreEducationStatistics.Admin.Requests.Public.Data;
using GovUk.Education.ExploreEducationStatistics.Admin.Services.Interfaces.Public.Data;
using GovUk.Education.ExploreEducationStatistics.Admin.Tests.Fixture;
using GovUk.Education.ExploreEducationStatistics.Admin.ViewModels.Public.Data;
using GovUk.Education.ExploreEducationStatistics.Common.Model;
using GovUk.Education.ExploreEducationStatistics.Common.Tests.Extensions;
using GovUk.Education.ExploreEducationStatistics.Public.Data.Model;
using GovUk.Education.ExploreEducationStatistics.Common.Utils;
using GovUk.Education.ExploreEducationStatistics.Common.ViewModels;
using GovUk.Education.ExploreEducationStatistics.Public.Data.Model;
using GovUk.Education.ExploreEducationStatistics.Public.Data.Model.Database;
using GovUk.Education.ExploreEducationStatistics.Public.Data.Model.Tests.Fixtures;
using GovUk.Education.ExploreEducationStatistics.Public.Data.Processor.ViewModels;
using LinqToDB;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Testing;
using Moq;
using static GovUk.Education.ExploreEducationStatistics.Admin.Tests.Security.Utils.ClaimsPrincipalUtils;

namespace GovUk.Education.ExploreEducationStatistics.Admin.Tests.Controllers.Api.Public.Data;

public abstract class DataSetVersionsControllerTests(TestApplicationFactory testApp) : IntegrationTestFixture(testApp)
public abstract class DataSetVersionsControllerTests(
TestApplicationFactory testApp) : IntegrationTestFixture(testApp)
{
private const string BaseUrl = "api/public-data/data-set-versions";

public class DeleteVersionTests(TestApplicationFactory testApp) : DataSetVersionsControllerTests(testApp)
public class CreateNextVersionTests(
TestApplicationFactory testApp) : DataSetVersionsControllerTests(testApp)
{
[Fact]
public async Task Success()
{
var nextReleaseFileId = Guid.NewGuid();

DataSet dataSet = DataFixture
.DefaultDataSet()
.WithStatusDraft();
.WithStatusPublished();

await TestApp.AddTestData<PublicDataDbContext>(context => context.DataSets.Add(dataSet));

DataSetVersion dataSetVersion = DataFixture
DataSetVersion currentDataSetVersion = DataFixture
.DefaultDataSetVersion(filters: 1, indicators: 1, locations: 1, timePeriods: 2)
.WithVersionNumber(1, 0, 0)
.WithStatusDraft()
.WithVersionNumber(major: 1, minor: 0)
.WithStatusPublished()
.WithDataSet(dataSet)
.WithImports(() => DataFixture
.DefaultDataSetVersionImport()
.Generate(1))
.FinishWith(dsv => dsv.DataSet.LatestDraftVersion = dsv);
.FinishWith(dsv => dsv.DataSet.LatestLiveVersion = dsv);

await TestApp.AddTestData<PublicDataDbContext>(context =>
{
context.DataSetVersions.Add(dataSetVersion);
context.DataSetVersions.Add(currentDataSetVersion);
context.DataSets.Update(dataSet);
});

var processorClient = new Mock<IProcessorClient>();
DataSetVersion? nextVersion = null;

var processorClient = new Mock<IProcessorClient>(MockBehavior.Strict);

processorClient
.Setup(c => c.CreateNextDataSetVersion(dataSet.Id,
nextReleaseFileId, It.IsAny<CancellationToken>()))
.Returns(async () =>
{
var savedDataSet = await TestApp.GetDbContext<PublicDataDbContext>()
.DataSets
.SingleAsync(ds => ds.Id == dataSet.Id);

nextVersion = DataFixture
.DefaultDataSetVersion()
.WithStatusMapping()
.WithVersionNumber(major: 1, minor: 1)
.WithReleaseFileId(nextReleaseFileId)
.WithDataSet(savedDataSet)
.FinishWith(dsv => dsv.DataSet.LatestDraftVersion = dsv);

await TestApp.AddTestData<PublicDataDbContext>(context =>
{
context.DataSetVersions.Add(nextVersion);
context.DataSets.Update(savedDataSet);
});

return new CreateDataSetResponseViewModel
{
DataSetId = dataSet.Id,
DataSetVersionId = nextVersion.Id,
InstanceId = Guid.NewGuid()
};
});

var client = BuildApp(processorClient.Object).CreateClient();

var response = await CreateNextVersion(
dataSetId: dataSet.Id,
releaseFileId: nextReleaseFileId,
client);

var viewModel = response.AssertOk<DataSetVersionSummaryViewModel>();

Assert.NotNull(nextVersion);
Assert.Equal(viewModel.Id, nextVersion.Id);
Assert.Equal(viewModel.Version, nextVersion.Version);
Assert.Equal(viewModel.Status, nextVersion.Status);
Assert.Equal(viewModel.Type, nextVersion.VersionType);
}

private async Task<HttpResponseMessage> CreateNextVersion(
Guid dataSetId,
Guid releaseFileId,
HttpClient? client = null)
{
client ??= BuildApp().CreateClient();

var uri = new Uri(BaseUrl, UriKind.Relative);

return await client.PostAsync(uri,
new JsonNetContent(new NextDataSetVersionCreateRequest
{
DataSetId = dataSetId,
ReleaseFileId = releaseFileId
}));
}
}

public class DeleteVersionTests(
TestApplicationFactory testApp) : DataSetVersionsControllerTests(testApp)
{
[Fact]
public async Task Success()
{
var dataSetVersionId = Guid.NewGuid();

var processorClient = new Mock<IProcessorClient>(MockBehavior.Strict);

processorClient
.Setup(c => c.DeleteDataSetVersion(
dataSetVersion.Id,
dataSetVersionId,
It.IsAny<CancellationToken>()))
.ReturnsAsync(new Either<ActionResult, Unit>(Unit.Instance));

var client = BuildApp(processorClient.Object).CreateClient();

var response = await DeleteVersion(dataSetVersion.Id, client);
var response = await DeleteVersion(dataSetVersionId, client);

response.AssertNoContent();
}
@@ -85,7 +169,7 @@ public async Task ProcessorReturns404_Returns404()

DataSetVersion dataSetVersion = DataFixture
.DefaultDataSetVersion(filters: 1, indicators: 1, locations: 1, timePeriods: 2)
.WithVersionNumber(1, 0, 0)
.WithVersionNumber(1, 0)
.WithStatusDraft()
.WithDataSet(dataSet)
.WithImports(() => DataFixture
@@ -99,7 +183,7 @@ await TestApp.AddTestData<PublicDataDbContext>(context =>
context.DataSets.Update(dataSet);
});

var processorClient = new Mock<IProcessorClient>();
var processorClient = new Mock<IProcessorClient>(MockBehavior.Strict);
processorClient
.Setup(c => c.DeleteDataSetVersion(
dataSetVersion.Id,
@@ -124,7 +208,7 @@ public async Task ProcessorReturns400_Returns400()

DataSetVersion dataSetVersion = DataFixture
.DefaultDataSetVersion(filters: 1, indicators: 1, locations: 1, timePeriods: 2)
.WithVersionNumber(1, 0, 0)
.WithVersionNumber(1, 0)
.WithStatusDraft()
.WithDataSet(dataSet)
.WithImports(() => DataFixture
@@ -138,7 +222,7 @@ await TestApp.AddTestData<PublicDataDbContext>(context =>
context.DataSets.Update(dataSet);
});

var processorClient = new Mock<IProcessorClient>();
var processorClient = new Mock<IProcessorClient>(MockBehavior.Strict);
processorClient
.Setup(c => c.DeleteDataSetVersion(
dataSetVersion.Id,
@@ -148,12 +232,13 @@ await TestApp.AddTestData<PublicDataDbContext>(context =>
new ValidationProblemViewModel
{
Errors = new ErrorViewModel[]
{
new()
{
new() {
Code = "error code",
Path = "error path"
}
Code = "error code",
Path = "error path"
}
}
})));

var client = BuildApp(processorClient.Object).CreateClient();
@@ -162,7 +247,7 @@ await TestApp.AddTestData<PublicDataDbContext>(context =>

var validationProblem = response.AssertValidationProblem();

var error = validationProblem.AssertHasError("error path", "error code");
validationProblem.AssertHasError("error path", "error code");
}

[Fact]
@@ -176,7 +261,7 @@ public async Task ProcessorFailureStatusCode_Returns500()

DataSetVersion dataSetVersion = DataFixture
.DefaultDataSetVersion(filters: 1, indicators: 1, locations: 1, timePeriods: 2)
.WithVersionNumber(1, 0, 0)
.WithVersionNumber(1, 0)
.WithStatusDraft()
.WithDataSet(dataSet)
.WithImports(() => DataFixture
@@ -190,29 +275,21 @@ await TestApp.AddTestData<PublicDataDbContext>(context =>
context.DataSets.Update(dataSet);
});

var processorClient = new Mock<IProcessorClient>();
var processorClient = new Mock<IProcessorClient>(MockBehavior.Strict);
processorClient
.Setup(c => c.DeleteDataSetVersion(
dataSetVersion.Id,
It.IsAny<CancellationToken>()))
.ThrowsAsync(new HttpRequestException());

var client = BuildApp(processorClient.Object).CreateClient();

var exception = await Assert.ThrowsAsync<InvalidOperationException>(async () => await DeleteVersion(dataSetVersion.Id, client));
var exception =
await Assert.ThrowsAsync<InvalidOperationException>(async () =>
await DeleteVersion(dataSetVersion.Id, client));
Assert.IsType<HttpRequestException>(exception.InnerException);
}

private WebApplicationFactory<TestStartup> BuildApp(
IProcessorClient? processorClient = null,
ClaimsPrincipal? user = null)
{
return TestApp.ConfigureServices(
services => { services.ReplaceService(processorClient ?? Mock.Of<IProcessorClient>()); }
)
.SetUser(user ?? BauUser());
}

private async Task<HttpResponseMessage> DeleteVersion(
Guid dataSetVersionId,
HttpClient? client = null)
@@ -224,4 +301,14 @@ private async Task<HttpResponseMessage> DeleteVersion(
return await client.DeleteAsync(uri);
}
}

private WebApplicationFactory<TestStartup> BuildApp(
IProcessorClient? processorClient = null,
ClaimsPrincipal? user = null)
{
return TestApp.ConfigureServices(
services => { services.ReplaceService(processorClient ?? Mock.Of<IProcessorClient>()); }
)
.SetUser(user ?? BauUser());
}
}
Original file line number Diff line number Diff line change
@@ -32,11 +32,13 @@

namespace GovUk.Education.ExploreEducationStatistics.Admin.Tests.Controllers.Api.Public.Data;

public class DataSetsControllerTests(TestApplicationFactory testApp) : IntegrationTestFixture(testApp)
public abstract class DataSetsControllerTests(
TestApplicationFactory testApp) : IntegrationTestFixture(testApp)
{
private const string BaseUrl = "api/public-data/data-sets";

public class ListDataSetsTests(TestApplicationFactory testApp) : DataSetsControllerTests(testApp)
public class ListDataSetsTests(
TestApplicationFactory testApp) : DataSetsControllerTests(testApp)
{
[Fact]
public async Task PublicationHasSingleDataSet_Success_CorrectViewModel()
@@ -451,15 +453,9 @@ private async Task<HttpResponseMessage> ListPublicationDataSets(

var queryParams = new Dictionary<string, string?>
{
{
"page", page?.ToString()
},
{
"pageSize", pageSize?.ToString()
},
{
"publicationId", publicationId.ToString()
},
{ "page", page?.ToString() },
{ "pageSize", pageSize?.ToString() },
{ "publicationId", publicationId.ToString() },
};

var uri = QueryHelpers.AddQueryString(BaseUrl, queryParams);
@@ -468,7 +464,8 @@ private async Task<HttpResponseMessage> ListPublicationDataSets(
}
}

public class GetDataSetTests(TestApplicationFactory testApp) : DataSetsControllerTests(testApp)
public class GetDataSetTests(
TestApplicationFactory testApp) : DataSetsControllerTests(testApp)
{
[Fact]
public async Task Success()
@@ -912,7 +909,8 @@ private async Task<HttpResponseMessage> GetDataSet(Guid dataSetId, HttpClient? c
}
}

public class CreateDataSetTests(TestApplicationFactory testApp) : DataSetsControllerTests(testApp)
public class CreateDataSetTests(
TestApplicationFactory testApp) : DataSetsControllerTests(testApp)
{
[Fact]
public async Task Success()
@@ -971,15 +969,15 @@ await TestApp.AddTestData<PublicDataDbContext>(context =>

return new CreateDataSetResponseViewModel
{
DataSetId = dataSet!.Id,
DataSetVersionId = dataSetVersion!.Id,
DataSetId = dataSet.Id,
DataSetVersionId = dataSetVersion.Id,
InstanceId = Guid.NewGuid()
};
});

var client = BuildApp(processorClient.Object).CreateClient();

var response = await CreateDataSetVersion(releaseFile.Id, client);
var response = await CreateDataSet(releaseFile.Id, client);

MockUtils.VerifyAllMocks(processorClient);

@@ -1010,7 +1008,7 @@ public async Task NotBauUser_Returns403()
{
var client = BuildApp(user: AuthenticatedUser()).CreateClient();

var response = await CreateDataSetVersion(Guid.NewGuid(), client);
var response = await CreateDataSet(Guid.NewGuid(), client);

response.AssertForbidden();
}
@@ -1042,7 +1040,7 @@ public async Task ProcessorReturns400_Returns400_WithProcessorErrors()
.ReturnsAsync(ValidationUtils.ValidationResult(processorErrors));

var client = BuildApp(processorClient.Object).CreateClient();
var response = await CreateDataSetVersion(releaseFileId, client);
var response = await CreateDataSet(releaseFileId, client);

MockUtils.VerifyAllMocks(processorClient);

@@ -1061,16 +1059,13 @@ private WebApplicationFactory<TestStartup> BuildApp(
.SetUser(user ?? BauUser());
}

private async Task<HttpResponseMessage> CreateDataSetVersion(
private async Task<HttpResponseMessage> CreateDataSet(
Guid releaseFileId,
HttpClient? client = null)
{
client ??= BuildApp().CreateClient();

var request = new DataSetVersionCreateRequest
{
ReleaseFileId = releaseFileId
};
var request = new DataSetCreateRequest { ReleaseFileId = releaseFileId };

return await client.PostAsJsonAsync(BaseUrl, request);
}
Loading