예제 #1
0
def test_get_rule_not_registered(_):
    expected_law = Mock(name="Mocked law", rules=(get_passing_rule(), ))
    pillar = Pillar()
    pillar.register(expected_law)

    with pytest.raises(StopIteration):
        pillar.get_rule("no rule with this name")
예제 #2
0
def test_get_rule(_):
    rule = get_passing_rule()
    expected_law = Mock(name="Mocked law", rules=(rule, ))
    pillar = Pillar()
    pillar.register(expected_law)

    result = pillar.get_rule(rule.name)

    assert result == rule
예제 #3
0
def test_reporter(mocked_datetime):
    start = datetime.min
    finish = datetime.max
    mocked_datetime.now.side_effect = [start, finish]

    expected_pr_url = "https://github.com/gabor-boros/hammurabi/pull/1"

    pillar = Pillar(reporter_class=TestReporter)
    reporter = pillar.reporter

    passing_rule = get_passing_rule()
    failing_rule = get_failing_rule()

    law = Law(
        name="Integration test law",
        description="Integration test law description",
        rules=(passing_rule, failing_rule),
    )

    law.commit = Mock()

    expected_law = {
        "name": "Integration test law",
        "description": "Integration test law description",
    }

    expected_report = {
        "passed": [{
            "law": expected_law,
            "name": passing_rule.name
        }],
        "failed": [{
            "law": expected_law,
            "name": failing_rule.name
        }],
        "skipped": [],
        "additional_data": {
            "pull_request_url": expected_pr_url,
            "started": start.isoformat(),
            "finished": finish.isoformat(),
        },
    }

    # Actually do not push anything
    pillar.checkout_branch = Mock()
    pillar.push_changes = Mock()
    pillar.create_pull_request = Mock()
    pillar.create_pull_request.return_value = expected_pr_url

    # Register the law
    pillar.register(law)

    # Run the enforcement and get the report
    pillar.enforce()
    report = reporter.report().dict()

    assert report == expected_report
예제 #4
0
def test_executes_task():
    rule = get_passing_rule()
    rule.execute = Mock()

    law = Law(name="Passing", description="passing law", rules=(rule,))
    law.commit = Mock()

    law.enforce()

    rule.execute.assert_called_once_with()
    law.commit.assert_called_once_with()
예제 #5
0
def test_rule_execution_failed_precondition_no_abort(mocked_config, mocked_logging):
    mocked_config.settings.rule_can_abort = False
    mocked_logging.warning = Mock()
    expected_exception = "failed"

    rule = get_passing_rule()
    rule.made_changes = False

    rule.preconditions = [ExamplePrecondition(param=False)]

    rule.param = expected_exception
    rule.get_rule_chain = Mock(return_value=[get_passing_rule()])

    law = Law(name="Failing", description="failing law", rules=(rule,))
    law.commit = Mock()

    law.enforce()

    assert mocked_logging.warning.called
    assert law.commit.called is True
예제 #6
0
def test_commit_no_changes():
    rule = get_passing_rule()
    rule.execute = Mock()
    rule.made_changes = False

    law = Law(name="Passing", description="passing law", rules=(rule,))
    law.git_commit = Mock()
    law.get_execution_order = Mock(return_value=[rule])

    law.enforce()

    rule.execute.assert_called_once_with()
    assert law.git_commit.called is False
예제 #7
0
def test_executes_task_failed_preconditions():
    rule = get_passing_rule()
    rule.execute = Mock()

    law = Law(
        name="Passing",
        description="passing law",
        rules=(rule,),
        preconditions=[ExamplePrecondition(param=False)],
    )
    law.commit = Mock()

    law.enforce()

    assert rule.execute.called is False
    assert law.commit.called is False
예제 #8
0
def test_executes_task_preconditions():
    rule = get_passing_rule()
    rule.execute = Mock()

    law = Law(
        name="Passing",
        description="passing law",
        rules=(rule,),
        preconditions=[ExamplePrecondition(param=True)],
    )
    law.commit = Mock()

    law.enforce()

    rule.execute.assert_called_once_with()
    law.commit.assert_called_once_with()
예제 #9
0
def test_commit_changes():
    rule = get_passing_rule()
    rule.execute = Mock()
    rule.made_changes = True

    law = Law(name="Passing", description="passing law", rules=(rule,))
    law.git_commit = Mock()
    law.get_execution_order = Mock(return_value=[rule])

    expected_commit_message = f"{law.documentation}\n\n* {rule.name}"

    law.enforce()

    rule.execute.assert_called_once_with()
    law.get_execution_order.assert_called_once_with()
    law.git_commit.assert_called_once_with(expected_commit_message)
예제 #10
0
def test_rule_execution_failed_no_abort(mocked_config, mocked_logging):
    mocked_config.settings.rule_can_abort = False
    mocked_logging.error = Mock()
    expected_exception = "failed"

    rule = get_failing_rule()
    rule.made_changes = False
    rule.param = expected_exception
    rule.get_rule_chain = Mock(return_value=[get_passing_rule()])

    law = Law(name="Failing", description="failing law", rules=(rule,))
    law.commit = Mock()

    law.enforce()

    assert mocked_logging.error.called
    rule.get_rule_chain.assert_called_once_with(rule)
    assert law.commit.called is True
예제 #11
0
def test_rule_execution_aborted(mocked_logging, law_config, base_rule_config):
    law_config.settings.rule_can_abort = True
    base_rule_config.settings.dry_run = False
    mocked_logging.error = Mock()
    expected_exception = "failed"

    rule = get_failing_rule()
    rule.param = expected_exception
    rule.get_rule_chain = Mock(return_value=[get_passing_rule()])

    law = Law(name="Passing", description="passing law", rules=(rule,))
    law.commit = Mock()

    with pytest.raises(Exception) as exc:
        law.enforce()

    assert mocked_logging.error.called
    assert str(exc.value) == expected_exception
    rule.get_rule_chain.assert_called_once_with(rule)
    assert law.commit.called is False
예제 #12
0
def test_return_rules(_):
    expected_law = Mock(rules=(get_passing_rule(), ))
    pillar = Pillar()
    pillar.register(expected_law)

    assert list(pillar.rules) == list(expected_law.rules)
예제 #13
0
def test_generate_pull_request_body_with_chained_rules():
    failed_rule = ExampleRule(
        name="Test failed rule 1",
        param=Mock(),
        preconditions=[PASSING_PRECONDITION],
        children=[get_passing_rule("Child rule")],
    )

    failed_rule.made_changes = False

    passing_rule = ExampleRule(
        name="Test rule 1",
        param=Mock(),
        preconditions=[PASSING_PRECONDITION],
        children=[get_passing_rule("Passing child rule")],
    )

    failed_execution_law = Law(
        name="Test law 1",
        description="Test description 1",
        rules=[passing_rule, failed_rule],
    )

    failed_execution_law._failed_rules = (failed_rule,)

    mocked_pillar = Mock()
    mocked_pillar.laws = [
        failed_execution_law,
        Law(
            name="Test law 2",
            description="Test description 2",
            rules=[ExampleRule(name="Test rule 2", param=Mock())],
        ),
        Law(
            name="Test law 3",
            description="Test description 3",
            rules=[
                ExampleRule(name="Test rule 3", param=Mock()),
                ExampleRule(name="Test rule 4", param=Mock()),
            ],
        ),
    ]

    expected_body = """## Description
Below you can find the executed laws and information about them.

### Test law 1
Test description 1

<details>
<summary>Passed rules</summary>

* Test rule 1
  * Passing child rule
</details>

<details open>
<summary>Failed rules (manual fix needed)</summary>

* Test failed rule 1
  * Child rule
</details>

### Test law 2
Test description 2

<details>
<summary>Passed rules</summary>

* Test rule 2
</details>

### Test law 3
Test description 3

<details>
<summary>Passed rules</summary>

* Test rule 3
* Test rule 4
</details>"""

    pr_helper = get_pull_request_helper_mixin_consumer()

    body = pr_helper.generate_pull_request_body(mocked_pillar)

    assert body == expected_body