using JobTrackerApi.Controllers; using JobTrackerApi.Models; using JobTrackerApi.Services; using JobTrackerApi.Tests.TestSupport; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.RateLimiting; using Moq; using System.Reflection; using Xunit; namespace JobTrackerApi.Tests; public sealed class PublicCvControllerTests { [Fact] public void Pdf_download_is_rate_limited() { var attribute = typeof(PublicCvController).GetMethod(nameof(PublicCvController.DownloadPdf))! .GetCustomAttribute(); Assert.Equal("public-pdf", attribute?.PolicyName); } [Fact] public async Task Pdf_download_uses_the_public_variant_render() { var user = new ApplicationUser { Id = "owner-1", FirstName = "Ada", LastName = "Lovelace" }; var variants = new Mock(); var pdf = new Mock(); var render = new ThemedCvRenderResult("modern", "ada-cv.pdf", "CV"); variants.Setup(x => x.GetPublicOwnerAsync("public-slug", It.IsAny())).ReturnsAsync(user.Id); variants.Setup(x => x.RenderPublicAsync("public-slug", It.IsAny(), It.IsAny())) .ReturnsAsync((render, user.Id)); pdf.Setup(x => x.ExportAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new CvPdfArtifact("ada-cv.pdf", "unused", [1, 2, 3])); var controller = new PublicCvController(TestHostFactory.CreateUserManager(user).Object, variants.Object, pdf.Object); var result = Assert.IsType(await controller.DownloadPdf("public-slug", CancellationToken.None)); Assert.Equal("application/pdf", result.ContentType); Assert.Equal("ada-cv.pdf", result.FileDownloadName); Assert.Equal([1, 2, 3], result.FileContents); pdf.Verify(x => x.ExportAsync( user.Id, It.Is(value => value.TemplateId == "modern" && value.Html == "CV"), It.IsAny()), Times.Once); } [Fact] public async Task Pdf_download_does_not_render_an_unknown_or_private_slug() { var variants = new Mock(); variants.Setup(x => x.GetPublicOwnerAsync("private-slug", It.IsAny())).ReturnsAsync((string?)null); var pdf = new Mock(); var controller = new PublicCvController(TestHostFactory.CreateUserManager().Object, variants.Object, pdf.Object); Assert.IsType(await controller.DownloadPdf("private-slug", CancellationToken.None)); variants.Verify(x => x.RenderPublicAsync(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never); pdf.VerifyNoOtherCalls(); } }