1
0
Fork 0
Everything2Everything/src/Everything2Everything.Tests/LlmProviderTests.cs
Yun Chan 6a41c4a0dc feat(tools): add first-run external tool installer wizard and catalog
첫 실행 시 외부 도구 설치 마법사를 띄우고 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 채팅 클라이언트, 관련 테스트) 포함
2026-09-07 21:16:49 +09:00

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"));
}
}