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(); } }