Add some unit tests for Copr

This commit is contained in:
Jakub Kadlcik
2017-08-27 18:47:05 +02:00
parent 6cb836c862
commit 376ca596c5

View File

@@ -21,9 +21,15 @@
# Written by Jakub Kadlcik <jkadlcik@redhat.com>
import os
import unittest
import mock
import module_build_service.models
import module_build_service.builder
from munch import Munch
from tests import conf, init_data
from module_build_service.builder.CoprModuleBuilder import CoprModuleBuilder
from copr.exceptions import CoprRequestException
@unittest.skip("We need not yet released version of python-copr. Let's skip this for some time")
@@ -63,3 +69,216 @@ class ResponseMock(object):
@property
def data(self):
return self._data
class FakeCoprAPI(object):
@staticmethod
def get_project_details():
return ResponseMock({
"output": "ok",
"name": "someproject",
# ...
})
@staticmethod
def get_chroot():
return ResponseMock({
"output": "ok",
"chroot": {
"repos": "http://repo1.ex/ http://repo2.ex/",
"buildroot_pkgs": "pkg1 pkg2 pkg3"
}
})
class TestCoprModuleBuilder(unittest.TestCase):
def setUp(self):
init_data()
self.config = mock.Mock()
self.config.koji_profile = conf.koji_profile
self.config.koji_repository_url = conf.koji_repository_url
self.module = module_build_service.models.ModuleBuild.query.filter_by(id=1).one()
def create_builder(self):
conf.copr_config = "/tmp/module_build_service/conf/copr.conf"
builder = CoprModuleBuilder(owner=self.module.owner,
module=self.module,
config=conf,
tag_name='module-nginx-1.2',
components=[])
builder.copr = Munch(projectname="someproject", username="myself")
return builder
####################################################################################################################
# #
# ModuleBuilder common operations #
# e.g. finalizing the module build process #
# #
####################################################################################################################
@mock.patch("copr.client.CoprClient.make_module")
def test_finalize(self, make_module):
builder = self.create_builder()
builder.finalize()
args, kwargs = make_module.call_args
make_module.assert_called_with(username="myself", projectname="someproject",
modulemd=mock.ANY, create=False, build=True)
self.assertIsInstance(kwargs["modulemd"], str)
self.assertTrue(os.path.isabs(kwargs["modulemd"]))
####################################################################################################################
# #
# ModuleBuilder operations for connecting to the buildroot #
# e.g. creating copr projects and modules in it #
# #
####################################################################################################################
@mock.patch("module_build_service.builder.CoprModuleBuilder._update_chroot")
@mock.patch("module_build_service.builder.CoprModuleBuilder._get_copr_safe")
@mock.patch("module_build_service.builder.CoprModuleBuilder._create_module_safe")
def test_buildroot_connect(self, create_module_safe, get_copr_safe, update_chroot):
builder = self.create_builder()
groups = {"build": {"pkgname1", "pkgname2", "pkgname3"}}
builder.buildroot_connect(groups)
update_chroot.assert_called_with(packages=["pkgname1", "pkgname3", "pkgname2"])
self.assertEqual(builder._CoprModuleBuilder__prep, True)
@mock.patch("module_build_service.builder.CoprModuleBuilder._get_copr")
@mock.patch("module_build_service.builder.CoprModuleBuilder._create_copr")
def test_get_copr_safe(self, create_copr, get_copr):
builder = self.create_builder()
builder._get_copr_safe()
get_copr.assert_called_with(ownername=self.module.owner, projectname="module-nginx-1.2")
create_copr.assert_not_called()
get_copr.reset_mock()
create_copr.reset_mock()
get_copr.side_effect = [CoprRequestException(), mock.DEFAULT]
builder._get_copr_safe()
get_copr.assert_called_with(ownername=self.module.owner, projectname="module-nginx-1.2")
create_copr.assert_called_with(ownername=self.module.owner, projectname="module-nginx-1.2")
self.assertEqual(get_copr.call_count, 2)
@mock.patch("copr.client.CoprClient._fetch", return_value=FakeCoprAPI.get_project_details())
def test_get_copr(self, get_project_details):
builder = self.create_builder()
copr = builder._get_copr("myself", "someproject")
self.assertEqual(copr.username, "myself")
self.assertEqual(copr.projectname , "someproject")
@mock.patch("copr.client.CoprClient.create_project")
def test_create_copr(self, create_project):
builder = self.create_builder()
builder._create_copr("myself", "someproject")
create_project.called_with("myself", "someproject", ["custom-1-x86_64"])
@mock.patch("copr.client.CoprClient.make_module")
def test_create_module_safe(self, make_module):
builder = self.create_builder()
builder._create_module_safe()
make_module.assert_called_with(username=self.module.owner, projectname="module-nginx-1.2",
modulemd=mock.ANY, create=True, build=False)
args, kwargs = make_module.call_args
self.assertIsInstance(kwargs["modulemd"], str)
self.assertTrue(os.path.isabs(kwargs["modulemd"]))
def test_buildroot_ready(self):
builder = self.create_builder()
self.assertTrue(builder.buildroot_ready(artifacts=["a1", "a2", "a3"]))
####################################################################################################################
# #
# ModuleBuilder operations with buildroot #
# e.g. adding repositories and packages into the buildroot #
# #
####################################################################################################################
@mock.patch("copr.client.CoprClient.get_chroot", return_value=FakeCoprAPI.get_chroot())
@mock.patch("copr.client.CoprClient.edit_chroot")
def test_buildroot_update_chroot(self, edit_chroot, get_chroot):
builder = self.create_builder()
# @TODO Have deterministic and reasonable order of values
# Update buildroot packages
builder._update_chroot(packages=["pkg4", "pkg5"])
edit_chroot.assert_called_with("someproject", "custom-1-x86_64", ownername="myself",
repos="http://repo2.ex/ http://repo1.ex/",
packages="pkg4 pkg5 pkg2 pkg3 pkg1")
# Update buildroot repos
builder._update_chroot(repos=["http://repo3.ex/"])
edit_chroot.assert_called_with("someproject", "custom-1-x86_64", ownername="myself",
repos="http://repo2.ex/ http://repo1.ex/ http://repo3.ex/",
packages="pkg2 pkg3 pkg1")
# Update multiple buildroot options at the same time
builder._update_chroot(packages=["pkg4", "pkg5"], repos=["http://repo3.ex/"])
edit_chroot.assert_called_with("someproject", "custom-1-x86_64", ownername="myself",
repos="http://repo2.ex/ http://repo1.ex/ http://repo3.ex/",
packages="pkg4 pkg5 pkg2 pkg3 pkg1")
def test_buildroot_add_artifacts(self):
pass
@mock.patch("module_build_service.builder.CoprModuleBuilder._update_chroot")
def test_buildroot_add_repos(self, update_chroot):
builder = self.create_builder()
builder.buildroot_add_repos(["foo", "bar", "baz"])
update_chroot.assert_called_with(repos=[
conf.koji_repository_url + "/foo/latest/x86_64",
conf.koji_repository_url + "/bar/latest/x86_64",
conf.koji_repository_url + "/baz/latest/x86_64",
# We always add this repo as a workaround, see the code for details
"https://kojipkgs.fedoraproject.org/compose/latest-Fedora-Modular-Rawhide/compose/Server/x86_64/os/",
])
####################################################################################################################
# #
# ModuleBuilder package build operations #
# e.g. building a package from SCM or SRPM #
# #
####################################################################################################################
@mock.patch("module_build_service.builder.CoprModuleBuilder.build_srpm")
@mock.patch("module_build_service.builder.CoprModuleBuilder.build_scm")
def test_build(self, build_scm, build_srpm):
builder = self.create_builder()
builder._CoprModuleBuilder__prep = True
def reset_mock():
build_scm.reset_mock()
build_srpm.reset_mock()
builder.build("pkgname", "git://repo.ex/pkgname.git")
build_scm.assert_called_with("git://repo.ex/pkgname.git")
build_srpm.assert_not_called()
reset_mock()
builder.build("pkgname", "http://repo.ex/pkgname.git")
build_scm.assert_called_with("http://repo.ex/pkgname.git")
build_srpm.assert_not_called()
reset_mock()
builder.build("pkgname", "https://repo.ex/pkgname.git")
build_scm.assert_called_with("https://repo.ex/pkgname.git")
build_srpm.assert_not_called()
reset_mock()
builder.build("pkgname", "/path/to/pkgname.src.rpm")
build_scm.assert_not_called()
build_srpm.assert_called_with("pkgname", "/path/to/pkgname.src.rpm")
reset_mock()
@mock.patch("copr.client.CoprClient.create_new_build")
def test_build_srpm(self, create_new_build):
builder = self.create_builder()
builder.build_srpm("pkgname", "git://repo.ex/pkgname.git")
create_new_build.assert_called_with("someproject", ["git://repo.ex/pkgname.git"],
chroots=["custom-1-x86_64"], username="myself")
def test_build_scm(self):
pass