Agents\AgentConfigurationTests.cs (123)
32var path = Path.Combine(_context.Project.FullName, "settings.json");
55var path = Path.Combine(_context.Project.FullName, "settings.json");
81var path = Path.Combine(_context.Project.FullName, "settings.json");
108var path = Path.Combine(_context.Project.FullName, "settings.json");
133var directory = Path.Combine(_context.Project.FullName, "missing");
143Assert.Empty(Directory.GetFiles(_context.Project.FullName, "*", SearchOption.AllDirectories));
151var path = Path.Combine(_context.Project.FullName, "settings.json");
163Assert.Equal(existed ? [path] : [], Directory.GetFiles(_context.Project.FullName));
173var path = Path.Combine(_context.Project.FullName, "settings.json");
188Assert.Equal([path], Directory.GetFiles(_context.Project.FullName));
196var path = _context.Copilot.GetIntegrationConfigPath(AgentConfigurationScope.Project, _context.Project);
204await _context.Copilot.UpdateIntegrationConfigAsync(
205config, _context.Project, AgentConfigurationScope.Project, edit, CancellationToken.None);
210Assert.Equal([path], Directory.GetFiles(_context.Project.FullName, "*", SearchOption.AllDirectories));
219var client = _context.Clients.Single(client => string.Equals(client.Id, clientId, StringComparisons.AgentClientId));
220var inherited = client.GetIntegrationConfigPath(AgentConfigurationScope.Global, _context.Project);
222var path = client.GetIntegrationConfigPath(AgentConfigurationScope.Project, _context.Project);
226config, _context.Project, AgentConfigurationScope.Project, edit, CancellationToken.None);
242var directory = Path.Combine(_context.ClaudeManagedDirectory, "managed-settings.d");
252var path = _context.ClaudeCode.GetIntegrationConfigPath(AgentConfigurationScope.Project, _context.Project);
255await _context.ClaudeCode.UpdateIntegrationConfigAsync(
256config, _context.Project, AgentConfigurationScope.Project, edit, CancellationToken.None);
272Assert.Empty(Directory.GetFiles(_context.Project.FullName, "*", SearchOption.AllDirectories));
278var directory = Path.Combine(_context.ClaudeManagedDirectory, "managed-settings.d");
280var path = _context.ClaudeCode.GetIntegrationConfigPath(AgentConfigurationScope.Project, _context.Project);
283await _context.ClaudeCode.UpdateIntegrationConfigAsync(
284config, _context.Project, AgentConfigurationScope.Project, edit, CancellationToken.None);
295var path = _context.OpenCode.GetIntegrationConfigPath(AgentConfigurationScope.Global, _context.Project);
299await _context.OpenCode.UpdateIntegrationConfigAsync(
300remote, _context.Project, AgentConfigurationScope.Global, remoteEdit, CancellationToken.None);
302var (mcp, mcpPath) = await _context.OpenCode.ReadMcpConfigAsync(
303path, _context.Project, AgentConfigurationScope.Global, mcpEdit, CancellationToken.None);
304_context.OpenCode.UpdateMcpConfig(mcp, mcpPath, configureServer: true, AgentConfigurationScope.Global);
324var path = Path.Combine(_context.Project.FullName, "settings.json");
325var target = Path.Combine(_context.Project.FullName, "linked.json");
355var path = Path.Combine(_context.Project.FullName, "settings.json");
356var directory = _context.Project.GetAccessControl();
360_context.Project.SetAccessControl(directory);
387Assert.Equal([path], Directory.GetFiles(_context.Project.FullName));
401var path = Path.Combine(_context.Project.FullName, "settings.json");
408TestPosixAcl.SetDefault(_context.Project.FullName, "user::rwx,user:65534:r-x,group::---,mask::r-x,other::---");
423Assert.Equal([path], Directory.GetFiles(_context.Project.FullName));
434var path = Path.Combine(_context.Project.FullName, "settings.json");
461var path = Path.Combine(_context.Project.FullName, "settings.json");
516Assert.Equal([path], Directory.GetFiles(_context.Project.FullName));
522IAgentClient[] clients = [_context.Copilot];
524var projectResults = await _context.ConfigureIntegrationAsync(AgentConfigurationScope.Project, clients).DefaultTimeout();
525Assert.Equal(Path.Combine(_context.Project.FullName, ".github", "copilot", "settings.json"),
527Assert.Empty(_context.Home.EnumerateFileSystemInfos());
528var userResults = await _context.ConfigureIntegrationAsync(AgentConfigurationScope.Global, clients).DefaultTimeout();
537Assert.Equal(Path.Combine(_context.CopilotDirectory, "settings.json"), Assert.Single(userResults).TargetPath);
538var project = await File.ReadAllTextAsync(Path.Combine(_context.Project.FullName, ".github", "copilot", "settings.json")).DefaultTimeout();
539var user = await File.ReadAllTextAsync(Path.Combine(_context.CopilotDirectory, "settings.json")).DefaultTimeout();
541Assert.False(Directory.Exists(Path.Combine(_context.Project.FullName, ".vscode")));
549var userPath = Path.Combine(_context.ClaudeDirectory, "settings.json");
565Directory.CreateDirectory(_context.ClaudeDirectory);
570var results = await _context.ConfigureIntegrationAsync(AgentConfigurationScope.Global, [_context.ClaudeCode]).DefaultTimeout();
575await _context.ConfigureIntegrationAsync(AgentConfigurationScope.Project, [_context.ClaudeCode]).DefaultTimeout();
576var project = await File.ReadAllTextAsync(Path.Combine(_context.Project.FullName, ".claude", "settings.json")).DefaultTimeout();
592var client = _context.Clients.Single(client => string.Equals(client.Id, clientId, StringComparisons.AgentClientId));
593var path = local ? Path.Combine(_context.Project.FullName, ".claude", "settings.local.json")
594: client.GetIntegrationConfigPath(AgentConfigurationScope.Global, _context.Project);
597var results = await _context.ConfigureIntegrationAsync(AgentConfigurationScope.Project, [client]).DefaultTimeout();
602Directory.EnumerateFiles(_context.Project.FullName, "*", SearchOption.AllDirectories));
603Assert.False(File.Exists(client.GetIntegrationConfigPath(AgentConfigurationScope.Project, _context.Project)));
613? Path.Combine(_context.ClaudeManagedDirectory, "managed-settings.d", "team.json")
614: Path.Combine(_context.ClaudeManagedDirectory, "managed-settings.json");
616var target = Path.Combine(_context.Project.FullName, ".claude", "settings.json");
624var results = await _context.ConfigureIntegrationAsync(AgentConfigurationScope.Project, [_context.ClaudeCode]);
636Assert.Empty(_context.Project.EnumerateFileSystemInfos());
638Assert.Empty(_context.Home.EnumerateFileSystemInfos());
649var user = Path.Combine(_context.ClaudeDirectory, "settings.json");
652var target = Path.Combine(_context.Project.FullName, ".claude", "settings.json");
655var results = await _context.ConfigureIntegrationAsync(AgentConfigurationScope.Project, [_context.ClaudeCode]);
667var custom = Path.Combine(_context.Home.FullName, "claude-work");
668_context.SetVariable("CLAUDE_CONFIG_DIR", custom);
673var results = await _context.ConfigureIntegrationAsync(AgentConfigurationScope.Global, [_context.ClaudeCode]).DefaultTimeout();
677Assert.False(File.Exists(Path.Combine(_context.Home.FullName, ".claude.json")));
684_context.SetVariable("COPILOT_HOME", Path.Combine(_context.Project.FullName, ".github", "copilot"));
685var results = await _context.ConfigureIntegrationAsync(AgentConfigurationScope.Global, [_context.Copilot]).DefaultTimeout();
686var repeated = await _context.ConfigureIntegrationAsync(AgentConfigurationScope.Global, [_context.Copilot]).DefaultTimeout();
689Assert.Equal(Path.Combine(_context.Project.FullName, ".github", "copilot", "settings.json"), results[0].TargetPath);
690Assert.Equal([results[0].TargetPath], Directory.EnumerateFiles(_context.Project.FullName, "*", SearchOption.AllDirectories));
691Assert.Empty(_context.Home.EnumerateFileSystemInfos());
698_context.SetVariable("COPILOT_HOME", _context.ClaudeDirectory);
700var results = await _context.ConfigureIntegrationAsync(
701AgentConfigurationScope.Global, [_context.Copilot, _context.ClaudeCode]);
705Assert.Equal([_context.Copilot, _context.ClaudeCode], result.Clients);
706Assert.Equal([result.TargetPath], Directory.EnumerateFiles(_context.Home.FullName, "*", SearchOption.AllDirectories));
714_context.SetVariable("COPILOT_HOME", Path.Combine(_context.ClaudeDirectory, suffix));
715var path = Path.Combine(_context.ClaudeDirectory, "settings.json");
719Path.Combine(_context.ClaudeManagedDirectory, "managed-settings.json"),
722var results = await _context.ConfigureIntegrationAsync(
723AgentConfigurationScope.Global, [_context.Copilot, _context.ClaudeCode]);
727Assert.Equal([_context.Copilot, _context.ClaudeCode], result.Clients);
734var unreadable = Path.Combine(_context.Project.FullName, ".github", "copilot", "settings.json");
736var results = await _context.ConfigureIntegrationAsync(
737AgentConfigurationScope.Project, [_context.Copilot, _context.ClaudeCode]);
741Assert.True(File.Exists(Path.Combine(_context.Project.FullName, ".claude", "settings.json")));
750await Assert.ThrowsAnyAsync<OperationCanceledException>(() => _context.ConfigureIntegrationAsync(
751AgentConfigurationScope.Project, [_context.Copilot], cancellation.Token)).DefaultTimeout();
753Assert.Empty(_context.Project.EnumerateFileSystemInfos());
754Assert.Empty(_context.Home.EnumerateFileSystemInfos());
757public void Dispose() => _context.Dispose();