Save another 20s in tests.

This commit is contained in:
Jan Kaluza
2018-02-09 11:46:12 +01:00
parent fb1463a036
commit 6a5d7267fd
13 changed files with 291 additions and 286 deletions

View File

@@ -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:

View File

@@ -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

View File

@@ -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')

View File

@@ -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

View File

@@ -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

View File

@@ -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):

View File

@@ -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)

View File

@@ -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__,

View File

@@ -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')

View File

@@ -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

View File

@@ -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):

View File

@@ -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():

View File

@@ -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)