profileShare

rasmusjy / splitapp-backend-modular-monolith

Read-only snapshot

No repository description.

main default branch 418 files Expires Sep 13, 2026, 9:06 AM
HostFeatureTests.cs 3,120 bytes
1 using System.Net;
2 using Microsoft.AspNetCore.Hosting;
3 using Microsoft.AspNetCore.Mvc.Testing;
4
5 namespace SplitApp.WebApp.IntegrationTests;
6
7 /// <summary>
8 /// End-to-end host checks that exercise the cross-cutting requirements:
9 /// Swagger generation, Admin area protection, JWT requirement on a second
10 /// module's controller, and request-localization wiring.
11 /// </summary>
12 public class HostFeatureTests : IClassFixture<WebApplicationFactory<Program>>
13 {
14 private readonly WebApplicationFactory<Program> _factory;
15
16 public HostFeatureTests(WebApplicationFactory<Program> factory)
17 {
18 _factory = factory.WithWebHostBuilder(b =>
19 {
20 b.UseEnvironment("Testing");
21 b.UseSetting("ConnectionStrings:DefaultConnection", "Host=ignored;Database=ignored");
22 b.UseSetting("JWT:Issuer", "splitapp-test");
23 b.UseSetting("JWT:Audience", "splitapp-test");
24 b.UseSetting("JWT:Key", "this-is-a-long-enough-test-signing-key-for-hs256");
25 });
26 }
27
28 [Fact]
29 public async Task Get_SwaggerV1Json_ReturnsOpenApiDocument()
30 {
31 var client = _factory.CreateClient();
32 var response = await client.GetAsync("/swagger/v1/swagger.json");
33 Assert.Equal(HttpStatusCode.OK, response.StatusCode);
34
35 var body = await response.Content.ReadAsStringAsync();
36 Assert.Contains("\"openapi\"", body);
37 Assert.Contains("/api/v1/Trips", body);
38 }
39
40 [Fact]
41 public async Task Get_SwaggerUi_ReturnsOk()
42 {
43 var client = _factory.CreateClient();
44 var response = await client.GetAsync("/swagger/index.html");
45 Assert.Equal(HttpStatusCode.OK, response.StatusCode);
46 }
47
48 [Fact]
49 public async Task Get_AdminArea_RedirectsUnauthenticatedUserToLogin()
50 {
51 var client = _factory.CreateClient(new WebApplicationFactoryClientOptions
52 {
53 AllowAutoRedirect = false,
54 });
55 var response = await client.GetAsync("/Admin/Trips");
56
57 Assert.Equal(HttpStatusCode.Redirect, response.StatusCode);
58 Assert.NotNull(response.Headers.Location);
59 Assert.Contains("Login", response.Headers.Location!.OriginalString, StringComparison.OrdinalIgnoreCase);
60 }
61
62 [Fact]
63 public async Task Get_ExpensesApi_RequiresAuth()
64 {
65 var client = _factory.CreateClient(new WebApplicationFactoryClientOptions
66 {
67 AllowAutoRedirect = false,
68 });
69 var response = await client.GetAsync($"/api/v1/expenses/trip/{Guid.NewGuid()}");
70 Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
71 }
72
73 [Fact]
74 public async Task Get_Home_WithEtCultureQuery_ReturnsOk()
75 {
76 var client = _factory.CreateClient();
77 var response = await client.GetAsync("/?culture=et&ui-culture=et");
78 Assert.Equal(HttpStatusCode.OK, response.StatusCode);
79
80 // RequestLocalization should accept "et" as a supported culture
81 // without throwing or falling back to a 4xx/5xx.
82 var body = await response.Content.ReadAsStringAsync();
83 Assert.Contains("SplitApp", body);
84 }
85 }
86