tests: work on writing tests for console functionality
This commit is contained in:
@@ -10,10 +10,11 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="coverlet.collector" Version="6.0.2" />
|
<PackageReference Include="coverlet.collector" Version="6.0.2" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
|
||||||
|
<PackageReference Include="Moq" Version="4.20.72" />
|
||||||
<PackageReference Include="xunit" Version="2.9.2" />
|
<PackageReference Include="xunit" Version="2.9.2" />
|
||||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
|
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
|
||||||
<PackageReference Include="RichardSzalay.MockHttp" Version="7.0.0" />
|
<PackageReference Include="RichardSzalay.MockHttp" Version="7.0.0" />
|
||||||
<PackageReference Include="FluentAssertions" Version="7.1.0" />
|
<PackageReference Include="FluentAssertions" Version="7.2.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -2,5 +2,15 @@ namespace AltGen.Console.Tests.Unit;
|
|||||||
|
|
||||||
public class AddConfigCommandTests
|
public class AddConfigCommandTests
|
||||||
{
|
{
|
||||||
|
[Fact]
|
||||||
|
public Task ExecuteAsync_WhenSettingsDoNotExist_ItShouldCreateSettings()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public Task ExecuteAsync_WhenSettingsExist_ItShouldUpdateSettings()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,82 @@ namespace AltGen.Console.Tests.Unit;
|
|||||||
|
|
||||||
public class AppSettingsTests
|
public class AppSettingsTests
|
||||||
{
|
{
|
||||||
|
readonly Mock<IFileSystem> _fileSystemMock = new();
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void AddOrUpdateProvider_WhenProviderDoesNotExist_ItShouldAddProvider()
|
||||||
|
{
|
||||||
|
var providerSettings = new ProviderSettings("provider", "key", true);
|
||||||
|
|
||||||
|
var commandSettings = new AddConfigCommand.Settings(_fileSystemMock.Object)
|
||||||
|
{
|
||||||
|
Provider = providerSettings.Provider,
|
||||||
|
Key = providerSettings.Key,
|
||||||
|
Default = providerSettings.Default,
|
||||||
|
};
|
||||||
|
|
||||||
|
var appSettings = new AppSettings([]);
|
||||||
|
|
||||||
|
var updatedAppSettings = appSettings.AddOrUpdateProvider(commandSettings);
|
||||||
|
|
||||||
|
updatedAppSettings.Should().BeEquivalentTo(new AppSettings([providerSettings]));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void AddOrUpdateProvider_WhenProviderDoesExist_ItShouldUpdateProvider()
|
||||||
|
{
|
||||||
|
var providerSettings = new ProviderSettings("provider", "key", true);
|
||||||
|
var existingProviderSettings = new ProviderSettings("provider", "key", false);
|
||||||
|
|
||||||
|
var commandSettings = new AddConfigCommand.Settings(_fileSystemMock.Object)
|
||||||
|
{
|
||||||
|
Provider = providerSettings.Provider,
|
||||||
|
Key = providerSettings.Key,
|
||||||
|
Default = providerSettings.Default,
|
||||||
|
};
|
||||||
|
|
||||||
|
var appSettings = new AppSettings([existingProviderSettings]);
|
||||||
|
var updatedAppSettings = appSettings.AddOrUpdateProvider(commandSettings);
|
||||||
|
|
||||||
|
updatedAppSettings.Should().BeEquivalentTo(new AppSettings([providerSettings]));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void AddOrUpdateProvider_WhenExistingProviderIsSetToDefaultAndNewDefaultGiven_ItShouldUpdateProvidersCorrectly()
|
||||||
|
{
|
||||||
|
var providerSettings = new ProviderSettings("claude", "key", true);
|
||||||
|
var existingProviderSettings = new ProviderSettings("gemini", "key", true);
|
||||||
|
|
||||||
|
var commandSettings = new AddConfigCommand.Settings(_fileSystemMock.Object)
|
||||||
|
{
|
||||||
|
Provider = providerSettings.Provider,
|
||||||
|
Key = providerSettings.Key,
|
||||||
|
Default = providerSettings.Default,
|
||||||
|
};
|
||||||
|
|
||||||
|
var appSettings = new AppSettings([existingProviderSettings]);
|
||||||
|
var updatedAppSettings = appSettings.AddOrUpdateProvider(commandSettings);
|
||||||
|
|
||||||
|
updatedAppSettings.Should().BeEquivalentTo(new AppSettings([
|
||||||
|
providerSettings,
|
||||||
|
existingProviderSettings with { Default = false }
|
||||||
|
]));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void RemoveProvider_WhenProviderExists_ItShouldRemoveProvider()
|
||||||
|
{
|
||||||
|
var existingProviderSettings = new ProviderSettings("provider", "key", true);
|
||||||
|
|
||||||
|
var commandSettings = new RemoveConfigCommand.Settings(_fileSystemMock.Object)
|
||||||
|
{
|
||||||
|
Provider = existingProviderSettings.Provider,
|
||||||
|
};
|
||||||
|
|
||||||
|
var appSettings = new AppSettings([existingProviderSettings]);
|
||||||
|
|
||||||
|
var updatedAppSettings = appSettings.RemoveProvider(commandSettings);
|
||||||
|
|
||||||
|
updatedAppSettings.Should().BeEquivalentTo(new AppSettings([]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -2,4 +2,22 @@ namespace AltGen.Console.Tests.Unit;
|
|||||||
|
|
||||||
public class RemoveConfigCommandTests
|
public class RemoveConfigCommandTests
|
||||||
{
|
{
|
||||||
|
[Fact]
|
||||||
|
public Task ExecuteAsync_WhenSettingsDoNotExist_ItShouldThrow()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public Task ExecuteAsync_WhenProviderDoesNotExist_ItShouldDoNothing()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public Task ExecuteAsync_WhenProviderExists_ItShouldRemoveProviderFromSettings()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,10 @@
|
|||||||
global using RichardSzalay.MockHttp;
|
global using System.IO.Abstractions;
|
||||||
|
|
||||||
|
global using AltGen.Console.Config;
|
||||||
global using AltGen.Console.Generate;
|
global using AltGen.Console.Generate;
|
||||||
|
|
||||||
|
global using FluentAssertions;
|
||||||
|
|
||||||
|
global using Moq;
|
||||||
|
|
||||||
|
global using RichardSzalay.MockHttp;
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
namespace AltGen.Console.Common;
|
||||||
|
|
||||||
|
static class JsonOptions
|
||||||
|
{
|
||||||
|
public static JsonSerializerOptions Default { get; } = new()
|
||||||
|
{
|
||||||
|
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
||||||
|
PropertyNameCaseInsensitive = true,
|
||||||
|
WriteIndented = true
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -5,12 +5,6 @@ sealed class AddConfigCommand(
|
|||||||
IFileSystem fileSystem
|
IFileSystem fileSystem
|
||||||
) : AsyncCommand<AddConfigCommand.Settings>
|
) : AsyncCommand<AddConfigCommand.Settings>
|
||||||
{
|
{
|
||||||
static readonly JsonSerializerOptions JsonOptions = new()
|
|
||||||
{
|
|
||||||
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
|
|
||||||
PropertyNameCaseInsensitive = true,
|
|
||||||
WriteIndented = true
|
|
||||||
};
|
|
||||||
readonly IAnsiConsole _console = console;
|
readonly IAnsiConsole _console = console;
|
||||||
readonly IFileSystem _fileSystem = fileSystem;
|
readonly IFileSystem _fileSystem = fileSystem;
|
||||||
|
|
||||||
@@ -43,17 +37,17 @@ sealed class AddConfigCommand(
|
|||||||
new(settings.Provider, settings.Key, settings.Default)
|
new(settings.Provider, settings.Key, settings.Default)
|
||||||
]);
|
]);
|
||||||
|
|
||||||
var json = JsonSerializer.Serialize(appSettings, JsonOptions);
|
var json = JsonSerializer.Serialize(appSettings, JsonOptions.Default);
|
||||||
await _fileSystem.File.WriteAllTextAsync(settings.SettingsPath, json);
|
await _fileSystem.File.WriteAllTextAsync(settings.SettingsPath, json);
|
||||||
_console.MarkupLine($"[bold]{settings.Provider}[/] has been configured.");
|
_console.MarkupLine($"[bold]{settings.Provider}[/] has been configured.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
var existingJson = await _fileSystem.File.ReadAllTextAsync(settings.SettingsPath);
|
var existingJson = await _fileSystem.File.ReadAllTextAsync(settings.SettingsPath);
|
||||||
var existingAppSettings = JsonSerializer.Deserialize<AppSettings>(existingJson, JsonOptions)
|
var existingAppSettings = JsonSerializer.Deserialize<AppSettings>(existingJson, JsonOptions.Default)
|
||||||
?? throw new ConfigException("Failed to deserialize settings.");
|
?? throw new ConfigException("Failed to deserialize settings.");
|
||||||
var updatedAppSettings = existingAppSettings.AddOrUpdateProvider(settings);
|
var updatedAppSettings = existingAppSettings.AddOrUpdateProvider(settings);
|
||||||
var udpatedJson = JsonSerializer.Serialize(updatedAppSettings, JsonOptions);
|
var udpatedJson = JsonSerializer.Serialize(updatedAppSettings, JsonOptions.Default);
|
||||||
await _fileSystem.File.WriteAllTextAsync(settings.SettingsPath, udpatedJson);
|
await _fileSystem.File.WriteAllTextAsync(settings.SettingsPath, udpatedJson);
|
||||||
_console.MarkupLine($"[bold]{settings.Provider}[/] has been configured.");
|
_console.MarkupLine($"[bold]{settings.Provider}[/] has been configured.");
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -25,14 +25,13 @@ sealed class RemoveConfigCommand(
|
|||||||
|
|
||||||
if (exists is false)
|
if (exists is false)
|
||||||
{
|
{
|
||||||
_console.MarkupLine("[bold]No existing settings found.[/]");
|
throw new ConfigException("No existing settings found.");
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var settingsJson = await _fileSystem.File.ReadAllTextAsync(settings.SettingsPath);
|
var settingsJson = await _fileSystem.File.ReadAllTextAsync(settings.SettingsPath);
|
||||||
var appSettings = JsonSerializer.Deserialize<AppSettings>(settingsJson) ?? throw new ConfigException("Failed to deserialize app settings.");
|
var appSettings = JsonSerializer.Deserialize<AppSettings>(settingsJson, JsonOptions.Default) ?? throw new ConfigException("Failed to deserialize app settings.");
|
||||||
var updatedAppSettings = appSettings.RemoveProvider(settings);
|
var updatedAppSettings = appSettings.RemoveProvider(settings);
|
||||||
var updatedJson = JsonSerializer.Serialize(updatedAppSettings);
|
var updatedJson = JsonSerializer.Serialize(updatedAppSettings, JsonOptions.Default);
|
||||||
await _fileSystem.File.WriteAllTextAsync(settings.SettingsPath, updatedJson);
|
await _fileSystem.File.WriteAllTextAsync(settings.SettingsPath, updatedJson);
|
||||||
_console.MarkupLine($"[bold]{settings.Provider}[/] has been removed.");
|
_console.MarkupLine($"[bold]{settings.Provider}[/] has been removed.");
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user