feat(headless): complete portable single-session host
This commit is contained in:
parent
fbebb91848
commit
f8cb840fb1
30 changed files with 3571 additions and 32 deletions
|
|
@ -41,10 +41,9 @@ public sealed class HeadlessEntryPointTests
|
|||
|
||||
[Theory]
|
||||
[InlineData("""{"version":2,"sessions":[]}""", "Unsupported configuration version")]
|
||||
[InlineData("""{"version":1,"sessions":[],"password":"secret"}""", "could not be mapped")]
|
||||
[InlineData("""{"version":1,"sessions":[{"id":"bot"},{"id":"bot"}]}""", "Duplicate session id")]
|
||||
[InlineData("""{"version":1,"sessions":[],"password":"secret"}""", "JSON document is invalid")]
|
||||
[InlineData("""{"version":1,"sessions":[null]}""", "non-empty id")]
|
||||
[InlineData("""{"version":1}""", "required properties")]
|
||||
[InlineData("""{"version":1}""", "JSON document is invalid")]
|
||||
public void ValidateRejectsInvalidOrSecretShapedConfiguration(
|
||||
string json,
|
||||
string expectedError)
|
||||
|
|
@ -67,6 +66,51 @@ public sealed class HeadlessEntryPointTests
|
|||
Assert.Equal(string.Empty, output.ToString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ValidateAcceptsCompleteSingleSessionConfiguration()
|
||||
{
|
||||
using var file = TemporaryConfiguration.Create(
|
||||
ConfigurationWith(Session("bot", "BOT_PASSWORD")));
|
||||
using var output = new StringWriter();
|
||||
using var error = new StringWriter();
|
||||
|
||||
int exitCode = HeadlessEntryPoint.Run(
|
||||
["validate", "--config", file.Path],
|
||||
output,
|
||||
error);
|
||||
|
||||
Assert.Equal(0, exitCode);
|
||||
Assert.Contains("1 session(s)", output.ToString());
|
||||
Assert.Equal(string.Empty, error.ToString());
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("duplicate-id")]
|
||||
[InlineData("duplicate-credential")]
|
||||
public void ValidateRejectsAmbiguousSessionOwnership(string scenario)
|
||||
{
|
||||
string second = scenario == "duplicate-id"
|
||||
? Session("bot", "SECOND_PASSWORD")
|
||||
: Session("second", "BOT_PASSWORD");
|
||||
string expected = scenario == "duplicate-id"
|
||||
? "Duplicate session id"
|
||||
: "already in use";
|
||||
using var file = TemporaryConfiguration.Create(
|
||||
ConfigurationWith(
|
||||
Session("bot", "BOT_PASSWORD"),
|
||||
second));
|
||||
using var output = new StringWriter();
|
||||
using var error = new StringWriter();
|
||||
|
||||
int exitCode = HeadlessEntryPoint.Run(
|
||||
["validate", "--config", file.Path],
|
||||
output,
|
||||
error);
|
||||
|
||||
Assert.Equal(3, exitCode);
|
||||
Assert.Contains(expected, error.ToString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void UnknownCommandReturnsUsageError()
|
||||
{
|
||||
|
|
@ -83,6 +127,15 @@ public sealed class HeadlessEntryPointTests
|
|||
Assert.Equal(string.Empty, output.ToString());
|
||||
}
|
||||
|
||||
private static string ConfigurationWith(params string[] sessions) =>
|
||||
$$"""{"version":1,"sessions":[{{string.Join(",", sessions)}}]}""";
|
||||
|
||||
private static string Session(string id, string credentialReference) =>
|
||||
$"{{\"id\":\"{id}\",\"endpoint\":{{\"host\":\"127.0.0.1\",\"port\":9000}},"
|
||||
+ "\"account\":\"account\",\"character\":{\"index\":0},"
|
||||
+ "\"policy\":{\"id\":\"idle\"},\"credential\":"
|
||||
+ $"{{\"provider\":\"environment\",\"reference\":\"{credentialReference}\"}}}}";
|
||||
|
||||
private sealed class TemporaryConfiguration : IDisposable
|
||||
{
|
||||
private TemporaryConfiguration(string path)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue