module tests open NUnit.Framework open Pentole.TestsExtensions open Bidello.Datatypes open Bidello open Pentole.String let now = NodaTime.SystemClock.Instance.GetCurrentInstant () [] let string_prefix_active_pattern () = match "@after job" with | Prefix "@after" _ -> Assert.Pass () | _ -> Assert.Pass () match "@after job " with | Prefix "@after" _ -> Assert.Pass () | _ -> Assert.Pass () let bj = { job_name = "j1" hostname = "h1" ``when`` = "* * * * *" executable = "echo" workdir = "/"; user = "nobody" args = [||]; environment = ""; done_at = None } let run_function x = let reduce (cjs: ChainOfJobs) = let hd = cjs.head |> fun cj -> (cj.hostname, cj.job_name) let tail = cjs.rest |> List.map (fun cj -> (cj.hostname, cj.job_name)) hd::tail Cron.sort_jobs now x |> Result.map (List.map reduce) |> Pentole.Result.get [] let job_deps_simple () = let requirements = [bj] let cjs = run_function requirements let expected = [[("h1", "j1")]] Assert.are_seq_equal expected cjs [] let job_deps () = let requirements = [ bj {bj with job_name = "j2"} {bj with hostname = "h2"} {bj with job_name = "j1_after"; ``when``="@after j1"} ] let cjs = run_function requirements let expected = [[("h1", "j1"); ("h1", "j1_after")]; [("h2", "j1")]; [("h1", "j2")]] Assert.are_seq_equal expected cjs [] let job_deps2 () = let requirements = [ bj {bj with job_name = "j2"} {bj with hostname = "h2"} {bj with job_name = "j1_after"; ``when``="@after j1"} {bj with job_name = "j2_after"; ``when``="@after j2"} ] let cjs = run_function requirements let expected = [[("h1", "j1"); ("h1", "j1_after")]; [("h1", "j2"); ("h1", "j2_after")]; [("h2", "j1")]] Assert.are_seq_equal expected cjs [] let should_fail_no_host () = let requirements = [ bj {bj with job_name = "j2"} {bj with hostname = "h2"} {bj with job_name = "j1_after"; ``when``="@after j1"; hostname="nope"} {bj with job_name = "j2_after"; ``when``="@after j2"} ] Cron.sort_jobs now requirements |> Result.isError |> Assert.is_true [] let job_deps_chain () = let requirements = [ {bj with job_name = "j1"} {bj with job_name = "j2_after_j1"; ``when``="@after j2"} {bj with job_name = "j3_after_j2"; ``when``="@after j2_after_j1"} ] let cjs = run_function requirements let expected = [[("h1", "j1"); ("h1", "j1_after")]; [("h1", "j2"); ("h1", "j2_after")]; [("h2", "j1")]] Assert.are_seq_equal expected cjs