Public Access
Fix past meeting summary tool edge cases
PR and Push Build/Test / build-and-test (push) Successful in 10m54s
PR and Push Build/Test / build-and-test (push) Successful in 10m54s
This commit is contained in:
@@ -56,6 +56,21 @@ public sealed class PastProjectMeetingSummaryToolTests
|
||||
Assert.Equal("Refused: project(s) not assigned to current meeting: Project Z.", refused);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ListPastProjectMeetingsRejectsOutOfScopeProjectsWhenMeetingHasNoProjects()
|
||||
{
|
||||
var root = CreateRoot();
|
||||
var artifacts = CreateArtifacts(root);
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(artifacts.MeetingNotePath)!);
|
||||
Directory.CreateDirectory(Path.Combine(root, "Meetings", "Summaries"));
|
||||
await WriteMeetingNoteAsync(artifacts.MeetingNotePath);
|
||||
var tools = CreateTools(artifacts, root);
|
||||
|
||||
var refused = await tools.ListPastProjectMeetings(["Project Z"]);
|
||||
|
||||
Assert.Equal("Refused: project(s) not assigned to current meeting: Project Z.", refused);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ReadPastProjectMeetingSummaryReadsOnlyScopedPastSummaryFiles()
|
||||
{
|
||||
@@ -83,6 +98,76 @@ public sealed class PastProjectMeetingSummaryToolTests
|
||||
Assert.StartsWith("Refused:", await tools.ReadPastProjectMeetingSummary(outside));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ReadPastProjectMeetingSummaryAcceptsSearchResultPastMeetingPrefix()
|
||||
{
|
||||
var root = CreateRoot();
|
||||
var artifacts = CreateArtifacts(root);
|
||||
var summariesRoot = Path.Combine(root, "Meetings", "Summaries");
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(artifacts.MeetingNotePath)!);
|
||||
Directory.CreateDirectory(summariesRoot);
|
||||
await WriteMeetingNoteAsync(artifacts.MeetingNotePath, "Project X");
|
||||
await WriteSummaryAsync(
|
||||
Path.Combine(summariesRoot, "project-x.md"),
|
||||
"Project X",
|
||||
"2026-05-28T09:00:00+02:00",
|
||||
"Project X",
|
||||
"searchable past meeting");
|
||||
var tools = CreateTools(artifacts, root);
|
||||
|
||||
var search = await tools.Search("searchable", ["Project X"]);
|
||||
var content = await tools.ReadPastProjectMeetingSummary("past-meetings/project-x.md");
|
||||
|
||||
Assert.Contains("past-meetings/project-x.md:", search);
|
||||
Assert.Contains("searchable past meeting", search);
|
||||
Assert.Contains("searchable past meeting", content);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ListPastProjectMeetingsIgnoresMalformedSummaryFrontmatter()
|
||||
{
|
||||
var root = CreateRoot();
|
||||
var artifacts = CreateArtifacts(root);
|
||||
var summariesRoot = Path.Combine(root, "Meetings", "Summaries");
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(artifacts.MeetingNotePath)!);
|
||||
Directory.CreateDirectory(summariesRoot);
|
||||
await WriteMeetingNoteAsync(artifacts.MeetingNotePath, "Project X");
|
||||
await WriteSummaryAsync(Path.Combine(summariesRoot, "project-x.md"), "Project X", "2026-05-28T09:00:00+02:00", "Project X");
|
||||
await File.WriteAllTextAsync(
|
||||
Path.Combine(summariesRoot, "broken.md"),
|
||||
"""
|
||||
---
|
||||
projects: [not valid
|
||||
---
|
||||
|
||||
broken
|
||||
""");
|
||||
var tools = CreateTools(artifacts, root);
|
||||
|
||||
var result = await tools.ListPastProjectMeetings();
|
||||
|
||||
Assert.Contains("project-x.md", result);
|
||||
Assert.DoesNotContain("broken.md", result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ListPastProjectMeetingsClampsRequestedPageToLastPage()
|
||||
{
|
||||
var root = CreateRoot();
|
||||
var artifacts = CreateArtifacts(root);
|
||||
var summariesRoot = Path.Combine(root, "Meetings", "Summaries");
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(artifacts.MeetingNotePath)!);
|
||||
Directory.CreateDirectory(summariesRoot);
|
||||
await WriteMeetingNoteAsync(artifacts.MeetingNotePath, "Project X");
|
||||
await WriteSummaryAsync(Path.Combine(summariesRoot, "project-x.md"), "Project X", "2026-05-28T09:00:00+02:00", "Project X");
|
||||
var tools = CreateTools(artifacts, root);
|
||||
|
||||
var result = await tools.ListPastProjectMeetings(page: 99, page_size: 1);
|
||||
|
||||
Assert.Contains("page 1/1", result);
|
||||
Assert.Contains("project-x.md", result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task SearchIncludesProjectFilesAndScopedPastMeetingSummaries()
|
||||
{
|
||||
@@ -111,6 +196,20 @@ public sealed class PastProjectMeetingSummaryToolTests
|
||||
Assert.Equal("Refused: project(s) not assigned to current meeting: Project Z.", refused);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task SearchReportsInvalidPatternInsteadOfNoMatches()
|
||||
{
|
||||
var root = CreateRoot();
|
||||
var artifacts = CreateArtifacts(root);
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(artifacts.MeetingNotePath)!);
|
||||
await WriteMeetingNoteAsync(artifacts.MeetingNotePath, "Project X");
|
||||
var tools = CreateTools(artifacts, root);
|
||||
|
||||
var result = await tools.Search("[", ["Project X"]);
|
||||
|
||||
Assert.StartsWith("Search failed: invalid .NET regular expression:", result);
|
||||
}
|
||||
|
||||
private static string CreateRoot()
|
||||
{
|
||||
return Path.Combine(Path.GetTempPath(), "meeting-assistant-tests", Guid.NewGuid().ToString("N"));
|
||||
|
||||
Reference in New Issue
Block a user