Fix tests in order to run with PostgreSQL

Most of the issues are caused by the use of SQLAlchemy database session. Some
inline comments describe the issues in detail.

Signed-off-by: Chenxiong Qi <cqi@redhat.com>
This commit is contained in:
Chenxiong Qi
2019-06-27 12:12:50 +08:00
parent 302c76b90f
commit e49f69f7b5
18 changed files with 758 additions and 634 deletions

View File

@@ -121,10 +121,11 @@ class TestDecisionUpdateHandler:
clean_database()
# This build should be queried and transformed to ready state
module_build = make_module("pkg:0.1:1:c1", requires_list={"platform": "el8"})
module_build = make_module(db.session, "pkg:0.1:1:c1", requires_list={"platform": "el8"})
module_build.transition(
conf, BUILD_STATES["done"], "Move to done directly for running test."
)
db.session.commit()
# Assert this call below
first_publish_call = call(
@@ -134,8 +135,6 @@ class TestDecisionUpdateHandler:
conf=conf,
)
db.session.refresh(module_build)
ClientSession.return_value.getBuild.return_value = {
"extra": {"typeinfo": {"module": {"module_build_service_id": module_build.id}}}
}

View File

@@ -27,7 +27,7 @@ import module_build_service.scheduler.handlers.modules
import os
import koji
import pytest
from tests import conf, db, app, scheduler_init_data
from tests import conf, db, scheduler_init_data
import module_build_service.resolver
from module_build_service import build_logs, Modulemd
from module_build_service.utils.general import load_mmd_file
@@ -94,47 +94,46 @@ class TestModuleWait:
@patch("module_build_service.resolver.DBResolver")
@patch("module_build_service.resolver.GenericResolver")
def test_new_repo_called_when_macros_reused(
self, generic_resolver, resolver, create_builder, dbg
self, generic_resolver, resolver, create_builder, dbg, db_session
):
"""
Test that newRepo is called when module-build-macros build is reused.
"""
with app.app_context():
scheduler_init_data()
koji_session = mock.MagicMock()
koji_session.newRepo.return_value = 123456
scheduler_init_data(db_session)
koji_session = mock.MagicMock()
koji_session.newRepo.return_value = 123456
builder = mock.MagicMock()
builder.koji_session = koji_session
builder.module_build_tag = {"name": "module-123-build"}
builder.get_disttag_srpm.return_value = "some srpm disttag"
builder.build.return_value = (
1234,
koji.BUILD_STATES["COMPLETE"],
"",
"module-build-macros-1-1",
)
create_builder.return_value = builder
builder = mock.MagicMock()
builder.koji_session = koji_session
builder.module_build_tag = {"name": "module-123-build"}
builder.get_disttag_srpm.return_value = "some srpm disttag"
builder.build.return_value = (
1234,
koji.BUILD_STATES["COMPLETE"],
"",
"module-build-macros-1-1",
)
create_builder.return_value = builder
resolver = mock.MagicMock()
resolver.backend = "db"
resolver.get_module_tag.return_value = "module-testmodule-master-20170109091357"
resolver = mock.MagicMock()
resolver.backend = "db"
resolver.get_module_tag.return_value = "module-testmodule-master-20170109091357"
with patch.object(module_build_service.resolver, "system_resolver", new=resolver):
msg = module_build_service.messaging.MBSModule(
msg_id=None, module_build_id=2, module_build_state="some state")
module_build_service.scheduler.handlers.modules.wait(
config=conf, session=db.session, msg=msg)
koji_session.newRepo.assert_called_once_with("module-123-build")
with patch.object(module_build_service.resolver, "system_resolver", new=resolver):
msg = module_build_service.messaging.MBSModule(
msg_id=None, module_build_id=2, module_build_state="some state")
module_build_service.scheduler.handlers.modules.wait(
config=conf, session=db_session, msg=msg)
koji_session.newRepo.assert_called_once_with("module-123-build")
# When module-build-macros is reused, it still has to appear only
# once in database.
builds_count = (
db.session.query(ComponentBuild)
.filter_by(package="module-build-macros", module_id=2)
.count()
)
assert builds_count == 1
# When module-build-macros is reused, it still has to appear only
# once in database.
builds_count = (
db.session.query(ComponentBuild)
.filter_by(package="module-build-macros", module_id=2)
.count()
)
assert builds_count == 1
@patch(
"module_build_service.builder.GenericBuilder.default_buildroot_groups",
@@ -144,38 +143,37 @@ class TestModuleWait:
@patch("module_build_service.resolver.DBResolver")
@patch("module_build_service.resolver.GenericResolver")
def test_new_repo_not_called_when_macros_not_reused(
self, generic_resolver, resolver, create_builder, dbg
self, generic_resolver, resolver, create_builder, dbg, db_session
):
"""
Test that newRepo is called everytime for module-build-macros
"""
with app.app_context():
scheduler_init_data()
koji_session = mock.MagicMock()
koji_session.newRepo.return_value = 123456
scheduler_init_data(db_session)
koji_session = mock.MagicMock()
koji_session.newRepo.return_value = 123456
builder = mock.MagicMock()
builder.koji_session = koji_session
builder.module_build_tag = {"name": "module-123-build"}
builder.get_disttag_srpm.return_value = "some srpm disttag"
builder.build.return_value = (
1234,
koji.BUILD_STATES["BUILDING"],
"",
"module-build-macros-1-1",
)
create_builder.return_value = builder
builder = mock.MagicMock()
builder.koji_session = koji_session
builder.module_build_tag = {"name": "module-123-build"}
builder.get_disttag_srpm.return_value = "some srpm disttag"
builder.build.return_value = (
1234,
koji.BUILD_STATES["BUILDING"],
"",
"module-build-macros-1-1",
)
create_builder.return_value = builder
resolver = mock.MagicMock()
resolver.backend = "db"
resolver.get_module_tag.return_value = "module-testmodule-master-20170109091357"
resolver = mock.MagicMock()
resolver.backend = "db"
resolver.get_module_tag.return_value = "module-testmodule-master-20170109091357"
with patch.object(module_build_service.resolver, "system_resolver", new=resolver):
msg = module_build_service.messaging.MBSModule(
msg_id=None, module_build_id=2, module_build_state="some state")
module_build_service.scheduler.handlers.modules.wait(
config=conf, session=db.session, msg=msg)
assert koji_session.newRepo.called
with patch.object(module_build_service.resolver, "system_resolver", new=resolver):
msg = module_build_service.messaging.MBSModule(
msg_id=None, module_build_id=2, module_build_state="some state")
module_build_service.scheduler.handlers.modules.wait(
config=conf, session=db_session, msg=msg)
assert koji_session.newRepo.called
@patch(
"module_build_service.builder.GenericBuilder.default_buildroot_groups",
@@ -185,44 +183,43 @@ class TestModuleWait:
@patch("module_build_service.resolver.DBResolver")
@patch("module_build_service.resolver.GenericResolver")
def test_set_cg_build_koji_tag_fallback_to_default(
self, generic_resolver, resolver, create_builder, dbg
self, generic_resolver, resolver, create_builder, dbg, db_session
):
"""
Test that build.cg_build_koji_tag fallbacks to default tag.
"""
with app.app_context():
base_mmd = Modulemd.ModuleStreamV2.new("base-runtime", "f27")
base_mmd = Modulemd.ModuleStreamV2.new("base-runtime", "f27")
scheduler_init_data()
koji_session = mock.MagicMock()
koji_session.newRepo.return_value = 123456
scheduler_init_data(db_session)
koji_session = mock.MagicMock()
koji_session.newRepo.return_value = 123456
builder = mock.MagicMock()
builder.koji_session = koji_session
builder.module_build_tag = {"name": "module-123-build"}
builder.get_disttag_srpm.return_value = "some srpm disttag"
builder.build.return_value = (
1234,
koji.BUILD_STATES["BUILDING"],
"",
"module-build-macros-1-1",
)
create_builder.return_value = builder
builder = mock.MagicMock()
builder.koji_session = koji_session
builder.module_build_tag = {"name": "module-123-build"}
builder.get_disttag_srpm.return_value = "some srpm disttag"
builder.build.return_value = (
1234,
koji.BUILD_STATES["BUILDING"],
"",
"module-build-macros-1-1",
)
create_builder.return_value = builder
resolver = mock.MagicMock()
resolver.backend = "db"
resolver.get_module_tag.return_value = "module-testmodule-master-20170109091357"
resolver.get_module_build_dependencies.return_value = {
"module-bootstrap-tag": [base_mmd]
}
resolver = mock.MagicMock()
resolver.backend = "db"
resolver.get_module_tag.return_value = "module-testmodule-master-20170109091357"
resolver.get_module_build_dependencies.return_value = {
"module-bootstrap-tag": [base_mmd]
}
with patch.object(module_build_service.resolver, "system_resolver", new=resolver):
msg = module_build_service.messaging.MBSModule(
msg_id=None, module_build_id=2, module_build_state="some state")
module_build_service.scheduler.handlers.modules.wait(
config=conf, session=db.session, msg=msg)
module_build = ModuleBuild.query.filter_by(id=2).one()
assert module_build.cg_build_koji_tag == "modular-updates-candidate"
with patch.object(module_build_service.resolver, "system_resolver", new=resolver):
msg = module_build_service.messaging.MBSModule(
msg_id=None, module_build_id=2, module_build_state="some state")
module_build_service.scheduler.handlers.modules.wait(
config=conf, session=db_session, msg=msg)
module_build = ModuleBuild.query.filter_by(id=2).one()
assert module_build.cg_build_koji_tag == "modular-updates-candidate"
@pytest.mark.parametrize(
"koji_cg_tag_build,expected_cg_koji_build_tag",
@@ -252,47 +249,47 @@ class TestModuleWait:
dbg,
koji_cg_tag_build,
expected_cg_koji_build_tag,
db_session,
):
"""
Test that build.cg_build_koji_tag is set.
"""
with app.app_context():
base_mmd = Modulemd.ModuleStreamV2.new("base-runtime", "f27")
base_mmd = Modulemd.ModuleStreamV2.new("base-runtime", "f27")
scheduler_init_data()
koji_session = mock.MagicMock()
koji_session.newRepo.return_value = 123456
scheduler_init_data(db_session)
koji_session = mock.MagicMock()
koji_session.newRepo.return_value = 123456
builder = mock.MagicMock()
builder.koji_session = koji_session
builder.module_build_tag = {"name": "module-123-build"}
builder.get_disttag_srpm.return_value = "some srpm disttag"
builder.build.return_value = (
1234,
koji.BUILD_STATES["BUILDING"],
"",
"module-build-macros-1-1",
)
create_builder.return_value = builder
builder = mock.MagicMock()
builder.koji_session = koji_session
builder.module_build_tag = {"name": "module-123-build"}
builder.get_disttag_srpm.return_value = "some srpm disttag"
builder.build.return_value = (
1234,
koji.BUILD_STATES["BUILDING"],
"",
"module-build-macros-1-1",
)
create_builder.return_value = builder
resolver = mock.MagicMock()
resolver.backend = "db"
resolver.get_module_tag.return_value = "module-testmodule-master-20170109091357"
resolver.get_module_build_dependencies.return_value = {
"module-bootstrap-tag": [base_mmd]
}
resolver = mock.MagicMock()
resolver.backend = "db"
resolver.get_module_tag.return_value = "module-testmodule-master-20170109091357"
resolver.get_module_build_dependencies.return_value = {
"module-bootstrap-tag": [base_mmd]
}
with patch.object(
module_build_service.scheduler.handlers.modules.conf,
"koji_cg_tag_build",
new=koji_cg_tag_build,
):
with patch.object(module_build_service.resolver, "system_resolver", new=resolver):
msg = module_build_service.messaging.MBSModule(
msg_id=None, module_build_id=2, module_build_state="some state"
)
module_build_service.scheduler.handlers.modules.wait(
config=conf, session=db.session, msg=msg
)
module_build = ModuleBuild.query.filter_by(id=2).one()
assert module_build.cg_build_koji_tag == expected_cg_koji_build_tag
with patch.object(
module_build_service.scheduler.handlers.modules.conf,
"koji_cg_tag_build",
new=koji_cg_tag_build,
):
with patch.object(module_build_service.resolver, "system_resolver", new=resolver):
msg = module_build_service.messaging.MBSModule(
msg_id=None, module_build_id=2, module_build_state="some state"
)
module_build_service.scheduler.handlers.modules.wait(
config=conf, session=db_session, msg=msg
)
module_build = ModuleBuild.query.filter_by(id=2).one()
assert module_build.cg_build_koji_tag == expected_cg_koji_build_tag

View File

@@ -25,20 +25,21 @@ import mock
import module_build_service.messaging
import module_build_service.scheduler.handlers.repos
import module_build_service.models
from tests import conf, db, app, scheduler_init_data
from tests import conf, db, scheduler_init_data
class TestRepoDone:
@mock.patch("module_build_service.models.ModuleBuild.from_repo_done_event")
def test_no_match(self, from_repo_done_event):
def test_no_match(self, from_repo_done_event, db_session):
""" Test that when a repo msg hits us and we have no match,
that we do nothing gracefully.
"""
scheduler_init_data()
scheduler_init_data(db_session)
from_repo_done_event.return_value = None
msg = module_build_service.messaging.KojiRepoChange(
"no matches for this...", "2016-some-nonexistent-build")
module_build_service.scheduler.handlers.repos.done(config=conf, session=db.session, msg=msg)
module_build_service.scheduler.handlers.repos.done(config=conf, session=db_session, msg=msg)
@mock.patch(
"module_build_service.builder.KojiModuleBuilder."
@@ -65,17 +66,17 @@ class TestRepoDone:
"module_build_service.builder.KojiModuleBuilder.KojiModuleBuilder.buildroot_connect"
)
def test_a_single_match(
self, connect, build_fn, get_session, ready, list_tasks_fn, mock_gabt, mock_uea
self, connect, build_fn, get_session, ready, list_tasks_fn, mock_gabt, mock_uea, db_session
):
""" Test that when a repo msg hits us and we have a single match.
"""
scheduler_init_data()
scheduler_init_data(db_session)
get_session.return_value = mock.Mock(), "development"
build_fn.return_value = 1234, 1, "", None
msg = module_build_service.messaging.KojiRepoChange(
"some_msg_id", "module-testmodule-master-20170109091357-7c29193d-build")
module_build_service.scheduler.handlers.repos.done(config=conf, session=db.session, msg=msg)
module_build_service.scheduler.handlers.repos.done(config=conf, session=db_session, msg=msg)
build_fn.assert_called_once_with(
artifact_name="tangerine",
source=(
@@ -110,11 +111,12 @@ class TestRepoDone:
"module_build_service.builder.KojiModuleBuilder.KojiModuleBuilder.buildroot_connect"
)
def test_a_single_match_finalize(
self, connect, build_fn, get_session, ready, list_tasks_fn, mock_gabt, mock_uea, finalizer
self, connect, build_fn, get_session, ready, list_tasks_fn, mock_gabt, mock_uea, finalizer,
db_session
):
""" Test that when a repo msg hits us and we have a single match.
"""
scheduler_init_data(tangerine_state=1)
scheduler_init_data(db_session, tangerine_state=1)
get_session.return_value = mock.Mock(), "development"
build_fn.return_value = 1234, 1, "", None
@@ -128,14 +130,14 @@ class TestRepoDone:
# Check that the time_completed is set in the time when
# finalizer is called.
assert succeeded is True
module_build = module_build_service.models.ModuleBuild.query.get(2)
module_build = db_session.query(module_build_service.models.ModuleBuild).get(2)
assert module_build.time_completed is not None
finalizer.side_effect = mocked_finalizer
msg = module_build_service.messaging.KojiRepoChange(
"some_msg_id", "module-testmodule-master-20170109091357-7c29193d-build")
module_build_service.scheduler.handlers.repos.done(config=conf, session=db.session, msg=msg)
module_build_service.scheduler.handlers.repos.done(config=conf, session=db_session, msg=msg)
finalizer.assert_called_once()
@@ -164,18 +166,18 @@ class TestRepoDone:
"module_build_service.builder.KojiModuleBuilder.KojiModuleBuilder.buildroot_connect"
)
def test_a_single_match_build_fail(
self, connect, build_fn, config, ready, list_tasks_fn, mock_gabt, mock_uea
self, connect, build_fn, config, ready, list_tasks_fn, mock_gabt, mock_uea, db_session
):
""" Test that when a KojiModuleBuilder.build fails, the build is
marked as failed with proper state_reason.
"""
scheduler_init_data()
scheduler_init_data(db_session)
config.return_value = mock.Mock(), "development"
build_fn.return_value = None, 4, "Failed to submit artifact tangerine to Koji", None
msg = module_build_service.messaging.KojiRepoChange(
"some_msg_id", "module-testmodule-master-20170109091357-7c29193d-build")
module_build_service.scheduler.handlers.repos.done(config=conf, session=db.session, msg=msg)
module_build_service.scheduler.handlers.repos.done(config=conf, session=db_session, msg=msg)
build_fn.assert_called_once_with(
artifact_name="tangerine",
source=(
@@ -183,16 +185,17 @@ class TestRepoDone:
"#fbed359411a1baa08d4a88e0d12d426fbf8f602c"
),
)
component_build = (
module_build_service.models.ComponentBuild.query.filter_by(package="tangerine").one())
component_build = db_session.query(
module_build_service.models.ComponentBuild
).filter_by(package="tangerine").one()
assert component_build.state_reason == "Failed to submit artifact tangerine to Koji"
@mock.patch("module_build_service.scheduler.handlers.repos.log.info")
def test_erroneous_regen_repo_received(self, mock_log_info):
def test_erroneous_regen_repo_received(self, mock_log_info, db_session):
""" Test that when an unexpected KojiRepoRegen message is received, the module doesn't
complete or go to the next build batch.
"""
scheduler_init_data(1)
scheduler_init_data(db_session, 1)
msg = module_build_service.messaging.KojiRepoChange(
"some_msg_id", "module-testmodule-master-20170109091357-7c29193d-build")
component_build = (
@@ -200,7 +203,7 @@ class TestRepoDone:
component_build.tagged = False
db.session.add(component_build)
db.session.commit()
module_build_service.scheduler.handlers.repos.done(config=conf, session=db.session, msg=msg)
module_build_service.scheduler.handlers.repos.done(config=conf, session=db_session, msg=msg)
mock_log_info.assert_called_with(
"Ignoring repo regen, because not all components are tagged."
)
@@ -226,19 +229,19 @@ class TestRepoDone:
"module_build_service.builder.GenericBuilder.default_buildroot_groups",
return_value={"build": [], "srpm-build": []},
)
def test_failed_component_build(self, dbg, connect, build_fn, config, ready, list_tasks_fn):
def test_failed_component_build(
self, dbg, connect, build_fn, config, ready, list_tasks_fn, db_session
):
""" Test that when a KojiModuleBuilder.build fails, the build is
marked as failed with proper state_reason.
"""
with app.app_context():
scheduler_init_data(3)
config.return_value = mock.Mock(), "development"
build_fn.return_value = None, 4, "Failed to submit artifact x to Koji", None
scheduler_init_data(db_session, 3)
config.return_value = mock.Mock(), "development"
build_fn.return_value = None, 4, "Failed to submit artifact x to Koji", None
msg = module_build_service.messaging.KojiRepoChange(
"some_msg_id", "module-testmodule-master-20170109091357-7c29193d-build")
module_build_service.scheduler.handlers.repos.done(
config=conf, session=db.session, msg=msg)
module_build = module_build_service.models.ModuleBuild.query.get(2)
msg = module_build_service.messaging.KojiRepoChange(
"some_msg_id", "module-testmodule-master-20170109091357-7c29193d-build")
module_build_service.scheduler.handlers.repos.done(config=conf, session=db_session, msg=msg)
module_build = module_build_service.models.ModuleBuild.query.get(2)
assert module_build.state == module_build_service.models.BUILD_STATES["failed"]
assert module_build.state == module_build_service.models.BUILD_STATES["failed"]