-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAdminMachineAnnouncementsIntegrationTests.cs
More file actions
78 lines (60 loc) · 3.29 KB
/
Copy pathAdminMachineAnnouncementsIntegrationTests.cs
File metadata and controls
78 lines (60 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
using System.Net;
using System.Net.Http.Json;
using System.Text.Json;
using Admin.Application.Queries; // BP-031 dispatch-coverage marker
using BuildingBlocks.Application.Dispatching;
using Identity.Infrastructure.Authentication;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.DependencyInjection;
using BuildingBlocks.Testing.Http;
using static BuildingBlocks.Testing.Http.IntegrationTestHttpHelpers;
namespace Integration.Tests.Modules.Admin.Machine;
public sealed class AdminMachineAnnouncementsIntegrationTests
{
[Xunit.Fact]
public async Task AdminMachineAnnouncementsRequireMachineAuthentication()
{
await using var application = await PostgresBackedApiApplication.StartAsync();
var client = application.App.GetTestClient();
client.BaseAddress = new Uri("https://localhost");
var response = await client.GetAsync("/api/v1/admin/machine/announcements");
Xunit.Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
}
[Xunit.Fact]
public async Task AdminMachineAnnouncementsExposeProjectedFeedToAuthorizedMachineClients()
{
await using var application = await PostgresBackedApiApplication.StartAsync();
var client = application.App.GetTestClient();
client.BaseAddress = new Uri("https://localhost");
var session = await SignInAsync(client);
var authCookie = session.Cookie;
var cookies = session.Cookies;
var response = await SendJsonAsync(
client,
HttpMethod.Post,
"/api/v1/sample-feature/announcements",
new { title = "Machine feed announcement", body = "Machine clients should read this from Admin." },
cookies,
session.HeaderName,
session.RequestToken,
"admin-machine-request-1");
Xunit.Assert.Equal(HttpStatusCode.OK, response.StatusCode);
using var json = await ReadJsonAsync(response);
var announcementId = json.RootElement.GetProperty("announcementId").GetGuid();
using var scope = application.App.Services.CreateScope();
var outboxDispatcher = scope.ServiceProvider.GetRequiredService<IIntegrationEventOutboxDispatcher>();
var dispatched = await outboxDispatcher.DispatchAvailableAsync(CancellationToken.None);
Xunit.Assert.Equal(1, dispatched);
using var request = new HttpRequestMessage(HttpMethod.Get, "/api/v1/admin/machine/announcements");
request.Headers.Add(IdentityMachineAuthenticationDefaults.ApiKeyHeaderName, "MachineOnly!123");
var machineResponse = await client.SendAsync(request);
Xunit.Assert.Equal(HttpStatusCode.OK, machineResponse.StatusCode);
using var machineJson = await ReadJsonAsync(machineResponse);
Xunit.Assert.Equal("v1", machineJson.RootElement.GetProperty("contractVersion").GetString());
var announcements = machineJson.RootElement.GetProperty("announcements");
Xunit.Assert.Equal(1, announcements.GetArrayLength());
Xunit.Assert.Equal(announcementId, announcements[0].GetProperty("announcementId").GetGuid());
Xunit.Assert.Equal("Machine feed announcement", announcements[0].GetProperty("title").GetString());
Xunit.Assert.Equal("sample-feature", announcements[0].GetProperty("sourceModuleKey").GetString());
}
}