Optional, opt-in (online_inbox.enabled, default false → zero network). Worker-side reconcile loop: pull web-created tasks down as Idle, push the list catalog and the Idle backlog mirror up. Auth behind IOnlineAuthProvider (StaticTokenAuthProvider default; ZitadelAuthProvider stubbed for Phase 2). DPAPI refresh-token store. 35 tests, no real network/Zitadel/Claude. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
79 lines
2.7 KiB
C#
79 lines
2.7 KiB
C#
using System.Text.Json;
|
|
using ClaudeDo.Worker.Config;
|
|
using ClaudeDo.Worker.Online;
|
|
|
|
namespace ClaudeDo.Worker.Tests.Online;
|
|
|
|
public sealed class OnlineInboxConfigTests : IDisposable
|
|
{
|
|
private readonly string _configPath = Path.Combine(Path.GetTempPath(), $"worker_cfg_{Guid.NewGuid():N}.json");
|
|
|
|
public void Dispose()
|
|
{
|
|
try { File.Delete(_configPath); } catch { }
|
|
}
|
|
|
|
[Fact]
|
|
public void MissingSection_Returns_DisabledDefaults()
|
|
{
|
|
File.WriteAllText(_configPath, "{}");
|
|
var cfg = WorkerConfig.Load(_configPath);
|
|
|
|
Assert.False(cfg.OnlineInbox.Enabled);
|
|
Assert.Equal("", cfg.OnlineInbox.ApiBaseUrl);
|
|
Assert.Equal(60, cfg.OnlineInbox.PollIntervalSeconds);
|
|
Assert.Equal("", cfg.OnlineInbox.Zitadel.Authority);
|
|
Assert.Equal("", cfg.OnlineInbox.Zitadel.ClientId);
|
|
Assert.Equal("openid offline_access", cfg.OnlineInbox.Zitadel.Scopes);
|
|
}
|
|
|
|
[Fact]
|
|
public void MissingFile_Returns_DisabledDefaults()
|
|
{
|
|
var cfg = WorkerConfig.Load(Path.Combine(Path.GetTempPath(), $"nonexistent_{Guid.NewGuid():N}.json"));
|
|
|
|
Assert.False(cfg.OnlineInbox.Enabled);
|
|
Assert.Equal(60, cfg.OnlineInbox.PollIntervalSeconds);
|
|
}
|
|
|
|
[Fact]
|
|
public void PopulatedSection_RoundTrips()
|
|
{
|
|
var json = """
|
|
{
|
|
"online_inbox": {
|
|
"enabled": true,
|
|
"api_base_url": "https://inbox.claudedo.kuns.dev",
|
|
"poll_interval_seconds": 120,
|
|
"zitadel": {
|
|
"authority": "https://auth.example.com",
|
|
"client_id": "abc123",
|
|
"scopes": "openid offline_access profile"
|
|
}
|
|
}
|
|
}
|
|
""";
|
|
File.WriteAllText(_configPath, json);
|
|
var cfg = WorkerConfig.Load(_configPath);
|
|
|
|
Assert.True(cfg.OnlineInbox.Enabled);
|
|
Assert.Equal("https://inbox.claudedo.kuns.dev", cfg.OnlineInbox.ApiBaseUrl);
|
|
Assert.Equal(120, cfg.OnlineInbox.PollIntervalSeconds);
|
|
Assert.Equal("https://auth.example.com", cfg.OnlineInbox.Zitadel.Authority);
|
|
Assert.Equal("abc123", cfg.OnlineInbox.Zitadel.ClientId);
|
|
Assert.Equal("openid offline_access profile", cfg.OnlineInbox.Zitadel.Scopes);
|
|
}
|
|
|
|
[Fact]
|
|
public void PartialSection_UsesDefaultsForMissingFields()
|
|
{
|
|
var json = """{"online_inbox": {"enabled": true}}""";
|
|
File.WriteAllText(_configPath, json);
|
|
var cfg = WorkerConfig.Load(_configPath);
|
|
|
|
Assert.True(cfg.OnlineInbox.Enabled);
|
|
Assert.Equal("", cfg.OnlineInbox.ApiBaseUrl);
|
|
Assert.Equal(60, cfg.OnlineInbox.PollIntervalSeconds);
|
|
}
|
|
}
|