# Pylint doesn't play well with fixtures and dependency injection from pytest
# pylint: disable=redefined-outer-name

import pytest
from buildstream.testing.runcli import cli  # pylint: disable=unused-import


def assert_help(cli_output):
    expected_start = "Usage: "
    if not cli_output.startswith(expected_start):
        raise AssertionError(
            "Help output expected to begin with '{}',".format(expected_start) + " output was: {}".format(cli_output)
        )


def test_help_main(cli):
    result = cli.run(args=["--help"])
    result.assert_success()
    assert_help(result.output)


@pytest.mark.parametrize("command", [("artifact"), ("build"), ("shell"), ("show"), ("source"), ("workspace")])
def test_help(cli, command):
    result = cli.run(args=[command, "--help"])
    result.assert_success()
    assert_help(result.output)
