using System.Net; using System.Net.Http.Headers; using System.Text; namespace GerbilManager.Tests; /// /// POST /import/ingest-resolved/upload — Upload-Variante des Ingests: eine hochgeladene /// resolved_import.json wird serverseitig in den Import-Quellordner gestaged und direkt ingested. /// Damit lässt sich der Import gegen PROD fahren, ohne die Datei per SSH/docker cp in den Container /// zu kopieren. Der Test isoliert Quell-/Fotoordner über ApiFactory in Temp-Verzeichnisse. /// public class ImportIngestUploadEndpointTests { [Fact] public async Task Upload_stages_resolved_json_and_runs_ingest() { var srcDir = Path.Combine(Path.GetTempPath(), "ingest-upload-" + Guid.NewGuid().ToString("N")); var photoDir = Path.Combine(Path.GetTempPath(), "ingest-upload-photos-" + Guid.NewGuid().ToString("N")); using var factory = new ApiFactory { ImportSourcePath = srcDir, PhotosRootPath = photoDir }; var client = factory.CreateClient(); // Minimaler, aber valider Payload (leere Sammlungen) — genügt, um Staging + Ingest-Lauf zu prüfen. const string json = "{\"Gerbils\":[],\"Litters\":[],\"Contacts\":[],\"SaleContracts\":[],\"GerbilPhotos\":[]}"; using var form = new MultipartFormDataContent(); var file = new ByteArrayContent(Encoding.UTF8.GetBytes(json)); file.Headers.ContentType = new MediaTypeHeaderValue("application/json"); form.Add(file, "resolved", "resolved_import.json"); var resp = await client.PostAsync("/import/ingest-resolved/upload", form); Assert.Equal(HttpStatusCode.OK, resp.StatusCode); var body = await resp.Content.ReadAsStringAsync(); Assert.DoesNotContain("Error:", body); // Ingest lief, keine "file not found"-Fehlermeldung // Die hochgeladene Datei wurde an den erwarteten Ort gestaged. Assert.True(File.Exists(Path.Combine(srcDir, "resolved_import.json"))); try { Directory.Delete(srcDir, recursive: true); } catch { /* best effort */ } try { Directory.Delete(photoDir, recursive: true); } catch { /* best effort */ } } [Fact] public async Task Upload_rejects_empty_file_with_400() { var srcDir = Path.Combine(Path.GetTempPath(), "ingest-upload-" + Guid.NewGuid().ToString("N")); using var factory = new ApiFactory { ImportSourcePath = srcDir }; var client = factory.CreateClient(); using var form = new MultipartFormDataContent(); var file = new ByteArrayContent(Array.Empty()); file.Headers.ContentType = new MediaTypeHeaderValue("application/json"); form.Add(file, "resolved", "resolved_import.json"); var resp = await client.PostAsync("/import/ingest-resolved/upload", form); Assert.Equal(HttpStatusCode.BadRequest, resp.StatusCode); try { Directory.Delete(srcDir, recursive: true); } catch { /* best effort */ } } }