use anyhow::{Result, ensure};
use rstest::rstest;
use serde_yaml::{Mapping, Value};
use super::{is_false, non_blocking, trigger_events};
fn parse(source: &str) -> Result<Value> { Ok(serde_yaml::from_str(source)?) }
fn parse_mapping(source: &str) -> Result<Mapping> { Ok(serde_yaml::from_str(source)?) }
#[rstest]
#[case::scalar("pull_request")]
#[case::sequence("[pull_request, workflow_dispatch]")]
#[case::mapping("pull_request:\n branches: [main]\npush:\n branches: [main]")]
#[case::mapping_without_configuration("pull_request:\nworkflow_dispatch:")]
fn every_accepted_trigger_form_names_pull_request(#[case] source: &str) -> Result<()> {
let triggers = parse(source)?;
let events = trigger_events(&triggers);
ensure!(
events.contains(&"pull_request"),
"pull_request not among {events:?}"
);
Ok(())
}
#[rstest]
#[case::scalar("push")]
#[case::sequence("[push, workflow_dispatch]")]
#[case::mapping("push:\n branches: [main]")]
fn a_trigger_form_without_pull_request_names_none(#[case] source: &str) -> Result<()> {
let triggers = parse(source)?;
let events = trigger_events(&triggers);
ensure!(
!events.contains(&"pull_request"),
"pull_request among {events:?}"
);
Ok(())
}
#[rstest]
#[case::boolean_false("continue-on-error: false", true)]
#[case::string_false("continue-on-error: \"false\"", true)]
#[case::boolean_true("continue-on-error: true", false)]
#[case::expression("continue-on-error: ${{ github.event_name == 'push' }}", false)]
#[case::string_true("continue-on-error: \"true\"", false)]
fn continue_on_error_blocks_only_when_it_is_false(
#[case] source: &str,
#[case] blocking: bool,
) -> Result<()> {
let entry = parse_mapping(source)?;
let reason = non_blocking(&entry);
ensure!(
reason.is_none() == blocking,
"expected {} for {source}, got {reason:?}",
if blocking { "blocking" } else { "non-blocking" }
);
Ok(())
}
#[rstest]
#[case::boolean_false("false", true)]
#[case::string_false("\"false\"", true)]
#[case::boolean_true("true", false)]
#[case::string_off("\"off\"", false)]
#[case::expression("${{ false }}", false)]
fn only_a_written_false_is_provably_false(
#[case] source: &str,
#[case] expected: bool,
) -> Result<()> {
let value = parse(source)?;
ensure!(
is_false(&value) == expected,
"is_false({source}) should be {expected}"
);
Ok(())
}