diff --git a/tests/__init__.py b/tests/__init__.py index f4db97b7..8f6946b1 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -89,14 +89,18 @@ def clean_database(): db.create_all() -def init_data(): +def init_data(data_size=10): + """ + Creates data_size * 3 modules in database in different states and + with different component builds. See _populate_data for more info. + """ clean_database() with make_session(conf) as session: - _populate_data(session) + _populate_data(session, data_size) -def _populate_data(session): - for index in range(10): +def _populate_data(session, data_size=10): + for index in range(data_size): build_one = ModuleBuild() build_one.name = 'nginx' build_one.stream = '1' @@ -366,7 +370,7 @@ def scheduler_init_data(tangerine_state=None): session.commit() -def test_reuse_component_init_data(): +def reuse_component_init_data(): clean_database() current_dir = os.path.dirname(__file__) @@ -532,7 +536,7 @@ def test_reuse_component_init_data(): session.commit() -def test_reuse_shared_userspace_init_data(): +def reuse_shared_userspace_init_data(): clean_database() with make_session(conf) as session: diff --git a/tests/test_build/test_build.py b/tests/test_build/test_build.py index 038b9ef2..b6c8e616 100644 --- a/tests/test_build/test_build.py +++ b/tests/test_build/test_build.py @@ -38,7 +38,7 @@ from mock import patch, PropertyMock, Mock from werkzeug.datastructures import FileStorage import kobo -from tests import app, test_reuse_component_init_data, clean_database +from tests import app, reuse_component_init_data, clean_database import json import itertools @@ -799,7 +799,7 @@ class TestBuild: Tests that we do not try building module-build-macros when reusing all components in a module build. """ - test_reuse_component_init_data() + reuse_component_init_data() def on_build_cb(cls, artifact_name, source): raise ValueError("All components should be reused, not build.") @@ -850,7 +850,7 @@ class TestBuild: Tests that we can reuse components even when the reused module does not have module-build-macros component. """ - test_reuse_component_init_data() + reuse_component_init_data() models.ComponentBuild.query.filter_by(package="module-build-macros").delete() assert len(models.ComponentBuild.query.filter_by(package="module-build-macros").all()) == 0 @@ -1020,7 +1020,8 @@ class TestBuild: @patch('module_build_service.auth.get_user', return_value=user) @patch('module_build_service.scm.SCM') def test_submit_build_resume_recover_orphaned_macros( - self, mocked_scm, mocked_get_user, conf_system, dbg): + self, mocked_scm, mocked_get_user, conf_system, dbg, + pdc_module_inactive): """ Tests that resuming the build works when module-build-macros is orphaned but marked as failed in the database diff --git a/tests/test_builder/test_base.py b/tests/test_builder/test_base.py index 8f037197..6adda2ce 100644 --- a/tests/test_builder/test_base.py +++ b/tests/test_builder/test_base.py @@ -34,7 +34,7 @@ from mock import patch class TestGenericBuilder: def setup_method(self, test_method): - init_data() + init_data(1) self.module = module_build_service.models.ModuleBuild.query.filter_by(id=1).one() @patch('module_build_service.resolver.PDCResolver') diff --git a/tests/test_builder/test_copr.py b/tests/test_builder/test_copr.py index f846a311..c6dd1485 100644 --- a/tests/test_builder/test_copr.py +++ b/tests/test_builder/test_copr.py @@ -100,7 +100,7 @@ COPR_MODULE_BUILDER = "module_build_service.builder.CoprModuleBuilder.CoprModule class TestCoprModuleBuilder: def setup_method(self, test_method): - init_data() + init_data(1) self.config = mock.Mock() self.config.koji_profile = conf.koji_profile self.config.koji_repository_url = conf.koji_repository_url diff --git a/tests/test_builder/test_koji.py b/tests/test_builder/test_koji.py index 518d39dc..d0a6cfaf 100644 --- a/tests/test_builder/test_koji.py +++ b/tests/test_builder/test_koji.py @@ -55,7 +55,7 @@ class FakeKojiModuleBuilder(KojiModuleBuilder): class TestKojiBuilder: def setup_method(self, test_method): - init_data() + init_data(1) self.config = mock.Mock() self.config.koji_profile = conf.koji_profile self.config.koji_repository_url = conf.koji_repository_url @@ -88,7 +88,7 @@ class TestKojiBuilder: build_tagged = [{"nvr": "foo-1.0-1.module+e0095747", "task_id": 12345, 'build_id': 91}] dest_tagged = [{"nvr": "foo-1.0-1.module+e0095747", "task_id": 12345, 'build_id': 91}] builder.koji_session.listTagged.side_effect = [build_tagged, dest_tagged] - module_build = module_build_service.models.ModuleBuild.query.get(30) + module_build = module_build_service.models.ModuleBuild.query.get(3) component_build = module_build.component_builds[0] component_build.task_id = None component_build.state = None @@ -103,7 +103,7 @@ class TestKojiBuilder: assert actual[0].build_name == 'rubygem-rails' assert actual[0].build_version == '1.0' assert actual[0].build_release == '1.module+e0095747' - assert actual[0].module_build_id == 30 + assert actual[0].module_build_id == 3 assert type(actual[1]) == module_build_service.messaging.KojiTagChange assert actual[1].tag == 'module-foo-build' assert actual[1].artifact == 'rubygem-rails' @@ -142,7 +142,7 @@ class TestKojiBuilder: 'build_id': 91 } builder.koji_session.getBuild.return_value = build_info - module_build = module_build_service.models.ModuleBuild.query.get(30) + module_build = module_build_service.models.ModuleBuild.query.get(3) component_build = module_build.component_builds[0] component_build.task_id = None component_build.nvr = None @@ -157,7 +157,7 @@ class TestKojiBuilder: assert actual[0].build_name == 'rubygem-rails' assert actual[0].build_version == '1.0' assert actual[0].build_release == '1.{0}'.format(dist_tag) - assert actual[0].module_build_id == 30 + assert actual[0].module_build_id == 3 assert component_build.state == koji.BUILD_STATES['COMPLETE'] assert component_build.task_id == 12345 assert component_build.state_reason == 'Found existing build' @@ -183,7 +183,7 @@ class TestKojiBuilder: "release": "nope", }] builder.koji_session.untaggedBuilds.return_value = untagged - module_build = module_build_service.models.ModuleBuild.query.get(30) + module_build = module_build_service.models.ModuleBuild.query.get(3) component_build = module_build.component_builds[0] component_build.task_id = None component_build.nvr = None diff --git a/tests/test_builder/test_mock.py b/tests/test_builder/test_mock.py index 51480a8a..3216c228 100644 --- a/tests/test_builder/test_mock.py +++ b/tests/test_builder/test_mock.py @@ -19,7 +19,7 @@ class TestMockModuleBuilder: self.resultdir = tempfile.mkdtemp() def teardown_method(self, test_method): - init_data() + clean_database() shutil.rmtree(self.resultdir) def _create_module_with_filters(self, session, batch, state): diff --git a/tests/test_content_generator.py b/tests/test_content_generator.py index c08da1f6..c3944e82 100644 --- a/tests/test_content_generator.py +++ b/tests/test_content_generator.py @@ -47,7 +47,7 @@ GET_USER_RV = { class TestBuild: def setup_method(self, test_method): - init_data() + init_data(1) module = models.ModuleBuild.query.filter_by(id=1).one() module.cg_build_koji_tag = "f27-module-candidate" self.cg = KojiContentGenerator(module, conf) diff --git a/tests/test_logger.py b/tests/test_logger.py index 2d9f3101..b7251183 100644 --- a/tests/test_logger.py +++ b/tests/test_logger.py @@ -35,7 +35,7 @@ from tests import init_data class TestLogger: def setup_method(self, test_method): - init_data() + init_data(1) test_id = '.'.join([ path.splitext(path.basename(__file__))[0], test_method.im_class.__name__, diff --git a/tests/test_scheduler/test_poller.py b/tests/test_scheduler/test_poller.py index baaf6b93..1ecd1dce 100644 --- a/tests/test_scheduler/test_poller.py +++ b/tests/test_scheduler/test_poller.py @@ -21,7 +21,7 @@ import pytest from mock import patch from module_build_service import models, conf -from tests import test_reuse_component_init_data, init_data, db +from tests import reuse_component_init_data, init_data, db, clean_database import mock import koji from module_build_service.scheduler.producer import MBSProducer @@ -37,10 +37,10 @@ from datetime import datetime, timedelta class TestPoller: def setup_method(self, test_method): - test_reuse_component_init_data() + reuse_component_init_data() def teardown_method(self, test_method): - init_data() + clean_database() @pytest.mark.parametrize('fresh', [True, False]) @patch('module_build_service.utils.start_build_component') diff --git a/tests/test_scheduler/test_repo_done.py b/tests/test_scheduler/test_repo_done.py index 2ae681bd..52517e80 100644 --- a/tests/test_scheduler/test_repo_done.py +++ b/tests/test_scheduler/test_repo_done.py @@ -30,14 +30,12 @@ from tests import conf, db, app, scheduler_init_data class TestRepoDone: - def setup_method(self, test_method): - scheduler_init_data() - @mock.patch('module_build_service.models.ModuleBuild.from_repo_done_event') def test_no_match(self, from_repo_done_event): """ Test that when a repo msg hits us and we have no match, that we do nothing gracefully. """ + scheduler_init_data() from_repo_done_event.return_value = None msg = module_build_service.messaging.KojiRepoChange( 'no matches for this...', '2016-some-nonexistent-build') @@ -64,6 +62,7 @@ class TestRepoDone: mock_uea, pdc): """ Test that when a repo msg hits us and we have a single match. """ + scheduler_init_data() get_session.return_value = mock.Mock(), 'development' build_fn.return_value = 1234, 1, '', None @@ -97,6 +96,7 @@ class TestRepoDone: """ Test that when a KojiModuleBuilder.build fails, the build is marked as failed with proper state_reason. """ + scheduler_init_data() config.return_value = mock.Mock(), 'development' build_fn.return_value = None, 4, 'Failed to submit artifact tangerine to Koji', None diff --git a/tests/test_scheduler/test_tag_tagged.py b/tests/test_scheduler/test_tag_tagged.py index 5a0ea3eb..602f8d9e 100644 --- a/tests/test_scheduler/test_tag_tagged.py +++ b/tests/test_scheduler/test_tag_tagged.py @@ -27,7 +27,7 @@ from mock import patch import module_build_service.messaging import module_build_service.scheduler.handlers.repos import module_build_service.models -from tests import test_reuse_component_init_data +from tests import reuse_component_init_data from tests import conf, db import koji @@ -36,7 +36,7 @@ import koji class TestTagTagged: def setup_method(self, test_method): - test_reuse_component_init_data() + reuse_component_init_data() @mock.patch('module_build_service.models.ModuleBuild.from_tag_change_event') def test_no_matching_module(self, from_tag_change_event): diff --git a/tests/test_utils/test_utils.py b/tests/test_utils/test_utils.py index 3532bf67..0090527e 100644 --- a/tests/test_utils/test_utils.py +++ b/tests/test_utils/test_utils.py @@ -29,8 +29,8 @@ import module_build_service.utils import module_build_service.scm from module_build_service import models, conf from module_build_service.errors import ProgrammingError, ValidationError, UnprocessableEntity -from tests import (test_reuse_component_init_data, init_data, db, - test_reuse_shared_userspace_init_data, +from tests import (reuse_component_init_data, init_data, db, + reuse_shared_userspace_init_data, clean_database) import mock import koji @@ -75,14 +75,162 @@ class FakeSCM(object): def get_module_yaml(self): return path.join(self.sourcedir, self.name + ".yaml") +class TestUtilsComponentReuse: + + def setup_method(self, test_method): + reuse_component_init_data() + + def teardown_method(self, test_method): + clean_database() + + @pytest.mark.parametrize('changed_component', [ + 'perl-List-Compare', 'perl-Tangerine', 'tangerine', None + ]) + def test_get_reusable_component_different_component(self, changed_component): + second_module_build = models.ModuleBuild.query.filter_by(id=2).one() + if changed_component: + mmd = second_module_build.mmd() + mmd.components.rpms[changed_component].ref = '00ea1da4192a2030f9ae023de3b3143ed647bbab' + second_module_build.modulemd = mmd.dumps() + second_module_changed_component = models.ComponentBuild.query.filter_by( + package=changed_component, module_id=2).one() + second_module_changed_component.ref = '00ea1da4192a2030f9ae023de3b3143ed647bbab' + db.session.add(second_module_changed_component) + db.session.commit() + + plc_rv = module_build_service.utils.get_reusable_component( + db.session, second_module_build, 'perl-List-Compare') + pt_rv = module_build_service.utils.get_reusable_component( + db.session, second_module_build, 'perl-Tangerine') + tangerine_rv = module_build_service.utils.get_reusable_component( + db.session, second_module_build, 'tangerine') + + if changed_component == 'perl-List-Compare': + # perl-Tangerine can be reused even though a component in its batch has changed + assert plc_rv is None + assert pt_rv.package == 'perl-Tangerine' + assert tangerine_rv is None + elif changed_component == 'perl-Tangerine': + # perl-List-Compare can be reused even though a component in its batch has changed + assert plc_rv.package == 'perl-List-Compare' + assert pt_rv is None + assert tangerine_rv is None + elif changed_component == 'tangerine': + # perl-List-Compare and perl-Tangerine can be reused since they are in an earlier + # buildorder than tangerine + assert plc_rv.package == 'perl-List-Compare' + assert pt_rv.package == 'perl-Tangerine' + assert tangerine_rv is None + elif changed_component is None: + # Nothing has changed so everthing can be used + assert plc_rv.package == 'perl-List-Compare' + assert pt_rv.package == 'perl-Tangerine' + assert tangerine_rv.package == 'tangerine' + + def test_get_reusable_component_different_rpm_macros(self): + second_module_build = models.ModuleBuild.query.filter_by(id=2).one() + mmd = second_module_build.mmd() + mmd.buildopts.rpms.macros = "%my_macro 1" + second_module_build.modulemd = mmd.dumps() + db.session.commit() + + plc_rv = module_build_service.utils.get_reusable_component( + db.session, second_module_build, 'perl-List-Compare') + assert plc_rv is None + + pt_rv = module_build_service.utils.get_reusable_component( + db.session, second_module_build, 'perl-Tangerine') + assert pt_rv is None + + def test_get_reusable_component_different_buildrequires_hash(self): + second_module_build = models.ModuleBuild.query.filter_by(id=2).one() + mmd = second_module_build.mmd() + mmd.xmd['mbs']['buildrequires']['platform']['ref'] = \ + 'da39a3ee5e6b4b0d3255bfef95601890afd80709' + second_module_build.modulemd = mmd.dumps() + second_module_build.build_context = '37c6c57bedf4305ef41249c1794760b5cb8fad17' + db.session.commit() + + plc_rv = module_build_service.utils.get_reusable_component( + db.session, second_module_build, 'perl-List-Compare') + assert plc_rv is None + + pt_rv = module_build_service.utils.get_reusable_component( + db.session, second_module_build, 'perl-Tangerine') + assert pt_rv is None + + tangerine_rv = module_build_service.utils.get_reusable_component( + db.session, second_module_build, 'tangerine') + assert tangerine_rv is None + + def test_get_reusable_component_different_buildrequires(self): + second_module_build = models.ModuleBuild.query.filter_by(id=2).one() + mmd = second_module_build.mmd() + mmd.buildrequires = {'some_module': 'master'} + mmd.xmd['mbs']['buildrequires'] = { + 'some_module': { + 'ref': 'da39a3ee5e6b4b0d3255bfef95601890afd80709', + 'stream': 'master', + 'version': '20170123140147' + } + } + second_module_build.modulemd = mmd.dumps() + second_module_build.build_context = '37c6c57bedf4305ef41249c1794760b5cb8fad17' + db.session.commit() + + plc_rv = module_build_service.utils.get_reusable_component( + db.session, second_module_build, 'perl-List-Compare') + assert plc_rv is None + + pt_rv = module_build_service.utils.get_reusable_component( + db.session, second_module_build, 'perl-Tangerine') + assert pt_rv is None + + tangerine_rv = module_build_service.utils.get_reusable_component( + db.session, second_module_build, 'tangerine') + assert tangerine_rv is None + + @patch("module_build_service.utils.submit_module_build") + def test_submit_module_build_from_yaml_with_skiptests(self, mock_submit): + """ + Tests local module build from a yaml file with the skiptests option + + Args: + mock_submit (MagickMock): mocked function submit_module_build, which we then + inspect if it was called with correct arguments + """ + module_dir = tempfile.mkdtemp() + module = models.ModuleBuild.query.filter_by(id=2).one() + mmd = module.mmd() + modulemd_yaml = mmd.dumps() + modulemd_file_path = path.join(module_dir, "testmodule.yaml") + + username = "test" + stream = "dev" + + with open(modulemd_file_path, "w") as fd: + fd.write(modulemd_yaml) + + with open(modulemd_file_path, "r") as fd: + handle = FileStorage(fd) + module_build_service.utils.submit_module_build_from_yaml(username, handle, + stream=stream, skiptests=True) + mock_submit_args = mock_submit.call_args[0] + username_arg = mock_submit_args[0] + mmd_arg = mock_submit_args[2] + assert mmd_arg.stream == stream + assert "\n\n%__spec_check_pre exit 0\n" in mmd_arg.buildopts.rpms.macros + assert username_arg == username + rmtree(module_dir) + class TestUtils: def setup_method(self, test_method): - init_data() + clean_database() def teardown_method(self, test_method): - init_data() + clean_database() @pytest.mark.parametrize('scmurl', [ ('git://pkgs.stg.fedoraproject.org/modules/testmodule.git' @@ -146,117 +294,6 @@ class TestUtils: assert mmd.xmd == xmd - @pytest.mark.parametrize('changed_component', [ - 'perl-List-Compare', 'perl-Tangerine', 'tangerine', None - ]) - def test_get_reusable_component_different_component(self, changed_component): - test_reuse_component_init_data() - second_module_build = models.ModuleBuild.query.filter_by(id=2).one() - if changed_component: - mmd = second_module_build.mmd() - mmd.components.rpms[changed_component].ref = '00ea1da4192a2030f9ae023de3b3143ed647bbab' - second_module_build.modulemd = mmd.dumps() - second_module_changed_component = models.ComponentBuild.query.filter_by( - package=changed_component, module_id=2).one() - second_module_changed_component.ref = '00ea1da4192a2030f9ae023de3b3143ed647bbab' - db.session.add(second_module_changed_component) - db.session.commit() - - plc_rv = module_build_service.utils.get_reusable_component( - db.session, second_module_build, 'perl-List-Compare') - pt_rv = module_build_service.utils.get_reusable_component( - db.session, second_module_build, 'perl-Tangerine') - tangerine_rv = module_build_service.utils.get_reusable_component( - db.session, second_module_build, 'tangerine') - - if changed_component == 'perl-List-Compare': - # perl-Tangerine can be reused even though a component in its batch has changed - assert plc_rv is None - assert pt_rv.package == 'perl-Tangerine' - assert tangerine_rv is None - elif changed_component == 'perl-Tangerine': - # perl-List-Compare can be reused even though a component in its batch has changed - assert plc_rv.package == 'perl-List-Compare' - assert pt_rv is None - assert tangerine_rv is None - elif changed_component == 'tangerine': - # perl-List-Compare and perl-Tangerine can be reused since they are in an earlier - # buildorder than tangerine - assert plc_rv.package == 'perl-List-Compare' - assert pt_rv.package == 'perl-Tangerine' - assert tangerine_rv is None - elif changed_component is None: - # Nothing has changed so everthing can be used - assert plc_rv.package == 'perl-List-Compare' - assert pt_rv.package == 'perl-Tangerine' - assert tangerine_rv.package == 'tangerine' - - def test_get_reusable_component_different_rpm_macros(self): - test_reuse_component_init_data() - second_module_build = models.ModuleBuild.query.filter_by(id=2).one() - mmd = second_module_build.mmd() - mmd.buildopts.rpms.macros = "%my_macro 1" - second_module_build.modulemd = mmd.dumps() - db.session.commit() - - plc_rv = module_build_service.utils.get_reusable_component( - db.session, second_module_build, 'perl-List-Compare') - assert plc_rv is None - - pt_rv = module_build_service.utils.get_reusable_component( - db.session, second_module_build, 'perl-Tangerine') - assert pt_rv is None - - def test_get_reusable_component_different_buildrequires_hash(self): - test_reuse_component_init_data() - second_module_build = models.ModuleBuild.query.filter_by(id=2).one() - mmd = second_module_build.mmd() - mmd.xmd['mbs']['buildrequires']['platform']['ref'] = \ - 'da39a3ee5e6b4b0d3255bfef95601890afd80709' - second_module_build.modulemd = mmd.dumps() - second_module_build.build_context = '37c6c57bedf4305ef41249c1794760b5cb8fad17' - db.session.commit() - - plc_rv = module_build_service.utils.get_reusable_component( - db.session, second_module_build, 'perl-List-Compare') - assert plc_rv is None - - pt_rv = module_build_service.utils.get_reusable_component( - db.session, second_module_build, 'perl-Tangerine') - assert pt_rv is None - - tangerine_rv = module_build_service.utils.get_reusable_component( - db.session, second_module_build, 'tangerine') - assert tangerine_rv is None - - def test_get_reusable_component_different_buildrequires(self): - test_reuse_component_init_data() - second_module_build = models.ModuleBuild.query.filter_by(id=2).one() - mmd = second_module_build.mmd() - mmd.buildrequires = {'some_module': 'master'} - mmd.xmd['mbs']['buildrequires'] = { - 'some_module': { - 'ref': 'da39a3ee5e6b4b0d3255bfef95601890afd80709', - 'stream': 'master', - 'version': '20170123140147' - } - } - second_module_build.modulemd = mmd.dumps() - second_module_build.build_context = '37c6c57bedf4305ef41249c1794760b5cb8fad17' - db.session.commit() - - plc_rv = module_build_service.utils.get_reusable_component( - db.session, second_module_build, 'perl-List-Compare') - assert plc_rv is None - - pt_rv = module_build_service.utils.get_reusable_component( - db.session, second_module_build, 'perl-Tangerine') - assert pt_rv is None - - tangerine_rv = module_build_service.utils.get_reusable_component( - db.session, second_module_build, 'tangerine') - assert tangerine_rv is None - def test_get_reusable_component_shared_userspace_ordering(self): """ For modules with lot of components per batch, there is big chance that @@ -264,7 +301,7 @@ class TestUtils: current `new_module`. In this case, reuse code should still be able to reuse the components. """ - test_reuse_shared_userspace_init_data() + reuse_shared_userspace_init_data() new_module = models.ModuleBuild.query.filter_by(id=2).one() rv = module_build_service.utils.get_reusable_component( db.session, new_module, 'llvm') @@ -419,41 +456,6 @@ class TestUtils: assert str(e.value) == error_msg - @patch("module_build_service.utils.submit_module_build") - def test_submit_module_build_from_yaml_with_skiptests(self, mock_submit): - """ - Tests local module build from a yaml file with the skiptests option - - Args: - mock_submit (MagickMock): mocked function submit_module_build, which we then - inspect if it was called with correct arguments - """ - test_reuse_component_init_data() - - module_dir = tempfile.mkdtemp() - module = models.ModuleBuild.query.filter_by(id=2).one() - mmd = module.mmd() - modulemd_yaml = mmd.dumps() - modulemd_file_path = path.join(module_dir, "testmodule.yaml") - - username = "test" - stream = "dev" - - with open(modulemd_file_path, "w") as fd: - fd.write(modulemd_yaml) - - with open(modulemd_file_path, "r") as fd: - handle = FileStorage(fd) - module_build_service.utils.submit_module_build_from_yaml(username, handle, - stream=stream, skiptests=True) - mock_submit_args = mock_submit.call_args[0] - username_arg = mock_submit_args[0] - mmd_arg = mock_submit_args[2] - assert mmd_arg.stream == stream - assert "\n\n%__spec_check_pre exit 0\n" in mmd_arg.buildopts.rpms.macros - assert username_arg == username - rmtree(module_dir) - @patch('module_build_service.scm.SCM') def test_record_component_builds_set_weight(self, mocked_scm, pdc_module_inactive): with app.app_context(): @@ -563,11 +565,11 @@ class DummyModuleBuilder(GenericBuilder): class TestBatches: def setup_method(self, test_method): - test_reuse_component_init_data() + reuse_component_init_data() GenericBuilder.register_backend_class(DummyModuleBuilder) def teardown_method(self, test_method): - init_data() + clean_database() DummyModuleBuilder.TAGGED_COMPONENTS = [] GenericBuilder.register_backend_class(KojiModuleBuilder) @@ -834,10 +836,10 @@ class TestBatches: class TestLocalBuilds: def setup_method(self): - init_data() + clean_database() def teardown_method(self): - init_data() + clean_database() def test_load_local_builds_name(self, conf_system, conf_resultsdir): with app.app_context(): diff --git a/tests/test_views/test_views.py b/tests/test_views/test_views.py index 5f91c6a7..4e3bffbe 100644 --- a/tests/test_views/test_views.py +++ b/tests/test_views/test_views.py @@ -112,7 +112,7 @@ class FakeSCM(object): class TestViews: def setup_method(self, test_method): self.client = app.test_client() - init_data() + init_data(2) def test_query_build(self): rv = self.client.get('/module-build-service/1/module-builds/1') @@ -162,7 +162,7 @@ class TestViews: data = json.loads(rv.data) assert data['component_builds'] == [1, 2] assert data['context'] == '00000000' - # There is no xmd information on this module, so these values should be null + # There is no xmd information on this module, so these values should be None assert data['build_context'] is None assert data['runtime_context'] is None assert data['id'] == 1 @@ -203,26 +203,26 @@ class TestViews: assert data['rebuild_strategy'] == 'changed-and-after' def test_pagination_metadata(self): - rv = self.client.get('/module-build-service/1/module-builds/?per_page=8&page=2') + rv = self.client.get('/module-build-service/1/module-builds/?per_page=2&page=2') meta_data = json.loads(rv.data)['meta'] - assert meta_data['prev'].split('?', 1)[1] in ['per_page=8&page=1', 'page=1&per_page=8'] - assert meta_data['next'].split('?', 1)[1] in ['per_page=8&page=3', 'page=3&per_page=8'] - assert meta_data['last'].split('?', 1)[1] in ['per_page=8&page=4', 'page=4&per_page=8'] - assert meta_data['first'].split('?', 1)[1] in ['per_page=8&page=1', 'page=1&per_page=8'] - assert meta_data['total'] == 30 - assert meta_data['per_page'] == 8 - assert meta_data['pages'] == 4 + assert meta_data['prev'].split('?', 1)[1] in ['per_page=2&page=1', 'page=1&per_page=2'] + assert meta_data['next'].split('?', 1)[1] in ['per_page=2&page=3', 'page=3&per_page=2'] + assert meta_data['last'].split('?', 1)[1] in ['per_page=2&page=3', 'page=3&per_page=2'] + assert meta_data['first'].split('?', 1)[1] in ['per_page=2&page=1', 'page=1&per_page=2'] + assert meta_data['total'] == 6 + assert meta_data['per_page'] == 2 + assert meta_data['pages'] == 3 assert meta_data['page'] == 2 def test_pagination_metadata_with_args(self): - rv = self.client.get('/module-build-service/1/module-builds/?per_page=8&page=2&order_by=id') + rv = self.client.get('/module-build-service/1/module-builds/?per_page=2&page=2&order_by=id') meta_data = json.loads(rv.data)['meta'] for link in [meta_data['prev'], meta_data['next'], meta_data['last'], meta_data['first']]: assert 'order_by=id' in link - assert 'per_page=8' in link - assert meta_data['total'] == 30 - assert meta_data['per_page'] == 8 - assert meta_data['pages'] == 4 + assert 'per_page=2' in link + assert meta_data['total'] == 6 + assert meta_data['per_page'] == 2 + assert meta_data['pages'] == 3 assert meta_data['page'] == 2 def test_query_builds(self): @@ -230,72 +230,70 @@ class TestViews: items = json.loads(rv.data)['items'] expected = [ { - 'id': 30, - 'context': '00000000', - 'koji_tag': None, - 'name': 'testmodule', - 'rebuild_strategy': 'changed-and-after', - 'owner': 'some_other_user', - 'scmurl': ('git://pkgs.domain.local/modules/testmodule?' - '#ca95886c7a443b36a9ce31abda1f9bef22f2f8c9'), - 'state': 1, - 'state_name': 'wait', - 'state_reason': None, - 'stream': '4.3.43', - 'tasks': { - 'rpms': { - 'module-build-macros': { - 'nvr': 'module-build-macros-01-1.module+30+8d3cee59', - 'state': 1, - 'state_reason': None, - 'task_id': 47384002 + "state_name": "wait", + "name": "testmodule", + "tasks": { + "rpms": { + "module-build-macros": { + "state": 1, + "state_reason": None, + "task_id": 47383994, + "nvr": "module-build-macros-01-1.module+6+8d3cee59" }, - 'rubygem-rails': { - 'nvr': 'postgresql-9.5.3-4.module+30+8d3cee59', - 'state': 3, - 'state_reason': None, - 'task_id': 2433442 + "rubygem-rails": { + "state": 3, + "state_reason": None, + "task_id": 2433434, + "nvr": "postgresql-9.5.3-4.module+6+8d3cee59" } } }, - 'time_completed': None, - 'time_modified': '2016-09-03T13:58:40Z', - 'time_submitted': '2016-09-03T13:58:33Z', - 'version': '6' + "owner": "some_other_user", + "version": "6", + "state_reason": None, + "state": 1, + "stream": "4.3.43", + "time_submitted": "2016-09-03T12:38:33Z", + "scmurl": "git://pkgs.domain.local/modules/testmodule?#ca95886c7a443b36a9ce31abda1f9bef22f2f8c9", + "id": 6, + "context": "00000000", + "time_completed": None, + "time_modified": "2016-09-03T12:38:40Z", + "rebuild_strategy": "changed-and-after", + "koji_tag": None }, { - 'id': 29, - 'context': '00000000', - 'koji_tag': 'module-postgressql-1.2', - 'name': 'postgressql', - 'owner': 'some_user', - 'rebuild_strategy': 'changed-and-after', - 'scmurl': ('git://pkgs.domain.local/modules/postgressql?' - '#aa95886c7a443b36a9ce31abda1f9bef22f2f8c9'), - 'state': 3, - 'state_name': 'done', - 'state_reason': None, - 'stream': '1', - 'tasks': { - 'rpms': { - 'module-build-macros': { - 'nvr': 'module-build-macros-01-1.module+29+0557c87d', - 'state': 1, - 'state_reason': None, - 'task_id': 47384002 + "state_name": "done", + "name": "postgressql", + "tasks": { + "rpms": { + "module-build-macros": { + "state": 1, + "state_reason": None, + "task_id": 47383994, + "nvr": "module-build-macros-01-1.module+5+0557c87d" }, - 'postgresql': { - 'nvr': 'postgresql-9.5.3-4.module+29+0557c87d', - 'state': 1, - 'state_reason': None, - 'task_id': 2433442 + "postgresql": { + "state": 1, + "state_reason": None, + "task_id": 2433434, + "nvr": "postgresql-9.5.3-4.module+5+0557c87d" } } }, - 'time_completed': '2016-09-03T12:57:19Z', - 'time_modified': '2016-09-03T13:57:19Z', - 'time_submitted': '2016-09-03T13:55:33Z', - 'version': '2' + "owner": "some_user", + "version": "2", + "state_reason": None, + "state": 3, + "stream": "1", + "time_submitted": "2016-09-03T12:35:33Z", + "scmurl": "git://pkgs.domain.local/modules/postgressql?#aa95886c7a443b36a9ce31abda1f9bef22f2f8c9", + "id": 5, + "context": "00000000", + "time_completed": "2016-09-03T11:37:19Z", + "time_modified": "2016-09-03T12:37:19Z", + "rebuild_strategy": "changed-and-after", + "koji_tag": "module-postgressql-1.2" } ] assert items == expected @@ -357,7 +355,7 @@ class TestViews: rv = self.client.get('/module-build-service/1/component-builds/' '?format=rpms') data = json.loads(rv.data) - assert data['meta']['total'] == 60 + assert data['meta']['total'] == 12 def test_query_component_builds_filter_ref(self): rv = self.client.get('/module-build-service/1/component-builds/' @@ -368,7 +366,7 @@ class TestViews: def test_query_component_builds_filter_tagged(self): rv = self.client.get('/module-build-service/1/component-builds/?tagged=true') data = json.loads(rv.data) - assert data['meta']['total'] == 40 + assert data['meta']['total'] == 8 def test_query_component_builds_filter_nvr(self): rv = self.client.get('/module-build-service/1/component-builds/?nvr=nginx-1.10.1-2.' @@ -384,12 +382,12 @@ class TestViews: def test_query_builds_filter_name(self): rv = self.client.get('/module-build-service/1/module-builds/?name=nginx') data = json.loads(rv.data) - assert data['meta']['total'] == 10 + assert data['meta']['total'] == 2 def test_query_builds_filter_koji_tag(self): rv = self.client.get('/module-build-service/1/module-builds/?koji_tag=module-nginx-1.2') data = json.loads(rv.data) - assert data['meta']['total'] == 10 + assert data['meta']['total'] == 2 def test_query_builds_filter_completed_before(self): rv = self.client.get( @@ -399,51 +397,51 @@ class TestViews: def test_query_builds_filter_completed_after(self): rv = self.client.get( - '/module-build-service/1/module-builds/?completed_after=2016-09-03T12:25:00Z') + '/module-build-service/1/module-builds/?completed_after=2016-09-03T11:35:00Z') data = json.loads(rv.data) - assert data['meta']['total'] == 8 + assert data['meta']['total'] == 2 def test_query_builds_filter_submitted_before(self): rv = self.client.get( - '/module-build-service/1/module-builds/?submitted_before=2016-09-03T12:25:00Z') + '/module-build-service/1/module-builds/?submitted_before=2016-09-03T11:35:00Z') data = json.loads(rv.data) - assert data['meta']['total'] == 7 + assert data['meta']['total'] == 2 def test_query_builds_filter_submitted_after(self): rv = self.client.get( - '/module-build-service/1/module-builds/?submitted_after=2016-09-03T12:25:00Z') + '/module-build-service/1/module-builds/?submitted_after=2016-09-03T11:35:00Z') data = json.loads(rv.data) - assert data['meta']['total'] == 23 + assert data['meta']['total'] == 4 def test_query_builds_filter_modified_before(self): rv = self.client.get( - '/module-build-service/1/module-builds/?modified_before=2016-09-03T12:25:00Z') + '/module-build-service/1/module-builds/?modified_before=2016-09-03T11:35:00Z') data = json.loads(rv.data) - assert data['meta']['total'] == 6 + assert data['meta']['total'] == 1 def test_query_builds_filter_modified_after(self): rv = self.client.get( - '/module-build-service/1/module-builds/?modified_after=2016-09-03T12:25:00Z') + '/module-build-service/1/module-builds/?modified_after=2016-09-03T11:35:00Z') data = json.loads(rv.data) - assert data['meta']['total'] == 24 + assert data['meta']['total'] == 5 def test_query_builds_filter_owner(self): rv = self.client.get( '/module-build-service/1/module-builds/?owner=Moe%20Szyslak') data = json.loads(rv.data) - assert data['meta']['total'] == 10 + assert data['meta']['total'] == 2 def test_query_builds_filter_state(self): rv = self.client.get( '/module-build-service/1/module-builds/?state=3') data = json.loads(rv.data) - assert data['meta']['total'] == 20 + assert data['meta']['total'] == 4 def test_query_builds_two_filters(self): rv = self.client.get('/module-build-service/1/module-builds/?owner=Moe%20Szyslak' - '&modified_after=2016-09-03T12:25:00Z') + '&modified_after=2016-09-03T11:35:00Z') data = json.loads(rv.data) - assert data['meta']['total'] == 4 + assert data['meta']['total'] == 1 def test_query_builds_filter_nsv(self): rv = self.client.get( @@ -454,7 +452,7 @@ class TestViews: assert item['name'] == 'postgressql' assert item['stream'] == '1' assert item['version'] == '2' - assert data['meta']['total'] == 10 + assert data['meta']['total'] == 2 def test_query_builds_filter_invalid_date(self): rv = self.client.get( @@ -526,10 +524,10 @@ class TestViews: assert data['time_completed'] is None assert data['stream'] == 'master' assert data['owner'] == 'Homer J. Simpson' - assert data['id'] == 31 + assert data['id'] == 7 assert data['rebuild_strategy'] == 'changed-and-after' assert data['state_name'] == 'init' - assert data['state_url'] == '/module-build-service/1/module-builds/31' + assert data['state_url'] == '/module-build-service/1/module-builds/7' assert len(data['state_trace']) == 1 assert data['state_trace'][0]['state'] == 0 assert data['tasks'] == {} @@ -616,7 +614,7 @@ class TestViews: assert data['time_completed'] is None assert data['stream'] == 'master' assert data['owner'] == 'Homer J. Simpson' - assert data['id'] == 31 + assert data['id'] == 7 assert data['state_name'] == 'init' assert data['rebuild_strategy'] == 'changed-and-after' @@ -681,7 +679,7 @@ class TestViews: @patch('module_build_service.auth.get_user', return_value=other_user) def test_cancel_build(self, mocked_get_user): - rv = self.client.patch('/module-build-service/1/module-builds/30', + rv = self.client.patch('/module-build-service/1/module-builds/6', data=json.dumps({'state': 'failed'})) data = json.loads(rv.data) @@ -690,11 +688,11 @@ class TestViews: @patch('module_build_service.auth.get_user', return_value=other_user) def test_cancel_build_already_failed(self, mocked_get_user): - module = ModuleBuild.query.filter_by(id=30).one() + module = ModuleBuild.query.filter_by(id=6).one() module.state = 4 db.session.add(module) db.session.commit() - rv = self.client.patch('/module-build-service/1/module-builds/30', + rv = self.client.patch('/module-build-service/1/module-builds/6', data=json.dumps({'state': 'failed'})) data = json.loads(rv.data) @@ -703,7 +701,7 @@ class TestViews: @patch('module_build_service.auth.get_user', return_value=('sammy', set())) def test_cancel_build_unauthorized_no_groups(self, mocked_get_user): - rv = self.client.patch('/module-build-service/1/module-builds/30', + rv = self.client.patch('/module-build-service/1/module-builds/6', data=json.dumps({'state': 'failed'})) data = json.loads(rv.data) @@ -712,7 +710,7 @@ class TestViews: @patch('module_build_service.auth.get_user', return_value=('sammy', set(["packager"]))) def test_cancel_build_unauthorized_not_owner(self, mocked_get_user): - rv = self.client.patch('/module-build-service/1/module-builds/30', + rv = self.client.patch('/module-build-service/1/module-builds/6', data=json.dumps({'state': 'failed'})) data = json.loads(rv.data) @@ -724,7 +722,7 @@ class TestViews: def test_cancel_build_admin(self, mocked_get_user): with patch("module_build_service.config.Config.admin_groups", new_callable=PropertyMock, return_value=set(["mbs-admin"])): - rv = self.client.patch('/module-build-service/1/module-builds/30', + rv = self.client.patch('/module-build-service/1/module-builds/6', data=json.dumps({'state': 'failed'})) data = json.loads(rv.data) @@ -736,7 +734,7 @@ class TestViews: def test_cancel_build_no_admin(self, mocked_get_user): with patch("module_build_service.config.Config.admin_groups", new_callable=PropertyMock, return_value=set(["mbs-admin"])): - rv = self.client.patch('/module-build-service/1/module-builds/30', + rv = self.client.patch('/module-build-service/1/module-builds/6', data=json.dumps({'state': 'failed'})) data = json.loads(rv.data) @@ -745,7 +743,7 @@ class TestViews: @patch('module_build_service.auth.get_user', return_value=other_user) def test_cancel_build_wrong_param(self, mocked_get_user): - rv = self.client.patch('/module-build-service/1/module-builds/30', + rv = self.client.patch('/module-build-service/1/module-builds/6', data=json.dumps({'some_param': 'value'})) data = json.loads(rv.data) @@ -755,7 +753,7 @@ class TestViews: @patch('module_build_service.auth.get_user', return_value=other_user) def test_cancel_build_wrong_state(self, mocked_get_user): - rv = self.client.patch('/module-build-service/1/module-builds/30', + rv = self.client.patch('/module-build-service/1/module-builds/6', data=json.dumps({'state': 'some_state'})) data = json.loads(rv.data)