zcbot/windows-node/Zcbot.WindowsNode.Tests/JobRecoveryServiceTests.cs

68 lines
1.9 KiB
C#

using System.Text.Json;
namespace Zcbot.WindowsNode.Tests;
public sealed class JobRecoveryServiceTests
{
[Fact]
public void JobWithoutTerminalResumesExecution()
{
Assert.Equal(
JobRecoveryAction.ResumeExecution,
JobRecoveryService.Decide(CreateJob()));
}
[Theory]
[InlineData("failed")]
[InlineData("cancelled")]
public void FailedOrCancelledTerminalIsReplayed(string status)
{
Assert.Equal(
JobRecoveryAction.ReplayTerminal,
JobRecoveryService.Decide(CreateJob(terminal: Terminal(status))));
}
[Fact]
public void UnconfirmedSuccessResumesOnlyOutputUpload()
{
Assert.Equal(
JobRecoveryAction.ResumeOutputUpload,
JobRecoveryService.Decide(CreateJob(terminal: Terminal("succeeded"))));
}
[Theory]
[InlineData(true, false)]
[InlineData(false, true)]
public void ConfirmedOrCloudTerminatedSuccessNeedsNoRecovery(
bool uploadComplete,
bool cloudTerminal)
{
Assert.Equal(
JobRecoveryAction.None,
JobRecoveryService.Decide(CreateJob(
terminal: Terminal("succeeded"),
uploadComplete: uploadComplete,
cloudTerminal: cloudTerminal)));
}
private static RecoverableJob CreateJob(
JsonElement? terminal = null,
bool uploadComplete = false,
bool cloudTerminal = false) => new(
Guid.NewGuid(),
Guid.NewGuid(),
new string('a', 64),
"origin.plot@v2",
null,
null,
terminal,
uploadComplete,
cloudTerminal);
private static JsonElement Terminal(string status)
{
using var document = JsonDocument.Parse($$"""{"status":"{{status}}"}""");
return document.RootElement.Clone();
}
}