using AxCopilot.Services.Agent; using FluentAssertions; using Xunit; namespace AxCopilot.Tests.Services; public class ArtifactQualityReviewServiceTests { [Fact] public void ReviewHtml_ShouldDetectRichBusinessStructure() { var html = """

Executive Summary

Summary text.

Another supporting paragraph.

Current State

Current state detail.

Evidence paragraph.

Important message
MetricValue
NPS61

Recommendation

Recommendation text.

Action support text.

Appendix

Reference detail.

More detail.

"""; var review = ArtifactQualityReviewService.ReviewHtml("Board Report", html, hasCover: true, hasTableOfContents: true, printReady: true); review.Score.Should().BeGreaterThan(75); review.Strengths.Should().Contain(s => s.Contains("커버") || s.Contains("목차")); review.Issues.Should().NotContain(i => i.Severity == ArtifactReviewSeverity.Critical); } [Fact] public void ReviewStructuredDocument_ShouldFlagMissingExecutiveSections() { var review = ArtifactQualityReviewService.ReviewStructuredDocument(new StructuredDocumentReviewInput( "Ops Memo", 2, 600, 0, 0, 0, 0, 0, false, false, false, false, false, false, false)); review.Issues.Should().Contain(i => i.Message.Contains("Executive Summary")); review.Issues.Should().Contain(i => i.Message.Contains("권고안")); } [Fact] public void ReviewWorkbook_ShouldFlagMissingSummaryForMultiSheet() { var review = ArtifactQualityReviewService.ReviewWorkbook(new WorkbookReviewInput( "PMO Tracker", 3, 3, 40, 2, 0, 0, false, false, false)); review.Issues.Should().Contain(i => i.Message.Contains("요약 시트")); review.Score.Should().BeLessThan(80); } }