feat(cover-letter): add contextual AI workspace

This commit is contained in:
cesnimda
2026-08-28 12:34:17 +02:00
parent e3f938cb42
commit b6dcc7c760
7 changed files with 346 additions and 21 deletions
+49
View File
@@ -114,6 +114,55 @@ public sealed class AiWorkspaceTests
Assert.Contains("Professional", res.Title);
}
[Fact]
public async Task Cover_letter_uses_the_linked_cv_current_draft_and_requested_language()
{
var (db, svc, ai) = New("user-1");
await using var _ = db;
var jobId = await SeedJobAsync(db, "user-1");
var profile = new StructuredCvProfile
{
Contact = new StructuredCvContact { FullName = "Ada Example" },
Jobs =
{
new StructuredCvJob { Id = "visible-role", Title = "Backend Developer", Company = "Initech", Bullets = { "Built truthful .NET services" } },
new StructuredCvJob { Id = "hidden-role", Title = "Unrelated role", Company = "Hidden Corp", Bullets = { "Unrelated work" } },
},
Skills = { "C#", ".NET" },
};
db.CareerProfiles.Add(new CareerProfile
{
OwnerUserId = "user-1",
ProfileJson = StructuredCvProfileJson.Serialize(profile),
});
db.CvVariants.Add(new CvVariant
{
OwnerUserId = "user-1",
JobApplicationId = jobId,
Name = "Backend CV",
PublicSlug = Guid.NewGuid().ToString("N"),
SettingsJson = CvVariantSettingsJson.Serialize(new CvVariantSettings
{
Overrides = { ["hidden-role"] = new CvItemOverride { Hidden = true } },
}),
Version = 1,
CreatedAtUtc = DateTimeOffset.UtcNow,
UpdatedAtUtc = DateTimeOffset.UtcNow,
});
await db.SaveChangesAsync();
await svc.GenerateAsync("user-1", jobId, "master profile fallback", "Ada",
new AiGenerateRequest("cover-letter", "professional", null, "nb-NO", "Existing manual draft", "shorten"), "p", default);
Assert.Contains("CV BEING USED: Backend CV", ai.LastText);
Assert.Contains("Built truthful .NET services", ai.LastText);
Assert.DoesNotContain("Hidden Corp", ai.LastText);
Assert.Contains("CURRENT DOCUMENT TO REVISE", ai.LastText);
Assert.Contains("Existing manual draft", ai.LastText);
Assert.Contains("Norwegian Bokmål", ai.LastInstruction);
Assert.Contains("Shorten the current cover letter", ai.LastInstruction);
}
[Fact]
public async Task History_is_newest_first_and_filters_by_module()
{