using JobTrackerApi.Models; using JobTrackerApi.Services; using Xunit; namespace JobTrackerApi.Tests; public sealed class CvDocumentFontsTests { [Fact] public void Embedded_fonts_use_static_outlines_for_the_CLI_renderer() { var assembly = typeof(ThemedCvRenderer).Assembly; var fonts = assembly.GetManifestResourceNames().Where(name => name.StartsWith("CvFonts.") && name.EndsWith(".ttf")).ToArray(); Assert.NotEmpty(fonts); foreach (var name in fonts) { using var stream = assembly.GetManifestResourceStream(name)!; using var bytes = new MemoryStream(); stream.CopyTo(bytes); var data = bytes.ToArray(); var count = System.Buffers.Binary.BinaryPrimitives.ReadUInt16BigEndian(data.AsSpan(4, 2)); var tables = Enumerable.Range(0, count).Select(i => System.Text.Encoding.ASCII.GetString(data, 12 + i * 16, 4)); Assert.DoesNotContain("fvar", tables); } } [Theory] [InlineData("modern")] [InlineData("minimal")] [InlineData("executive")] [InlineData("technical")] [InlineData("creative")] [InlineData("code")] public void Document_is_self_contained_and_does_not_depend_on_installed_fonts(string themeId) { var profile = new StructuredCvProfile { Contact = { FullName = "Åse æøå" }, Summary = { "Retained career content." } }; var settings = new CvVariantSettings { ThemeId = themeId }; var model = CvVariantResolver.Build(profile, settings, "Fallback", null); var html = new ThemedCvRenderer().Render(model, CvThemeCatalog.Resolve(themeId), settings).Html; Assert.Contains("@font-face", html); Assert.Contains("data:font/ttf;base64,", html); Assert.DoesNotContain("src:local(", html); Assert.Contains("Retained career content.", html); Assert.Null(settings.BodyFont); Assert.Null(settings.HeadingFont); Assert.Equal("Åse æøå", profile.Contact.FullName); } }