using System.Net; using System.Net.Http.Json; namespace GerbilManager.Tests; /// /// WEB-3: Round-Trips für die lokale Webseiten-Vorschau (GET /api/preview/…): /// veröffentlichte Seiten werden als HTML ausgeliefert, Entwürfe nicht, /// styles.css kommt mit CSS-Content-Type. /// public class CmsPreviewTests : IClassFixture { private readonly ApiFactory _factory; public CmsPreviewTests(ApiFactory factory) => _factory = factory; private static object PageInput(string slug, string title, string status) => new { slug, title, seoDescription = (string?)null, status }; private sealed record PageRow(Guid Id, string Slug); /// Seite anlegen oder (falls von WEB-0b geseedet) auf den Zielzustand setzen. private static async Task UpsertPageAsync(HttpClient client, string slug, string title, string status) { var existing = (await client.GetFromJsonAsync>("/api/pages"))! .FirstOrDefault(p => p.Slug == slug); if (existing is null) { var created = await client.PostAsJsonAsync("/api/pages", PageInput(slug, title, status)); Assert.Equal(HttpStatusCode.Created, created.StatusCode); } else { var updated = await client.PutAsJsonAsync($"/api/pages/{existing.Id}", PageInput(slug, title, status)); Assert.Equal(HttpStatusCode.NoContent, updated.StatusCode); } } [Fact] public async Task Vorschau_LiefertVeroeffentlichteSeiteAlsHtml_UndKeineEntwuerfe() { var client = _factory.CreateClient(); await UpsertPageAsync(client, "start", "Willkommen bei der Zucht", "Published"); await UpsertPageAsync(client, "e2e-entwurf", "Unsere Zucht", "Draft"); // Startseite: /api/preview/ → index.html (text/html, enthält den Titel) var index = await client.GetAsync("/api/preview/"); Assert.Equal(HttpStatusCode.OK, index.StatusCode); Assert.StartsWith("text/html", index.Content.Headers.ContentType!.ToString()); Assert.Contains("Willkommen bei der Zucht", await index.Content.ReadAsStringAsync()); // Expliziter Pfad funktioniert ebenso var explicitIndex = await client.GetAsync("/api/preview/index.html"); Assert.Equal(HttpStatusCode.OK, explicitIndex.StatusCode); // CSS mit korrektem Content-Type (Renderer: SiteRenderer.CssPath) var css = await client.GetAsync("/api/preview/assets/site.css"); Assert.Equal(HttpStatusCode.OK, css.StatusCode); Assert.StartsWith("text/css", css.Content.Headers.ContentType!.ToString()); // Entwurf wird NICHT gerendert (Vorschau zeigt nur Veröffentlichtes) Assert.Equal(HttpStatusCode.NotFound, (await client.GetAsync("/api/preview/e2e-entwurf/index.html")).StatusCode); Assert.Equal(HttpStatusCode.NotFound, (await client.GetAsync("/api/preview/e2e-entwurf/")).StatusCode); // Unsinnige Pfade → 404 Assert.Equal(HttpStatusCode.NotFound, (await client.GetAsync("/api/preview/gibt-es-nicht.html")).StatusCode); } }