import os
from unittest.mock import call

import pytest
from pytest_mock import MockFixture

from commitizen import cmd, hooks
from commitizen.exceptions import RunHookError


def test_run(mocker: MockFixture):
    bump_hooks = ["pre_bump_hook", "pre_bump_hook_1"]

    cmd_run_mock = mocker.Mock()
    cmd_run_mock.return_value.return_code = 0
    mocker.patch.object(cmd, "run", cmd_run_mock)

    hooks.run(bump_hooks)

    cmd_run_mock.assert_has_calls(
        [
            call("pre_bump_hook", env=dict(os.environ)),
            call("pre_bump_hook_1", env=dict(os.environ)),
        ]
    )


def test_run_error(mocker: MockFixture):
    bump_hooks = ["pre_bump_hook", "pre_bump_hook_1"]

    cmd_run_mock = mocker.Mock()
    cmd_run_mock.return_value.return_code = 1
    mocker.patch.object(cmd, "run", cmd_run_mock)

    with pytest.raises(RunHookError):
        hooks.run(bump_hooks)


def test_format_env():
    result = hooks._format_env("TEST_", {"foo": "bar", "bar": "baz"})
    assert "TEST_FOO" in result and result["TEST_FOO"] == "bar"
    assert "TEST_BAR" in result and result["TEST_BAR"] == "baz"