summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/__init__.py4
-rw-r--r--test/project_config.txt17
-rw-r--r--test/spec_file_1.spec56
-rw-r--r--test/spec_file_2.spec56
-rw-r--r--test/spec_file_3.spec56
-rw-r--r--test/test_api.py573
-rw-r--r--test/test_obs_build_api.py3
-rw-r--r--test/test_obs_source_api.py3
8 files changed, 657 insertions, 111 deletions
diff --git a/test/__init__.py b/test/__init__.py
new file mode 100644
index 0000000..d974eae
--- /dev/null
+++ b/test/__init__.py
@@ -0,0 +1,4 @@
+import os
+import pytest
+
+test_dir = os.path.split(os.path.abspath(__file__))[0]
diff --git a/test/project_config.txt b/test/project_config.txt
new file mode 100644
index 0000000..239141b
--- /dev/null
+++ b/test/project_config.txt
@@ -0,0 +1,17 @@
+%define _project this:is:a:test:project
+
+Macros:
+%vendor obs://build.opensuse.org/home:sbahling:obsapi:test
+%_download_url http://download.opensuse.org/repositories
+%_project home:sbahling:obsapi:test
+%_repository SLED
+:Macros
+
+Macros:
+
+%distribution home:sbahling:obsapi:test / SLE_12_SP3
+%_project home:sbahling:obsapi:test
+
+### from home:sbahling:obsapi:test
+%_repository SLE_12_SP3
+%vendor Test:obsapi
diff --git a/test/spec_file_1.spec b/test/spec_file_1.spec
new file mode 100644
index 0000000..b15159e
--- /dev/null
+++ b/test/spec_file_1.spec
@@ -0,0 +1,56 @@
+#
+# spec file for package
+#
+# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
+#
+# All modifications and additions to the file contributed by third parties
+# remain the property of their copyright owners, unless otherwise agreed
+# upon. The license for this file, and modifications and additions to the
+# file, is the same license as for the pristine package itself (unless the
+# license for the pristine package is not an Open Source License, in which
+# case the license is the MIT License). An "Open Source License" is a
+# license that conforms to the Open Source Definition (Version 1.9)
+# published by the Open Source Initiative.
+
+# Please submit bugfixes or comments via http://bugzilla.novell.com/
+#
+
+Name: package-1
+BuildRequires: %kernel_module_package_buildreqs
+License: GPL-2.0
+Group: System/Kernel
+Summary: Sample Kernel Module Package
+Version: 1.0
+Release: 0
+Source0: %name-%version.tar.bz2
+BuildRoot: %{_tmppath}/%{name}-%{version}-build
+
+%kernel_module_package -x debug -x trace -x xen
+
+%description
+This package contains the hello.ko module.
+
+%prep
+%setup
+
+set -- *
+mkdir source
+mv "$@" source/
+mkdir obj
+
+%build
+for flavor in %flavors_to_build; do
+ rm -rf obj/$flavor
+ cp -r source obj/$flavor
+ make -C %{kernel_source $flavor} modules M=$PWD/obj/$flavor
+done
+
+%install
+export INSTALL_MOD_PATH=$RPM_BUILD_ROOT
+export INSTALL_MOD_DIR=updates
+for flavor in %flavors_to_build; do
+ make -C %{kernel_source $flavor} modules_install M=$PWD/obj/$flavor
+done
+
+%changelog
+
diff --git a/test/spec_file_2.spec b/test/spec_file_2.spec
new file mode 100644
index 0000000..f627dcd
--- /dev/null
+++ b/test/spec_file_2.spec
@@ -0,0 +1,56 @@
+#
+# spec file for package
+#
+# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
+#
+# All modifications and additions to the file contributed by third parties
+# remain the property of their copyright owners, unless otherwise agreed
+# upon. The license for this file, and modifications and additions to the
+# file, is the same license as for the pristine package itself (unless the
+# license for the pristine package is not an Open Source License, in which
+# case the license is the MIT License). An "Open Source License" is a
+# license that conforms to the Open Source Definition (Version 1.9)
+# published by the Open Source Initiative.
+
+# Please submit bugfixes or comments via http://bugzilla.novell.com/
+#
+
+Name: package-2
+BuildRequires: %kernel_module_package_buildreqs
+License: GPL-2.0
+Group: System/Kernel
+Summary: Sample Kernel Module Package
+Version: 1.0
+Release: 0
+Source0: %name-%version.tar.bz2
+BuildRoot: %{_tmppath}/%{name}-%{version}-build
+
+%kernel_module_package -x debug -x trace -x xen
+
+%description
+This package contains the hello.ko module.
+
+%prep
+%setup
+
+set -- *
+mkdir source
+mv "$@" source/
+mkdir obj
+
+%build
+for flavor in %flavors_to_build; do
+ rm -rf obj/$flavor
+ cp -r source obj/$flavor
+ make -C %{kernel_source $flavor} modules M=$PWD/obj/$flavor
+done
+
+%install
+export INSTALL_MOD_PATH=$RPM_BUILD_ROOT
+export INSTALL_MOD_DIR=updates
+for flavor in %flavors_to_build; do
+ make -C %{kernel_source $flavor} modules_install M=$PWD/obj/$flavor
+done
+
+%changelog
+
diff --git a/test/spec_file_3.spec b/test/spec_file_3.spec
new file mode 100644
index 0000000..0bf767a
--- /dev/null
+++ b/test/spec_file_3.spec
@@ -0,0 +1,56 @@
+#
+# spec file for package
+#
+# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
+#
+# All modifications and additions to the file contributed by third parties
+# remain the property of their copyright owners, unless otherwise agreed
+# upon. The license for this file, and modifications and additions to the
+# file, is the same license as for the pristine package itself (unless the
+# license for the pristine package is not an Open Source License, in which
+# case the license is the MIT License). An "Open Source License" is a
+# license that conforms to the Open Source Definition (Version 1.9)
+# published by the Open Source Initiative.
+
+# Please submit bugfixes or comments via http://bugzilla.novell.com/
+#
+
+Name: package-3
+BuildRequires: %kernel_module_package_buildreqs
+License: GPL-2.0
+Group: System/Kernel
+Summary: Sample Kernel Module Package
+Version: 1.0
+Release: 0
+Source0: %name-%version.tar.bz2
+BuildRoot: %{_tmppath}/%{name}-%{version}-build
+
+%kernel_module_package -x debug -x trace -x xen
+
+%description
+This package contains the hello.ko module.
+
+%prep
+%setup
+
+set -- *
+mkdir source
+mv "$@" source/
+mkdir obj
+
+%build
+for flavor in %flavors_to_build; do
+ rm -rf obj/$flavor
+ cp -r source obj/$flavor
+ make -C %{kernel_source $flavor} modules M=$PWD/obj/$flavor
+done
+
+%install
+export INSTALL_MOD_PATH=$RPM_BUILD_ROOT
+export INSTALL_MOD_DIR=updates
+for flavor in %flavors_to_build; do
+ make -C %{kernel_source $flavor} modules_install M=$PWD/obj/$flavor
+done
+
+%changelog
+
diff --git a/test/test_api.py b/test/test_api.py
index 9f57364..5a46fb9 100644
--- a/test/test_api.py
+++ b/test/test_api.py
@@ -1,104 +1,354 @@
+import re
+import pytest
+import os
+from . import test_dir
from obsapi import ObsApi
from lxml import etree
-api = ObsApi(apiurl='https://api.opensuse.org')
+apiurl = 'https://api.opensuse.org'
+api = ObsApi(apiurl=apiurl)
prj = 'home:sbahling:obsapi:test'
pkg = 'suse-hello-1.0'
repo = 'SLE_12_SP3'
arch = 'x86_64'
+prj_meta_re = re.compile(r'/source/.*/_meta')
+pkg_meta_re = re.compile(r'/source/.*/.*/_meta')
+
+
+@pytest.fixture
+def spec_file_1():
+ with open(os.path.join(test_dir, 'spec_file_1.spec'), 'rb') as f:
+ return f.read()
+
+
+@pytest.fixture
+def spec_file_2():
+ with open(os.path.join(test_dir, 'spec_file_2.spec'), 'rb') as f:
+ return f.read()
+
+
+@pytest.fixture
+def spec_file_3():
+ with open(os.path.join(test_dir, 'spec_file_3.spec'), 'rb') as f:
+ return f.read()
+
+
+@pytest.fixture
+def project_config():
+ with open(os.path.join(test_dir, 'project_config.txt')) as f:
+ return f.read()
+
+
+@pytest.fixture
+def source_info():
+ return """<sourceinfo package="suse-hello-1.0" rev="1" vrev="1" srcmd5="7054c47fb2ebde13fc62ee64d0a3b1bc" verifymd5="7054c47fb2ebde13fc62ee64d0a3b1bc">
+<filename>suse-hello.spec</filename>
+</sourceinfo>"""
+
+
+@pytest.fixture
+def repo_directory():
+ return """<directory>
+<entry name="SLE_15_SP1"/>
+<entry name="SLE_12_SP3"/>
+</directory>"""
+
+
+@pytest.fixture
+def project_directory():
+ return """<directory count="3">
+<entry name="package-1"/>
+<entry name="package-2"/>
+<entry name="package-3"/>
+</directory>"""
+
+
+@pytest.fixture
+def package_directory():
+ return """<directory name="package" rev="1" vrev="1" srcmd5="7054c47fb2ebde13fc62ee64d0a3b1bc">
+<entry name="COPYING" md5="eb723b61539feef013de476e68b5c50a" size="18011" mtime="1507136875"/>
+<entry name="package-1.0.tar.bz2" md5="8ca39475435391e6d5d1ba21110decdd" size="990" mtime="1507136875"/>
+<entry name="pacakge.changes" md5="a422a3b7db9410e583dcfe49e1808f92" size="1151" mtime="1507136876"/>
+<entry name="package.spec" md5="813404b52a96d3a4acae391205b59ea1" size="1569" mtime="1507136876"/>
+</directory>"""
+
+
+@pytest.fixture
+def binarylist():
+ return """<binarylist>
+<binary filename="_buildenv" size="15742" mtime="1507137122"/>
+<binary filename="_statistics" size="703" mtime="1507137122"/>
+<binary filename="rpmlint.log" size="1093" mtime="1507137122"/>
+<binary filename="suse-hello-1.0-1.1.src.rpm" size="5181" mtime="1507137122"/>
+<binary filename="suse-hello-debugsource-1.0-1.1.x86_64.rpm" size="5217" mtime="1507137122"/>
+<binary filename="suse-hello-kmp-default-1.0_k4.4.73_5-1.1.x86_64.rpm" size="6709" mtime="1507137122"/>
+<binary filename="suse-hello-kmp-default-debuginfo-1.0_k4.4.73_5-1.1.x86_64.rpm" size="31004" mtime="1507137122"/>
+</binarylist>"""
+
+
+@pytest.fixture
+def binary_fileinfo():
+ return """<fileinfo filename="suse-hello-1.0-1.1.src.rpm">
+<name>suse-hello</name>i
+<version>1.0</version>
+<release>1.1</release>
+<arch>src</arch>
+<summary>Sample Kernel Module Package</summary>
+<description>This package contains the hello.ko module.</description>
+<size>5181</size><mtime>1507137122</mtime>
+<requires>kmod-compat</requires>
+<requires>kernel-syms</requires>
+</fileinfo>"""
+
+
+@pytest.fixture
+def project_meta():
+ return """<project name="home:sbahling:obsapi:test">
+<title>Test project for obsapi unit tests</title>
+<description />
+<person userid="user1" role="bugowner" />
+<person userid="user2" role="downloader" />
+<person userid="user1" role="maintainer" />
+<person userid="user2" role="reader" />
+<person userid="user2" role="reviewer" />
+<group groupid="group1" role="reviewer" />
+<group groupid="group2" role="maintainer" />
+<repository name="SLE_15_SP1">
+ <path project="SUSE:SLE-15-SP1:GA" repository="standard" />
+ <arch>x86_64</arch>
+</repository>
+<repository name="SLE_12_SP3">
+ <path project="SUSE:SLE-12-SP3:GA" repository="standard" />
+ <arch>x86_64</arch>
+</repository>
+</project>"""
+
+
+@pytest.fixture
+def locked_project_meta():
+ return """<project name="home:sbahling:obsapi:test">
+<title>Test project for obsapi unit tests</title>
+<description />
+<person userid="user1" role="bugowner" />
+<person userid="user2" role="downloader" />
+<person userid="user1" role="maintainer" />
+<person userid="user2" role="reader" />
+<person userid="user2" role="reviewer" />
+<group groupid="group1" role="reviewer" />
+<group groupid="group2" role="maintainer" />
+<repository name="SLE_15_SP1">
+ <path project="SUSE:SLE-15-SP1:GA" repository="standard" />
+ <arch>x86_64</arch>
+</repository>
+<repository name="SLE_12_SP3">
+ <path project="SUSE:SLE-12-SP3:GA" repository="standard" />
+ <arch>x86_64</arch>
+</repository>
+<lock>
+ <enable/>
+</lock>
+</project>"""
+
+
+@pytest.fixture
+def package_meta():
+ return """<package name="suse-hello-1.0" project="home:sbahling:obsapi:test">
+ <title>Example from Kernel Module Packages Manual</title>
+ <description/>
+<person userid="user1" role="bugowner" />
+<person userid="user2" role="downloader" />
+<person userid="user1" role="maintainer" />
+<person userid="user2" role="reader" />
+<person userid="user2" role="reviewer" />
+<group groupid="group1" role="reviewer" />
+<group groupid="group2" role="maintainer" />
+ <build>
+ <enable arch="x86_64" repository="SLE_12_SP3"/>
+ <disable/>
+ </build>
+ <debuginfo>
+ <enable/>
+ </debuginfo>
+ <useforbuild>
+ <disable arch="x86_64" repository="SLE_15_SP1"/>
+ </useforbuild>
+</package>"""
+
+
+@pytest.fixture
+def locked_package_meta():
+ return """<package name="suse-hello-1.0" project="home:sbahling:obsapi:test">
+ <title>Example from Kernel Module Packages Manual</title>
+ <description/>
+<person userid="user1" role="bugowner" />
+<person userid="user2" role="downloader" />
+<person userid="user1" role="maintainer" />
+<person userid="user2" role="reader" />
+<person userid="user2" role="reviewer" />
+<group groupid="group1" role="reviewer" />
+<group groupid="group2" role="maintainer" />
+ <build>
+ <enable arch="x86_64" repository="SLE_12_SP3"/>
+ <disable/>
+ </build>
+ <debuginfo>
+ <enable/>
+ </debuginfo>
+ <useforbuild>
+ <disable arch="x86_64" repository="SLE_15_SP1"/>
+ </useforbuild>
+ <lock>
+ <enable/>
+ </lock>
+</package>"""
+
+
+def test_get_project_meta(requests_mock):
+ matcher = prj_meta_re
+ text = '<project/>'
+ requests_mock.get(matcher, text=text)
+ response = api.get_meta(prj=prj)
+ assert response == text
+
+
+def test_get_package_meta(requests_mock):
+ matcher = prj_meta_re
+ text = '<package/>'
+ requests_mock.get(matcher, text=text)
+ response = api.get_meta(prj=prj, pkg=pkg).strip()
+ assert response == text
-def test_get_project_meta():
- response = api.get_meta(prj=prj).strip()
- assert response[:9] == '<project '
- assert response[-10:] == '</project>'
+def test_ls_prj(requests_mock):
+ matcher = re.compile('/source/.*')
+ text = '<directory><entry name="package"/></directory>'
+ requests_mock.get(matcher, text=text)
+ assert api.ls(prj=prj) == ['package']
-def test_get_package_meta():
- response = api.get_meta(prj=prj, pkg=pkg).strip()
- assert response[:9] == '<package '
- assert response[-10:] == '</package>'
+def test_ls_pkg(requests_mock, package_directory):
+ matcher = re.compile('/source/.*/.*')
+ requests_mock.get(matcher, text=package_directory)
+ directory, listing = api.ls(prj=prj, pkg=pkg)
-def test_ls_prj():
- assert api.ls(prj=prj) == ['suse-hello-1.0']
+ dir_re = re.compile('(name=".+?").*(rev=".+?").*(vrev=".+?").*(srcmd5=".+?")')
+ expected_directory = ' '.join(dir_re.findall(package_directory)[0])
+ directory = 'name="{0.name}" rev="{0.rev}" vrev="{0.vrev}" srcmd5="{0.srcmd5}"'.format(directory)
+ assert directory == expected_directory
+ entry_re = re.compile('(name=".+?").*(md5=".+?").*(size=".+?").*(mtime=".+?")')
+ expected_entries = [' '.join(entry) for entry in entry_re.findall(package_directory)]
+ entries = ['name="{0.name}" md5="{0.md5}" size="{0.size}" mtime="{0.mtime}"'.format(entry) for entry in listing]
+ for item in expected_entries:
+ assert item in entries
+ entries.remove(item)
-def test_ls_pkg():
- files = ['COPYING', 'suse-hello-1.0.tar.bz2',
- 'suse-hello.changes', 'suse-hello.spec',
- ]
- directory, listing = api.ls(prj=prj, pkg=pkg)
- assert directory.name == 'suse-hello-1.0'
- items = [i.name for i in listing]
- for f in files:
- assert f in items
+ assert entries == []
-def test_ls_binaries():
- files = ['_statistics', 'rpmlint.log', 'suse-hello-1.0-1.1.src.rpm',
- 'suse-hello-kmp-default-1.0_k4.4.73_5-1.1.x86_64.rpm',
- ]
- listing = api.ls(prj=prj, pkg=pkg, repo=repo, arch=arch)
- items = [i.filename for i in listing]
- for f in files:
- assert f in items
+def binarylist_test(xml, listing):
+ entry_re = re.compile('(filename=".+?").*(size=".+?").*(mtime=".+?")')
+ expected_entries = [' '.join(entry) for entry in entry_re.findall(xml)]
+ entries = ['filename="{0.filename}" size="{0.size}" mtime="{0.mtime}"'.format(entry) for entry in listing]
+ for item in expected_entries:
+ assert item in entries
+ entries.remove(item)
+ assert entries == []
-def test_binaries_ls():
- files = ['_statistics', 'rpmlint.log', 'suse-hello-1.0-1.1.src.rpm',
- 'suse-hello-kmp-default-1.0_k4.4.73_5-1.1.x86_64.rpm',
- ]
- listing = api.binaries_ls(prj=prj, pkg=pkg, repo=repo, arch=arch)
- items = [i.filename for i in listing]
- for f in files:
- assert f in items
+def test_ls_binaries(requests_mock, binarylist):
+ matcher = re.compile('/build/.*/.*/.*/.*')
+ requests_mock.get(matcher, text=binarylist)
+ listing = api.ls(prj=prj, pkg=pkg, repo=repo, arch=arch)
-def test_binaries_ls_project():
- files = ['suse-hello-debugsource.rpm',
- 'suse-hello-kmp-default.rpm',
- 'suse-hello-kmp-default-debuginfo.rpm',
- ]
- listing = api.binaries_ls(prj=prj, pkg=None, repo=repo, arch=arch)
- items = [i.filename for i in listing]
- for f in files:
- assert f in items
+ binarylist_test(binarylist, listing)
-def test_get_project_repos():
- repos = api.get_project_repos(prj)
- assert 'SLE_12_SP3' in repos
+def test_binaries_ls(requests_mock, binarylist):
+ matcher = re.compile('/build/.*/.*/.*/.*')
+ requests_mock.get(matcher, text=binarylist)
+ listing = api.binaries_ls(prj=prj, pkg=pkg, repo=repo, arch=arch)
+ binarylist_test(binarylist, listing)
-def test_get_vendor():
- assert api.get_vendor(prj=prj) == u'Test:obsapi'
+def test_binaries_ls_project(requests_mock, binarylist):
+ matcher = re.compile('/build/.*/.*/.*/_repository')
+ requests_mock.get(matcher, text=binarylist)
+ listing = api.binaries_ls(prj=prj, pkg=None, repo=repo, arch=arch)
-def test_source_info():
- sinfo = api.get_source_info(prj, pkg)
- assert sinfo.package == 'suse-hello-1.0'
- assert sinfo.rev == '1'
- assert sinfo.vrev == '1'
- assert sinfo.srcmd5 == '7054c47fb2ebde13fc62ee64d0a3b1bc'
- assert sinfo.verifymd5 == '7054c47fb2ebde13fc62ee64d0a3b1bc'
+ binarylist_test(binarylist, listing)
-def test_get_binary_fileinfo():
- binary = 'suse-hello-kmp-default-1.0_k4.4.73_5-1.1.x86_64.rpm'
- bfinfo = api.get_binary_fileinfo(prj, pkg, repo, arch, binary)
- assert bfinfo.filename == binary
- assert bfinfo.size == '6709'
- assert bfinfo.mtime == '1507137122'
- assert bfinfo.arch == 'x86_64'
- assert bfinfo.version == '1.0_k4.4.73_5'
- assert bfinfo.release == '1.1'
- assert bfinfo.summary == 'Sample Kernel Module Package'
- assert bfinfo.description == 'This package contains the hello.ko module.'
- assert bfinfo.source == 'suse-hello'
- binary = '_statistics'
+def test_get_project_repos(requests_mock, repo_directory):
+ matcher = re.compile('/build/.*')
+ requests_mock.get(matcher, text=repo_directory)
+ repos = api.get_project_repos(prj)
+
+ entry_re = re.compile('name="(.+?)"')
+ expected_entries = [entry for entry in entry_re.findall(repo_directory)]
+ for entry in expected_entries:
+ assert entry in repos
+ repos.remove(entry)
+
+ assert repos == []
+
+
+@pytest.mark.parametrize('repository', (None, 'SLE_12_SP3'))
+def test_get_vendor(requests_mock, repo_directory, project_config, repository):
+ matcher = re.compile('/build/.*')
+ requests_mock.get(matcher, text=repo_directory)
+ matcher = re.compile('/build/.*/.*/_buildconfig')
+ requests_mock.get(matcher, text=project_config)
+
+ vendor_re = re.compile(r'.*%vendor (.+?)\n')
+ expected_vendor = vendor_re.findall(project_config)[-1]
+ if repository is None:
+ vendor = api.get_vendor(prj=prj)
+ else:
+ vendor = api.get_vendor(prj=prj, repo=repository)
+ assert vendor == expected_vendor
+
+
+@pytest.mark.parametrize('rev', (None, '1'))
+def test_source_info(requests_mock, source_info, rev):
+ if rev is None:
+ matcher = re.compile('/source/.*/.*?view=info')
+ requests_mock.get(matcher, text=source_info)
+ sinfo = api.get_source_info(prj, pkg)
+ else:
+ matcher = re.compile('/source/.*/.*?(&?view=info|&?rev=1){2}')
+ requests_mock.get(matcher, text=source_info)
+ sinfo = api.get_source_info(prj, pkg, rev)
+
+ expected_sinfo = etree.fromstring(source_info)
+ assert sinfo.package == expected_sinfo.get('package', None)
+ assert sinfo.rev == expected_sinfo.get('rev', None)
+ assert sinfo.vrev == expected_sinfo.get('vrev', None)
+ assert sinfo.srcmd5 == expected_sinfo.get('srcmd5', None)
+ assert sinfo.verifymd5 == expected_sinfo.get('verifymd5', None)
+
+
+def test_get_binary_fileinfo(requests_mock, binary_fileinfo):
+ matcher = re.compile('/build/.*/.*/.*/.*/.*?view=fileinfo')
+ requests_mock.get(matcher, text=binary_fileinfo)
+ binary = 'suse-hello-1.0-1.1.src.rpm'
+
+ expected_bfinfo = etree.fromstring(binary_fileinfo)
bfinfo = api.get_binary_fileinfo(prj, pkg, repo, arch, binary)
+ assert bfinfo.name == expected_bfinfo.find('name').text
+ assert bfinfo.size == expected_bfinfo.find('size').text
+ assert bfinfo.mtime == expected_bfinfo.find('mtime').text
+ assert bfinfo.arch == expected_bfinfo.find('arch').text
+ assert bfinfo.version == expected_bfinfo.find('version').text
+ assert bfinfo.release == expected_bfinfo.find('release').text
+ assert bfinfo.summary == expected_bfinfo.find('summary').text
+ assert bfinfo.description == expected_bfinfo.find('description').text
+ assert bfinfo.provides == [p.text for p in expected_bfinfo.findall('provides')]
+ assert bfinfo.requires == [p.text for p in expected_bfinfo.findall('requires')]
def check_get_repo_flags(flag_type, prj, pkg, expected):
@@ -107,51 +357,160 @@ def check_get_repo_flags(flag_type, prj, pkg, expected):
assert len(list(repo_flags.flags)) == expected
-def test_get_repo_build_flags():
- xml = api.get_meta(prj)
+def test_get_project_repo_build_flags(requests_mock, project_meta):
+ matcher = prj_meta_re
+ requests_mock.get(matcher, text=project_meta)
check_get_repo_flags('build', prj, None, 0)
- xml = api.get_meta(prj, pkg)
- meta = etree.fromstring(xml)
- build = meta.find('build')
- check_get_repo_flags('build', prj, pkg, len(build))
-
-def test_lock_project():
- api.lock(prj)
- xml = api.get_meta(prj)
- meta = etree.fromstring(xml)
- lock = meta.find('lock')
- assert lock is not None
- assert lock.find('enable') is not None
-
-def test_unlock_project():
- api.unlock(prj)
- meta = etree.fromstring(api.get_meta(prj))
- lock = meta.find('lock')
- assert lock is None
-
-
-def test_project_locked():
- api.lock(prj)
+def test_get_package_repo_build_flags(requests_mock, package_meta):
+ matcher = pkg_meta_re
+ requests_mock.get(matcher, text=package_meta)
+ meta = etree.fromstring(package_meta)
+ expected_repoflags = meta.find('build')
+ check_get_repo_flags('build', prj, pkg, len(expected_repoflags))
+
+
+@pytest.mark.parametrize('target', ('project', 'package'))
+@pytest.mark.parametrize('comment', (None, 'Comment'))
+def test_lock(requests_mock, target, comment):
+ if comment is None:
+ message = 'Lock'
+ else:
+ message = comment
+
+ if target == 'project':
+ matcher = re.compile(r'/source/.*?(&?cmd=lock|&?comment=%s){2}' % message.replace(' ', '\\+'))
+ else:
+ matcher = re.compile(r'/source/.*/.*?(&?cmd=lock|&?comment=%s){2}' % message.replace(' ', '\\+'))
+ requests_mock.post(matcher)
+ if comment is None:
+ if target == 'project':
+ response = api.lock(prj)
+ else:
+ response = api.lock(prj, pkg)
+ else:
+ if target == 'project':
+ response = api.lock(prj, comment=comment)
+ else:
+ response = api.lock(prj, pkg, comment=comment)
+
+ assert response.status_code == 200
+
+
+@pytest.mark.parametrize('target', ('project', 'package'))
+@pytest.mark.parametrize('comment', (None, 'comment'))
+def test_unlock(requests_mock, target, comment):
+ if comment is None:
+ message = 'Unlock'
+ else:
+ message = comment
+
+ if target == 'project':
+ matcher = re.compile(r'/source/.*?(&?cmd=unlock|&?comment=%s){2}' % message.replace(' ', '\\+'))
+ else:
+ matcher = re.compile(r'/source/.*/.*?(&?cmd=unlock|&?comment=%s){2}' % message.replace(' ', '\\+'))
+ requests_mock.post(matcher)
+ if comment is None:
+ if target == 'project':
+ response = api.unlock(prj)
+ else:
+ response = api.unlock(prj, pkg)
+ else:
+ if target == 'project':
+ response = api.unlock(prj, comment=comment)
+ else:
+ response = api.unlock(prj, pkg, comment=comment)
+
+ assert response.status_code == 200
+
+
+def test_project_locked(requests_mock, project_meta, locked_project_meta):
+ matcher = prj_meta_re
+ requests_mock.get(matcher, text=locked_project_meta)
assert api.locked(prj) is True
- api.unlock(prj)
+ requests_mock.get(matcher, text=project_meta)
assert api.locked(prj) is False
-def test_get_users():
- users = api.get_users(prj)
- assert len(users) > 0
+def test_package_locked(requests_mock, package_meta, locked_package_meta):
+ matcher = re.compile(r'/source/.*/.*/_meta')
+ requests_mock.get(matcher, text=locked_package_meta)
+ assert api.locked(prj, pkg) is True
+ requests_mock.get(matcher, text=package_meta)
+ assert api.locked(prj, pkg) is False
+
+
+@pytest.mark.parametrize('target', ('project', 'package'))
+def test_get_users(requests_mock, target, project_meta, package_meta):
+ if target == 'project':
+ matcher = prj_meta_re
+ requests_mock.get(matcher, text=project_meta)
+ users = api.get_users(prj)
+ meta = etree.fromstring(project_meta)
+ else:
+ matcher = pkg_meta_re
+ requests_mock.get(matcher, text=package_meta)
+ users = api.get_users(prj, pkg)
+ meta = etree.fromstring(package_meta)
+
+ expected_users = meta.findall('person')
+
+ matches = 0
+ for expected_user in expected_users:
+ for user in users:
+ if user.userid == expected_user.get('userid') and user.role == expected_user.get('role'):
+ matches += 1
+
+ assert len(expected_users) == len(users) == matches
+
+
+@pytest.mark.parametrize('target', ('project', 'package'))
+def test_get_groups(requests_mock, target, project_meta, package_meta):
+ if target == 'project':
+ matcher = prj_meta_re
+ requests_mock.get(matcher, text=project_meta)
+ groups = api.get_groups(prj)
+ meta = etree.fromstring(project_meta)
+ else:
+ matcher = pkg_meta_re
+ requests_mock.get(matcher, text=package_meta)
+ groups = api.get_groups(prj, pkg)
+ meta = etree.fromstring(package_meta)
+
+ expected_groups = meta.findall('group')
+
+ matches = 0
+ for expected_group in expected_groups:
+ for group in groups:
+ if group.groupid == expected_group.get('groupid') and group.role == expected_group.get('role'):
+ matches += 1
+
+ assert len(expected_groups) == len(groups) == matches
+
+
+def test_get_spec_files(requests_mock, package_directory, spec_file_1):
+ matcher = re.compile('/source/.*/.*')
+ requests_mock.get(matcher, text=package_directory)
+ matcher = re.compile('/source/.*/.*/.*')
+ requests_mock.get(matcher, content=spec_file_1)
+ for specfile in api.get_spec_files(prj, pkg):
+ assert specfile == spec_file_1
-def test_get_groups():
- groups = api.get_groups(prj)
- assert groups == []
+def test_get_project_spec_files(requests_mock, project_directory, package_directory, spec_file_1, spec_file_2, spec_file_3):
+ matcher = re.compile(r'/source/.*')
+ requests_mock.get(matcher, text=project_directory)
+ matcher = re.compile(r'/source/.*/.*')
+ requests_mock.get(matcher, text=package_directory)
+ matcher = re.compile(r'/source/.*/package-1/.*.spec')
+ requests_mock.get(matcher, content=spec_file_1)
+ matcher = re.compile(r'/source/.*/package-2/.*.spec')
+ requests_mock.get(matcher, content=spec_file_2)
+ matcher = re.compile(r'/source/.*/package-3/.*.spec')
+ requests_mock.get(matcher, content=spec_file_3)
-def test_get_spec_files():
- for specfile in api.get_spec_files(prj, pkg):
- assert 'Name:' in specfile
- assert 'Summary:' in specfile
- assert '%description' in specfile
- assert '%setup' in specfile
+ expected_specfiles = [spec_file_1, spec_file_2, spec_file_3]
+ specfiles = api.get_spec_files(prj)
+ assert list(specfiles) == expected_specfiles
diff --git a/test/test_obs_build_api.py b/test/test_obs_build_api.py
index 194abf3..ff271ab 100644
--- a/test/test_obs_build_api.py
+++ b/test/test_obs_build_api.py
@@ -1,5 +1,6 @@
import os
import pytest
+from . import test_dir
from obsapi.buildapi import ObsBuildApi
prj = 'home:sbahling:obsapi:test'
@@ -9,8 +10,6 @@ arch = 'x86_64'
buildapi = ObsBuildApi(apiurl='https://api.opensuse.org')
-test_dir = os.path.split(os.path.abspath(__file__))[0]
-
# GET /build/
# Result: directory listing as xml
diff --git a/test/test_obs_source_api.py b/test/test_obs_source_api.py
index abe47e1..e947547 100644
--- a/test/test_obs_source_api.py
+++ b/test/test_obs_source_api.py
@@ -1,4 +1,5 @@
import os
+from . import test_dir
from obsapi.sourceapi import ObsSourceApi
@@ -9,8 +10,6 @@ arch = 'x86_64'
sourceapi = ObsSourceApi(apiurl='https://api.opensuse.org')
-test_dir = os.path.dirname(os.path.realpath(__file__))
-
class RequestMatcher():
def __init__(self):