첫 실행 시 외부 도구 설치 마법사를 띄우고 7종(FFmpeg·LibreOffice·Pandoc·ImageMagick·H2Orestart·agy·Codex)을 기본 전체 선택 상태로 순차 설치한다. - Core: ExternalToolCatalog(정적 카탈로그, winget ID 실검증), ExternalToolInstaller(winget 무인 실행·재감지 판정, IExternalCommandRunner 시드로 테스트 가능) - Core: ExternalToolDetector에 winget FFmpeg 스캔 + Pandoc/ImageMagick 감지 추가 - App: ToolSetupWindow + ToolSetupViewModel, 첫 실행 플래그(setup.tools.done), 설정 창 '외부 도구 설치/검증' 재진입 버튼 - Tests: ExternalToolInstallerTests 5건 - 기존 미커밋 작업(광고 Ads 지원: AdBannerControl/AdLargeCardControl/AdService, AI 백엔드 agy·switchboard·codex 채팅 클라이언트, 관련 테스트) 포함
69 lines
2.6 KiB
C#
69 lines
2.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Threading.Tasks;
|
|
using Everything2Everything.Core;
|
|
using Everything2Everything.Core.Converters;
|
|
using Xunit;
|
|
|
|
namespace Everything2Everything.Tests;
|
|
|
|
public class LlmProviderTests
|
|
{
|
|
private sealed class FakeStore : ISettingsStore
|
|
{
|
|
private readonly Dictionary<string, string> _d = new();
|
|
public string? Get(string key) => _d.TryGetValue(key, out var v) ? v : null;
|
|
public void Set(string key, string value) => _d[key] = value;
|
|
public void Remove(string key) => _d.Remove(key);
|
|
public bool Contains(string key) => _d.ContainsKey(key);
|
|
}
|
|
|
|
private static bool EnvHasKey()
|
|
=> !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("OPENAI_API_KEY"))
|
|
|| !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("ANTHROPIC_API_KEY"));
|
|
|
|
[Fact]
|
|
public async Task NoKey_IsNotReady()
|
|
{
|
|
// 환경변수 키 또는 codex/agy CLI(OAuth) 또는 Switchboard Gateway가 있으면 AI가 활성화되므로 이 단언은 건너뜀
|
|
if (EnvHasKey() || ExternalToolDetector.IsCodexAvailable() || ExternalToolDetector.IsAgyAvailable(out _) || ExternalToolDetector.IsSwitchboardGatewayAvailable(out _)) return;
|
|
var p = new LlmProvider(new FakeStore());
|
|
var a = await p.CheckAvailabilityAsync();
|
|
Assert.False(a.IsReady);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task WithKey_IsReady()
|
|
{
|
|
var store = new FakeStore();
|
|
store.Set("openai.apikey", "sk-test-key");
|
|
var p = new LlmProvider(store);
|
|
var a = await p.CheckAvailabilityAsync();
|
|
Assert.True(a.IsReady);
|
|
}
|
|
|
|
[Fact]
|
|
public void BuildPrompt_Translate_IncludesTargetLanguage()
|
|
{
|
|
var (system, user) = LlmProvider.BuildPrompt(
|
|
new AiOptions { Task = "translate", TargetLanguage = "일본어" }, "hello");
|
|
Assert.Contains("일본어", system);
|
|
Assert.Equal("hello", user);
|
|
}
|
|
|
|
[Fact]
|
|
public void BuildPrompt_Summarize_MentionsSummary()
|
|
{
|
|
var (system, _) = LlmProvider.BuildPrompt(new AiOptions { Task = "summarize" }, "text");
|
|
Assert.Contains("요약", system);
|
|
}
|
|
|
|
[Fact]
|
|
public void DefaultGraph_HasAiTextSelfEdge()
|
|
{
|
|
var graph = Everything2EverythingBootstrap.CreateDefault().Providers.Graph;
|
|
// AI self-edge(txt→txt)가 그래프에 존재 — 키 없으면 실행 시 NotReady로 비활성되지만 엣지는 등록됨
|
|
Assert.NotNull(graph.FindBestPath(".txt", ".txt"));
|
|
Assert.NotNull(graph.FindBestPath(".md", ".md"));
|
|
}
|
|
}
|