feat(cv-import): add source-grounded review and explicit corrections
This commit is contained in:
@@ -7,6 +7,60 @@ namespace JobTrackerApi.Tests;
|
||||
|
||||
public class CvDocumentImportTests
|
||||
{
|
||||
[Fact]
|
||||
public void Grounded_duplicate_skills_keep_evidence_at_their_final_normalized_indices()
|
||||
{
|
||||
var candidate = new StructuredCvProfile { Skills = { "C#", "C#", "SQL" } };
|
||||
var source = Document(("C#", "paragraph"), ("SQL", "paragraph"));
|
||||
var result = StructuredCvProfileJson.DeserializePersisted(StructuredCvProfileJson.SerializePersisted(CvDocumentReview.Ground(candidate, source)));
|
||||
Assert.Equal(new[] { "C#", "SQL" }, result.Skills);
|
||||
Assert.Equal("SQL", result.Metadata.Fields["skills.1"].SourceSnippet);
|
||||
Assert.DoesNotContain("skills.2", result.Metadata.Fields.Keys);
|
||||
}
|
||||
[Fact]
|
||||
public void Appended_bullet_metadata_follows_the_actual_destination_and_preserves_old_evidence()
|
||||
{
|
||||
var current = new StructuredCvProfile { Jobs = { new() { Title = "Engineer", Company = "Example", Start = "2020", End = "2021", Bullets = { "Old" } } } };
|
||||
current.Metadata.Fields["jobs.0.bullets.0"] = new() { SourceSnippet = "Old" };
|
||||
var incoming = new StructuredCvProfile { Jobs = { new() { Title = "Engineer", Company = "Example", Start = "2020", End = "2021", Bullets = { "New" } } } };
|
||||
incoming.Metadata.Fields["jobs.0.bullets.0"] = new() { SourceSnippet = "New" };
|
||||
var result = CvDocumentReview.Apply(current, incoming, new[] { new CvImportDecision("jobs.0.bullets.0", "use") });
|
||||
Assert.Equal(new[] { "Old", "New" }, result.Jobs[0].Bullets);
|
||||
Assert.Equal("Old", result.Metadata.Fields["jobs.0.bullets.0"].SourceSnippet);
|
||||
Assert.Equal("New", result.Metadata.Fields["jobs.0.bullets.1"].SourceSnippet);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Duplicate_imported_languages_and_jobs_do_not_create_duplicate_records()
|
||||
{
|
||||
var incoming = new StructuredCvProfile { Languages = { new() { Name = "English", Level = "B2" }, new() { Name = "English", Level = "B2" } }, Jobs = { new() { Title = "Engineer", Company = "A", Start = "2020", End = "2021" }, new() { Title = "Engineer", Company = "A", Start = "2020", End = "2021" }, new() { Title = "Engineer", Company = "A", Start = "2022", End = "2023" } } };
|
||||
var decisions = CvDocumentReview.Build(new(), incoming).SelectMany(g => g.Fields).Select(f => new CvImportDecision(f.Id, "use")).ToArray();
|
||||
var result = CvDocumentReview.Apply(new(), incoming, decisions);
|
||||
Assert.Single(result.Languages);
|
||||
Assert.Equal(2, result.Jobs.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Correcting_a_new_skill_to_an_existing_skill_keeps_metadata_on_a_real_item()
|
||||
{
|
||||
var result = CvDocumentReview.Apply(new() { Skills = { "C#" } }, new() { Skills = { "SQL" } }, new[] { new CvImportDecision("skills.0", "correct", "C#") });
|
||||
var persisted = StructuredCvProfileJson.DeserializePersisted(StructuredCvProfileJson.SerializePersisted(result));
|
||||
Assert.Single(persisted.Skills);
|
||||
Assert.Contains("skills.0", persisted.Metadata.Fields.Keys);
|
||||
Assert.DoesNotContain("skills.1", persisted.Metadata.Fields.Keys);
|
||||
}
|
||||
[Fact]
|
||||
public void Reviewed_metadata_retains_its_own_source_identity_across_later_imports()
|
||||
{
|
||||
var incoming = StructuredCvProfileJson.DeserializePersisted("""{"skills":["C#"],"metadata":{"fields":{"skills.0":{"method":"deterministic-source","sourceBlockId":"b0001","sourceArtifactId":21,"sourceExtractionRunId":7,"sourceFileSha256":"abc"}}}}""");
|
||||
var merged = CvDocumentReview.Apply(new(), incoming, new[] { new CvImportDecision("skills.0", "use") });
|
||||
using var json = System.Text.Json.JsonDocument.Parse(StructuredCvProfileJson.SerializePersisted(merged));
|
||||
var field = json.RootElement.GetProperty("metadata").GetProperty("fields").GetProperty("skills.0");
|
||||
Assert.True(field.TryGetProperty("sourceExtractionRunId", out var run));
|
||||
Assert.Equal(7, run.GetInt32());
|
||||
Assert.Equal(21, field.GetProperty("sourceArtifactId").GetInt32());
|
||||
Assert.Equal("abc", field.GetProperty("sourceFileSha256").GetString());
|
||||
}
|
||||
[Fact]
|
||||
public void Imported_contact_links_append_without_replacing_unrelated_existing_links()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user