using System.Text; using System.Text.Json; using JobTrackerApi.Models; using JobTrackerApi.Services; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using Moq; using Xunit; namespace JobTrackerApi.Tests; public sealed partial class CoverLetterWriterTests { [Fact] public async Task Letter_language_is_a_reviewed_snapshot_in_history_and_frozen_bytes() { await using var connection = new SqliteConnection("Data Source=:memory:"); await connection.OpenAsync(); await using var db = Context(connection); var job = await Seed(db); var service = Assets(db); var norwegian = CoverLetterDocumentSettingsJson.Deserialize("{\"language\":\"nb\",\"senderName\":\"Åse\"}"); await service.SaveCoverLetterAsync(Owner, job.Id, "Gjennomgått søknad — æøå", CoverLetterSources.Manual, null, job.Version, default, norwegian); var settingsBytes = Encoding.UTF8.GetBytes(job.CoverLetterDocumentSettingsJson!); var packages = new SubmittedApplicationPackageService(db, Mock.Of(), Mock.Of()); var captured = await packages.CaptureAsync(Owner, job.Id, new("Fallback", null), default); var frozen = await db.SubmittedApplicationPackages.AsNoTracking().SingleAsync(x => x.Id == captured!.Id); Assert.Contains("", frozen.RenderedCoverLetterHtml); Assert.Equal("nb-NO", JsonDocument.Parse(frozen.CoverLetterDocumentSettingsJson!).RootElement.GetProperty("language").GetString()); var htmlBytes = Encoding.UTF8.GetBytes(frozen.RenderedCoverLetterHtml!); await service.SaveCoverLetterAsync(Owner, job.Id, "English revision", CoverLetterSources.Manual, null, job.Version, default, new()); Assert.Contains("", (await service.RenderSavedCoverLetterAsync(Owner, job.Id, job.Version, default))!.Html); await service.RestoreCoverLetterAsync(Owner, job.Id, 1, job.Version, default); Assert.Equal(settingsBytes, Encoding.UTF8.GetBytes(job.CoverLetterDocumentSettingsJson!)); var history = await db.CoverLetterVersions.Where(x => x.JobApplicationId == job.Id).OrderBy(x => x.Version).ToListAsync(); Assert.Equal(new[] { "nb-NO", "en", "nb-NO" }, history.Select(x => JsonDocument.Parse(x.DocumentSettingsJson!).RootElement.GetProperty("language").GetString())); var detail = await packages.GetAsync(Owner, job.Id, captured!.Id, default); Assert.Equal(htmlBytes, Encoding.UTF8.GetBytes(detail!.RenderedCoverLetterHtml!)); Assert.Equal(settingsBytes, Encoding.UTF8.GetBytes(CoverLetterDocumentSettingsJson.Serialize(detail.CoverLetterDocumentSettings))); } }