import pytest from mock import patch from data.database import BUILD_PHASE, RepositoryBuildTrigger from data.model.build import update_trigger_disable_status from test.fixtures import * TEST_FAIL_THRESHOLD = 5 TEST_INTERNAL_ERROR_THRESHOLD = 2 @pytest.mark.parametrize('starting_failure_count, starting_error_count, status, expected_reason', [ (0, 0, BUILD_PHASE.COMPLETE, None), (10, 10, BUILD_PHASE.COMPLETE, None), (TEST_FAIL_THRESHOLD - 1, TEST_INTERNAL_ERROR_THRESHOLD - 1, BUILD_PHASE.COMPLETE, None), (TEST_FAIL_THRESHOLD - 1, 0, BUILD_PHASE.ERROR, 'successive_build_failures'), (0, TEST_INTERNAL_ERROR_THRESHOLD - 1, BUILD_PHASE.INTERNAL_ERROR, 'successive_build_internal_errors'), ]) def test_update_trigger_disable_status(starting_failure_count, starting_error_count, status, expected_reason, initialized_db): test_config = { 'SUCCESSIVE_TRIGGER_FAILURE_DISABLE_THRESHOLD': TEST_FAIL_THRESHOLD, 'SUCCESSIVE_TRIGGER_INTERNAL_ERROR_DISABLE_THRESHOLD': TEST_INTERNAL_ERROR_THRESHOLD, } trigger = model.build.list_build_triggers('devtable', 'building')[0] trigger.successive_failure_count = starting_failure_count trigger.successive_internal_error_count = starting_error_count trigger.enabled = True trigger.save() with patch('data.model.config.app_config', test_config): update_trigger_disable_status(trigger, status) updated_trigger = RepositoryBuildTrigger.get(uuid=trigger.uuid) assert updated_trigger.enabled == (expected_reason is None) if expected_reason is not None: assert updated_trigger.disabled_reason.name == expected_reason else: assert updated_trigger.disabled_reason is None assert updated_trigger.successive_failure_count == 0 assert updated_trigger.successive_internal_error_count == 0