Skip to content

Commit 3c4f676

Browse files
committed
Add Publication changed event handler function
1 parent bb8ff1f commit 3c4f676

File tree

4 files changed

+99
-2
lines changed

4 files changed

+99
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
using GovUk.Education.ExploreEducationStatistics.Content.Search.FunctionApp.Functions.OnPublicationChanged;
2+
using GovUk.Education.ExploreEducationStatistics.Content.Search.FunctionApp.Functions.OnPublicationChanged.Dtos;
3+
using GovUk.Education.ExploreEducationStatistics.Content.Search.FunctionApp.Services;
4+
using GovUk.Education.ExploreEducationStatistics.Content.Search.FunctionApp.Tests.Builders;
5+
using Microsoft.Extensions.Logging.Abstractions;
6+
7+
namespace GovUk.Education.ExploreEducationStatistics.Content.Search.FunctionApp.Tests.Functions.OnPublicationChanged;
8+
9+
public class OnPublicationChangedFunctionTests
10+
{
11+
private OnPublicationChangedFunction GetSut() => new(new EventGridEventHandler(new NullLogger<EventGridEventHandler>()));
12+
13+
[Fact]
14+
public void Can_instantiate_Sut() => Assert.NotNull(GetSut());
15+
16+
[Fact]
17+
public async Task GivenEvent_WhenPayloadContainsSlug_ThenRefreshSearchableDocumentMessageDtoReturned()
18+
{
19+
// ARRANGE
20+
var payload = new PublicationChangedEventDto
21+
{
22+
Slug = "this-is-a-publication-slug",
23+
};
24+
25+
var eventGridEvent = new EventGridEventBuilder()
26+
.WithPayload(payload)
27+
.Build();
28+
29+
var sut = GetSut();
30+
31+
// ACT
32+
var response = await sut.OnPublicationChanged(eventGridEvent, new FunctionContextMockBuilder().Build());
33+
34+
// ASSERT
35+
var actual = Assert.Single(response);
36+
Assert.NotNull(actual);
37+
Assert.Equal(payload.Slug, actual.PublicationSlug);
38+
}
39+
40+
[Theory]
41+
[InlineData((string?)null)]
42+
[InlineData("")]
43+
public async Task GivenEvent_WhenPayloadDoesNotContainSlug_ThenNothingIsReturned(string? blankSlug)
44+
{
45+
// ARRANGE
46+
var payload = new PublicationChangedEventDto
47+
{
48+
Slug = blankSlug,
49+
};
50+
51+
var eventGridEvent = new EventGridEventBuilder()
52+
.WithPayload(payload)
53+
.Build();
54+
55+
var sut = GetSut();
56+
57+
// ACT
58+
var response = await sut.OnPublicationChanged(eventGridEvent, new FunctionContextMockBuilder().Build());
59+
60+
// ASSERT
61+
Assert.Empty(response);
62+
}
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace GovUk.Education.ExploreEducationStatistics.Content.Search.FunctionApp.Functions.OnPublicationChanged.Dtos;
2+
3+
public class PublicationChangedEventDto
4+
{
5+
public string? Title { get; init; }
6+
public string? Summary { get; init; }
7+
public string? Slug { get; init; }
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Azure.Messaging.EventGrid;
2+
using GovUk.Education.ExploreEducationStatistics.Content.Search.FunctionApp.Functions.OnPublicationChanged.Dtos;
3+
using GovUk.Education.ExploreEducationStatistics.Content.Search.FunctionApp.Functions.RefreshSearchableDocument.Dto;
4+
using GovUk.Education.ExploreEducationStatistics.Content.Search.FunctionApp.Services;
5+
using Microsoft.Azure.Functions.Worker;
6+
7+
namespace GovUk.Education.ExploreEducationStatistics.Content.Search.FunctionApp.Functions.OnPublicationChanged;
8+
9+
public class OnPublicationChangedFunction(IEventGridEventHandler eventGridEventHandler)
10+
{
11+
[Function(nameof(OnPublicationChanged))]
12+
[QueueOutput("%RefreshSearchableDocumentQueueName%")]
13+
public async Task<RefreshSearchableDocumentMessageDto[]> OnPublicationChanged(
14+
[QueueTrigger("%PublicationChangedQueueName%")]
15+
EventGridEvent eventDto,
16+
FunctionContext context) =>
17+
await eventGridEventHandler.Handle<PublicationChangedEventDto, RefreshSearchableDocumentMessageDto[]>(
18+
context,
19+
eventDto,
20+
(payload, ct) =>
21+
Task.FromResult<RefreshSearchableDocumentMessageDto[]>(
22+
string.IsNullOrEmpty(payload.Slug)
23+
? []
24+
: [ new RefreshSearchableDocumentMessageDto { PublicationSlug = payload.Slug } ]));
25+
}

src/GovUk.Education.ExploreEducationStatistics.Content.Search.FunctionApp/local.settings.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
"Values": {
44
"AzureWebJobsStorage": "UseDevelopmentStorage=true;DevelopmentStorageProxyUri=http://data-storage",
55
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
6-
"ReleaseVersionPublishedQueueName": "release-version-published-queue",
6+
"PublicationChangedQueueName": "publication-changed-queue",
7+
"RefreshSearchableDocumentQueueName": "refresh-searchable-document-queue",
78
"ReleaseSlugChangedQueueName": "release-slug-changed-queue",
9+
"ReleaseVersionPublishedQueueName": "release-version-published-queue",
810
"SearchableDocumentCreatedQueueName": "search-document-created-queue",
9-
"RefreshSearchableDocumentQueueName": "refresh-searchable-document-queue",
1011
"ThemeUpdatedQueueName": "theme-updated-queue"
1112
},
1213
"Host": {

0 commit comments

Comments
 (0)