using System.IO; using System.Text.Json; using AxCopilot.Services.Agent; using DocumentFormat.OpenXml.Packaging; using FluentAssertions; using Xunit; namespace AxCopilot.Tests.Services; public class PptxSkillAutoRepairTests { [Fact] public async Task ExecuteAsync_ShouldAugmentDeckAndReturnQualitySummary() { var workDir = Path.Combine(Path.GetTempPath(), "ax-pptx-repair-" + Guid.NewGuid().ToString("N")); Directory.CreateDirectory(workDir); try { var context = new AgentContext { WorkFolder = workDir, Permission = "Auto", OperationMode = "external", }; var tool = new PptxSkill(); var args = JsonDocument.Parse( """ { "path": "auto-repair-deck.pptx", "title": "Operating Improvement", "objective": "operating model proposal", "decision_ask": "approve phase-1 launch", "slides": [ { "layout": "before_after", "title": "Current vs Future", "before": ["Manual coordination", "Slow approvals", "Fragmented KPI tracking"], "after": ["Standard workflow", "Faster approvals", "Single KPI view"] }, { "layout": "benefit_waterfall", "title": "Benefits", "benefits": [ { "label": "Cost", "value": 8 }, { "label": "Speed", "value": 12 }, { "label": "Quality", "value": 6 } ] } ] } """).RootElement; var result = await tool.ExecuteAsync(args, context, CancellationToken.None); var outputPath = Path.Combine(workDir, "auto-repair-deck.pptx"); result.Success.Should().BeTrue(); result.Output.Should().Contain("PPT quality"); result.Output.Should().Contain("Storyline:"); File.Exists(outputPath).Should().BeTrue(); using var doc = PresentationDocument.Open(outputPath, false); doc.PresentationPart!.Presentation.SlideIdList!.Count().Should().BeGreaterThanOrEqualTo(6); } finally { try { if (Directory.Exists(workDir)) Directory.Delete(workDir, true); } catch { } } } [Fact] public async Task ExecuteAsync_ShouldRefineWeakDeckBeforeExport() { var workDir = Path.Combine(Path.GetTempPath(), "ax-pptx-refine-" + Guid.NewGuid().ToString("N")); Directory.CreateDirectory(workDir); try { var context = new AgentContext { WorkFolder = workDir, Permission = "Auto", OperationMode = "external", }; var tool = new PptxSkill(); var args = JsonDocument.Parse( """ { "path": "refined-deck.pptx", "title": "Quarterly Steering Deck", "objective": "approve the next delivery wave", "slides": [ { "layout": "executive_summary", "title": "Executive Summary", "body": [ "Approve the next delivery wave", "The delivery plan should move forward" ] }, { "layout": "comparison", "title": "Options", "options": [ { "name": "Conservative" }, { "name": "Balanced" } ] }, { "layout": "roadmap", "title": "Roadmap", "phases": [ { "title": "Kickoff", "owner": "담당 미정" } ] }, { "layout": "chart", "title": "Trend", "chart_labels": ["Jan", "Feb", "Mar"], "chart_values": [10, 13, 16] }, { "layout": "kpi_dashboard", "title": "KPI Snapshot", "kpis": [ { "label": "Revenue", "value": "+9%" }, { "label": "Cycle Time", "value": "-6%" }, { "label": "Stability", "value": "96%" } ] } ] } """).RootElement; var result = await tool.ExecuteAsync(args, context, CancellationToken.None); result.Success.Should().BeTrue(); result.Output.Should().Contain("PPT quality"); result.Output.Should().Contain("Needs work: none"); result.Output.Should().Contain("Auto-repair:"); File.Exists(Path.Combine(workDir, "refined-deck.pptx")).Should().BeTrue(); } finally { try { if (Directory.Exists(workDir)) Directory.Delete(workDir, true); } catch { } } } }