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")
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
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
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()
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
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
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
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()
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)
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
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
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)
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