mirror of
https://pagure.io/fm-orchestrator.git
synced 2026-02-06 14:53:18 +08:00
This also includes `from __future__ import absolute_import` in every file so that the imports are consistent in Python 2 and 3. The Python 2 tests fail without this.
155 lines
5.3 KiB
Python
155 lines
5.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
# SPDX-License-Identifier: MIT
|
|
from __future__ import absolute_import
|
|
|
|
import pytest
|
|
|
|
from module_build_service.common import models
|
|
from module_build_service.common.errors import UnprocessableEntity
|
|
from module_build_service.common.utils import import_mmd, load_mmd
|
|
from module_build_service.scheduler.db_session import db_session
|
|
from tests import clean_database, read_staged_data
|
|
|
|
|
|
@pytest.mark.parametrize("context", ["c1", None])
|
|
def test_import_mmd_contexts(context):
|
|
mmd = load_mmd(read_staged_data("formatted_testmodule"))
|
|
mmd.set_context(context)
|
|
|
|
xmd = mmd.get_xmd()
|
|
xmd["mbs"]["koji_tag"] = "foo"
|
|
mmd.set_xmd(xmd)
|
|
|
|
build, msgs = import_mmd(db_session, mmd)
|
|
|
|
mmd_context = build.mmd().get_context()
|
|
if context:
|
|
assert mmd_context == context
|
|
assert build.context == context
|
|
else:
|
|
assert mmd_context == models.DEFAULT_MODULE_CONTEXT
|
|
assert build.context == models.DEFAULT_MODULE_CONTEXT
|
|
|
|
|
|
def test_import_mmd_multiple_dependencies():
|
|
mmd = load_mmd(read_staged_data("formatted_testmodule"))
|
|
mmd.add_dependencies(mmd.get_dependencies()[0].copy())
|
|
|
|
expected_error = "The imported module's dependencies list should contain just one element"
|
|
with pytest.raises(UnprocessableEntity) as e:
|
|
import_mmd(db_session, mmd)
|
|
assert str(e.value) == expected_error
|
|
|
|
|
|
def test_import_mmd_no_xmd_buildrequires():
|
|
mmd = load_mmd(read_staged_data("formatted_testmodule"))
|
|
xmd = mmd.get_xmd()
|
|
del xmd["mbs"]["buildrequires"]
|
|
mmd.set_xmd(xmd)
|
|
|
|
expected_error = (
|
|
"The imported module buildrequires other modules, but the metadata in the "
|
|
'xmd["mbs"]["buildrequires"] dictionary is missing entries'
|
|
)
|
|
with pytest.raises(UnprocessableEntity) as e:
|
|
import_mmd(db_session, mmd)
|
|
assert str(e.value) == expected_error
|
|
|
|
|
|
def test_import_mmd_minimal_xmd_from_local_repository():
|
|
mmd = load_mmd(read_staged_data("formatted_testmodule"))
|
|
xmd = mmd.get_xmd()
|
|
xmd["mbs"] = {}
|
|
xmd["mbs"]["koji_tag"] = "repofile:///etc/yum.repos.d/fedora-modular.repo"
|
|
xmd["mbs"]["mse"] = True
|
|
xmd["mbs"]["commit"] = "unknown"
|
|
mmd.set_xmd(xmd)
|
|
|
|
build, msgs = import_mmd(db_session, mmd, False)
|
|
assert build.name == mmd.get_module_name()
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"stream, disttag_marking, error_msg",
|
|
(
|
|
("f28", None, None),
|
|
("f28", "fedora28", None),
|
|
("f-28", "f28", None),
|
|
("f-28", None, "The stream cannot contain a dash unless disttag_marking is set"),
|
|
("f28", "f-28", "The disttag_marking cannot contain a dash"),
|
|
("f-28", "fedora-28", "The disttag_marking cannot contain a dash"),
|
|
),
|
|
)
|
|
def test_import_mmd_base_module(stream, disttag_marking, error_msg):
|
|
clean_database(add_platform_module=False)
|
|
mmd = load_mmd(read_staged_data("platform"))
|
|
mmd = mmd.copy(mmd.get_module_name(), stream)
|
|
|
|
if disttag_marking:
|
|
xmd = mmd.get_xmd()
|
|
xmd["mbs"]["disttag_marking"] = disttag_marking
|
|
mmd.set_xmd(xmd)
|
|
|
|
if error_msg:
|
|
with pytest.raises(UnprocessableEntity, match=error_msg):
|
|
import_mmd(db_session, mmd)
|
|
else:
|
|
import_mmd(db_session, mmd)
|
|
|
|
|
|
def test_import_mmd_remove_dropped_virtual_streams():
|
|
mmd = load_mmd(read_staged_data("formatted_testmodule"))
|
|
|
|
# Add some virtual streams
|
|
xmd = mmd.get_xmd()
|
|
xmd["mbs"]["virtual_streams"] = ["f28", "f29", "f30"]
|
|
mmd.set_xmd(xmd)
|
|
|
|
# Import mmd into database to simulate the next step to reimport a module
|
|
import_mmd(db_session, mmd)
|
|
|
|
# Now, remove some virtual streams from module metadata
|
|
xmd = mmd.get_xmd()
|
|
xmd["mbs"]["virtual_streams"] = ["f28", "f29"] # Note that, f30 is removed
|
|
mmd.set_xmd(xmd)
|
|
|
|
# Test import modulemd again and the f30 should be removed from database.
|
|
module_build, _ = import_mmd(db_session, mmd)
|
|
|
|
db_session.refresh(module_build)
|
|
assert ["f28", "f29"] == sorted(item.name for item in module_build.virtual_streams)
|
|
assert 0 == db_session.query(models.VirtualStream).filter_by(name="f30").count()
|
|
|
|
|
|
def test_import_mmd_dont_remove_dropped_virtual_streams_associated_with_other_modules():
|
|
mmd = load_mmd(read_staged_data("formatted_testmodule"))
|
|
# Add some virtual streams to this module metadata
|
|
xmd = mmd.get_xmd()
|
|
xmd["mbs"]["virtual_streams"] = ["f28", "f29", "f30"]
|
|
mmd.set_xmd(xmd)
|
|
import_mmd(db_session, mmd)
|
|
|
|
# Import another module which has overlapping virtual streams
|
|
another_mmd = load_mmd(read_staged_data("formatted_testmodule-more-components"))
|
|
# Add some virtual streams to this module metadata
|
|
xmd = another_mmd.get_xmd()
|
|
xmd["mbs"]["virtual_streams"] = ["f29", "f30"]
|
|
another_mmd.set_xmd(xmd)
|
|
another_module_build, _ = import_mmd(
|
|
db_session, another_mmd)
|
|
|
|
# Now, remove f30 from mmd
|
|
xmd = mmd.get_xmd()
|
|
xmd["mbs"]["virtual_streams"] = ["f28", "f29"]
|
|
mmd.set_xmd(xmd)
|
|
|
|
# Reimport formatted_testmodule again
|
|
module_build, _ = import_mmd(db_session, mmd)
|
|
|
|
db_session.refresh(module_build)
|
|
assert ["f28", "f29"] == sorted(item.name for item in module_build.virtual_streams)
|
|
|
|
# The overlapped f30 should be still there.
|
|
db_session.refresh(another_module_build)
|
|
assert ["f29", "f30"] == sorted(item.name for item in another_module_build.virtual_streams)
|