using DocumentOperator.Application.Common.DTOs; using FluentAssertions; using Microsoft.AspNetCore.Mvc.Testing; using System.Net; using System.Net.Http.Json; using System.Text.Json; using Xunit; namespace DocumentOperator.Tests.Integration.API; public sealed class ExtractSwissQrCodeEndpointTests : IClassFixture> { private readonly HttpClient _client; private readonly JsonSerializerOptions _jsonOptions; public ExtractSwissQrCodeEndpointTests(WebApplicationFactory factory) { _client = factory.CreateClient(); _jsonOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; } [Fact] public async Task POST_ExtractSwissQrCode_ValidRequest_Returns200() { // Arrange var validPdfBase64 = GetEmbeddedResourceAsBase64("DocumentOperator.Tests.TestData.Pdfs.valid.pdf"); var request = new ExtractSwissQrCodeRequest( References: new List { "REF-001", "REF-002" }, Base64Pdf: validPdfBase64 ); // Act var response = await _client.PostAsJsonAsync("/api/v1/documents/extract-swiss-qr-code", request); // Assert // Note: The test PDF (valid.pdf) may not actually contain a Swiss QR Code // so this test might return 404. We're testing the endpoint wiring here. // A real test would need a PDF with a Swiss QR Code on the last page. response.StatusCode.Should().BeOneOf(HttpStatusCode.OK, HttpStatusCode.NotFound); if (response.StatusCode == HttpStatusCode.OK) { var result = await response.Content.ReadFromJsonAsync(_jsonOptions); result.Should().NotBeNull(); result!.References.Should().BeEquivalentTo(new[] { "REF-001", "REF-002" }); result.QrCodeData.Should().NotBeNull(); } } [Fact] public async Task POST_ExtractSwissQrCode_InvalidBase64_Returns400() { // Arrange var request = new ExtractSwissQrCodeRequest( References: new List { "REF-001" }, Base64Pdf: "INVALID_BASE64!!!" ); // Act var response = await _client.PostAsJsonAsync("/api/v1/documents/extract-swiss-qr-code", request); // Assert response.StatusCode.Should().Be(HttpStatusCode.BadRequest); } [Fact] public async Task POST_ExtractSwissQrCode_EmptyReferences_Returns400() { // Arrange var validPdfBase64 = GetEmbeddedResourceAsBase64("DocumentOperator.Tests.TestData.Pdfs.valid.pdf"); var request = new { References = (List?)null, Base64Pdf = validPdfBase64 }; // Act var response = await _client.PostAsJsonAsync("/api/v1/documents/extract-swiss-qr-code", request); // Assert response.StatusCode.Should().Be(HttpStatusCode.BadRequest); } [Fact] public async Task POST_ExtractSwissQrCode_EmptyPdf_Returns400() { // Arrange var request = new { References = new List { "REF-001" }, Base64Pdf = (string?)null }; // Act var response = await _client.PostAsJsonAsync("/api/v1/documents/extract-swiss-qr-code", request); // Assert response.StatusCode.Should().Be(HttpStatusCode.BadRequest); } /// /// Helper method to load embedded resource as Base64 string /// private static string GetEmbeddedResourceAsBase64(string resourceName) { var assembly = typeof(ExtractSwissQrCodeEndpointTests).Assembly; using var stream = assembly.GetManifestResourceStream(resourceName); if (stream == null) { throw new FileNotFoundException($"Embedded resource not found: {resourceName}"); } using var memoryStream = new MemoryStream(); stream.CopyTo(memoryStream); return Convert.ToBase64String(memoryStream.ToArray()); } }