Chapter officers can merge a markdown note onto filtered students, teams, or events and save the recipe. Extra student-note columns are additional fields (any ## … fields heading) so they work as print tokens whether imported or typed by hand. Co-authored-by: Cursor <cursoragent@cursor.com>
208 lines
7.0 KiB
C#
208 lines
7.0 KiB
C#
using Core.Notes;
|
|
|
|
namespace Tests.Notes;
|
|
|
|
[TestFixture]
|
|
public class ImportedFieldsTable_Tests
|
|
{
|
|
[Test]
|
|
public void NormalizeValue_X_BecomesYes()
|
|
{
|
|
Assert.That(ImportedFieldsTable.NormalizeValue("x"), Is.EqualTo("Yes"));
|
|
Assert.That(ImportedFieldsTable.NormalizeValue("X"), Is.EqualTo("Yes"));
|
|
Assert.That(ImportedFieldsTable.NormalizeValue(" x "), Is.EqualTo("Yes"));
|
|
}
|
|
|
|
[Test]
|
|
public void NormalizeValue_Blank_StaysEmpty()
|
|
{
|
|
Assert.That(ImportedFieldsTable.NormalizeValue(null), Is.EqualTo(string.Empty));
|
|
Assert.That(ImportedFieldsTable.NormalizeValue(" "), Is.EqualTo(string.Empty));
|
|
}
|
|
|
|
[Test]
|
|
public void Merge_IncomingWins_AndAppendsNewFields()
|
|
{
|
|
var existing = """
|
|
Freeform note
|
|
|
|
## Imported fields
|
|
|
|
| Field | Value |
|
|
| --- | --- |
|
|
| Interview Time | 1:00-1:15 |
|
|
| Application | Yes |
|
|
""";
|
|
|
|
var result = ImportedFieldsTable.Merge(existing,
|
|
[
|
|
new ImportedField("Interview Time", "3:20-3:35"),
|
|
new ImportedField("Teacher Rec 1", "Fuqua")
|
|
]);
|
|
|
|
Assert.That(result.Changed, Is.True);
|
|
Assert.That(result.Changes, Has.Count.EqualTo(2));
|
|
var fields = ImportedFieldsTable.ParseFields(result.Markdown);
|
|
Assert.That(fields.Single(f => f.Name == "Interview Time").Value, Is.EqualTo("3:20-3:35"));
|
|
Assert.That(fields.Single(f => f.Name == "Application").Value, Is.EqualTo("Yes"));
|
|
Assert.That(fields.Single(f => f.Name == "Teacher Rec 1").Value, Is.EqualTo("Fuqua"));
|
|
Assert.That(result.Markdown, Does.Contain("Freeform note"));
|
|
Assert.That(result.Markdown, Does.Contain(ImportedFieldsTable.Heading));
|
|
Assert.That(result.Markdown, Does.Not.Contain("## Imported fields"));
|
|
}
|
|
|
|
[Test]
|
|
public void ParseFields_ReadsAnyFieldsHeading()
|
|
{
|
|
foreach (var heading in new[] { "## Additional fields", "## Imported fields", "## Extra fields" })
|
|
{
|
|
var markdown = $"""
|
|
{heading}
|
|
|
|
| Field | Value |
|
|
| --- | --- |
|
|
| Allergies | peanuts |
|
|
""";
|
|
|
|
Assert.That(ImportedFieldsTable.GetFieldValue(markdown, "Allergies"), Is.EqualTo("peanuts"), heading);
|
|
}
|
|
|
|
var otherHeading = """
|
|
## Advisor comments
|
|
|
|
| Field | Value |
|
|
| --- | --- |
|
|
| Allergies | peanuts |
|
|
""";
|
|
Assert.That(ImportedFieldsTable.GetFieldValue(otherHeading, "Allergies"), Is.Null);
|
|
}
|
|
|
|
[Test]
|
|
public void Merge_SameDataTwice_IsNoOp()
|
|
{
|
|
var first = ImportedFieldsTable.Merge(null,
|
|
[
|
|
new ImportedField("Interview Time", "3:20-3:35"),
|
|
new ImportedField("Application", "x")
|
|
]);
|
|
|
|
Assert.That(first.Changed, Is.True);
|
|
Assert.That(ImportedFieldsTable.ParseFields(first.Markdown).Single(f => f.Name == "Application").Value, Is.EqualTo("Yes"));
|
|
|
|
var second = ImportedFieldsTable.Merge(first.Markdown,
|
|
[
|
|
new ImportedField("Interview Time", "3:20-3:35"),
|
|
new ImportedField("Application", "x")
|
|
]);
|
|
|
|
Assert.That(second.Changed, Is.False);
|
|
Assert.That(second.Changes, Is.Empty);
|
|
Assert.That(ImportedFieldsTable.ParseFields(second.Markdown), Is.EqualTo(ImportedFieldsTable.ParseFields(first.Markdown)));
|
|
}
|
|
|
|
[Test]
|
|
public void GetFieldValue_ReadsImportedTable()
|
|
{
|
|
var markdown = ImportedFieldsTable.FormatSection(
|
|
[
|
|
new ImportedField("Interview Time", "3:20-3:35")
|
|
]);
|
|
|
|
Assert.That(ImportedFieldsTable.GetFieldValue(markdown, "Interview Time"), Is.EqualTo("3:20-3:35"));
|
|
Assert.That(ImportedFieldsTable.GetFieldValue(markdown, "Application"), Is.Null);
|
|
}
|
|
|
|
[Test]
|
|
public void Merge_PreservesTextAfterSection()
|
|
{
|
|
var existing = """
|
|
## Imported fields
|
|
|
|
| Field | Value |
|
|
| --- | --- |
|
|
| Application | Yes |
|
|
|
|
## Advisor comments
|
|
|
|
Great interview.
|
|
""";
|
|
|
|
var result = ImportedFieldsTable.Merge(existing, [new ImportedField("Application", "Yes")]);
|
|
Assert.That(result.Changed, Is.False);
|
|
Assert.That(result.Markdown, Does.Contain("## Advisor comments"));
|
|
Assert.That(result.Markdown, Does.Contain("Great interview."));
|
|
}
|
|
|
|
[Test]
|
|
public void ParseFields_KeepsBlankValues()
|
|
{
|
|
var markdown = ImportedFieldsTable.FormatSection(
|
|
[
|
|
new ImportedField("Application", "Yes"),
|
|
new ImportedField("Teacher Rec 3", "")
|
|
]);
|
|
|
|
var fields = ImportedFieldsTable.ParseFields(markdown);
|
|
Assert.That(fields.Single(f => f.Name == "Teacher Rec 3").Value, Is.EqualTo(string.Empty));
|
|
Assert.That(ImportedFieldsTable.GetFieldValue(markdown, "Teacher Rec 3"), Is.EqualTo(string.Empty));
|
|
}
|
|
|
|
[Test]
|
|
public void Merge_BlankFields_SameDataTwice_IsNoOp()
|
|
{
|
|
var first = ImportedFieldsTable.Merge(null,
|
|
[
|
|
new ImportedField("Interview Time", "3:20-3:35"),
|
|
new ImportedField("Teacher Rec 3", "")
|
|
]);
|
|
|
|
Assert.That(first.Changed, Is.True);
|
|
Assert.That(ImportedFieldsTable.ParseFields(first.Markdown), Has.Count.EqualTo(2));
|
|
|
|
var second = ImportedFieldsTable.Merge(first.Markdown,
|
|
[
|
|
new ImportedField("Interview Time", "3:20-3:35"),
|
|
new ImportedField("Teacher Rec 3", "")
|
|
]);
|
|
|
|
Assert.That(second.Changed, Is.False);
|
|
Assert.That(second.Changes, Is.Empty);
|
|
}
|
|
|
|
[Test]
|
|
public void Merge_IncomingBlank_ClearsExistingValue()
|
|
{
|
|
var existing = ImportedFieldsTable.Merge(null, [new ImportedField("Teacher Rec 1", "Fuqua")]).Markdown;
|
|
var result = ImportedFieldsTable.Merge(existing, [new ImportedField("Teacher Rec 1", "")]);
|
|
|
|
Assert.That(result.Changed, Is.True);
|
|
Assert.That(ImportedFieldsTable.GetFieldValue(result.Markdown, "Teacher Rec 1"), Is.EqualTo(string.Empty));
|
|
}
|
|
|
|
[Test]
|
|
public void GetFieldValue_IsCaseInsensitive()
|
|
{
|
|
var markdown = ImportedFieldsTable.FormatSection([new ImportedField("Interview Time", "3:20-3:35")]);
|
|
Assert.That(ImportedFieldsTable.GetFieldValue(markdown, "interview time"), Is.EqualTo("3:20-3:35"));
|
|
}
|
|
|
|
[Test]
|
|
public void DistinctFieldNames_UnionsNotes_AndKeepsFirstCasing()
|
|
{
|
|
var first = ImportedFieldsTable.FormatSection(
|
|
[
|
|
new ImportedField("Interview Time", "3:20-3:35"),
|
|
new ImportedField("Application", "Yes")
|
|
]);
|
|
var second = ImportedFieldsTable.FormatSection(
|
|
[
|
|
new ImportedField("application", "Yes"),
|
|
new ImportedField("Teacher Rec 1", "Fuqua")
|
|
]);
|
|
|
|
var names = ImportedFieldsTable.DistinctFieldNames([first, second, null, ""]);
|
|
|
|
Assert.That(names, Is.EqualTo(new[] { "Application", "Interview Time", "Teacher Rec 1" }));
|
|
}
|
|
}
|