From 67645bbd2ee5efac39f47a52ac60b049aecb09bd Mon Sep 17 00:00:00 2001 From: Scott Bahling Date: Fri, 31 Jan 2020 17:39:42 +0100 Subject: Finish updating unit tests to use requests_mock --- test/test_api.py | 573 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 466 insertions(+), 107 deletions(-) (limited to 'test/test_api.py') 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 """ +suse-hello.spec +""" + + +@pytest.fixture +def repo_directory(): + return """ + + +""" + + +@pytest.fixture +def project_directory(): + return """ + + + +""" + + +@pytest.fixture +def package_directory(): + return """ + + + + +""" + + +@pytest.fixture +def binarylist(): + return """ + + + + + + + +""" + + +@pytest.fixture +def binary_fileinfo(): + return """ +suse-helloi +1.0 +1.1 +src +Sample Kernel Module Package +This package contains the hello.ko module. +51811507137122 +kmod-compat +kernel-syms +""" + + +@pytest.fixture +def project_meta(): + return """ +Test project for obsapi unit tests + + + + + + + + + + + x86_64 + + + + x86_64 + +""" + + +@pytest.fixture +def locked_project_meta(): + return """ +Test project for obsapi unit tests + + + + + + + + + + + x86_64 + + + + x86_64 + + + + +""" + + +@pytest.fixture +def package_meta(): + return """ + Example from Kernel Module Packages Manual + + + + + + + + + + + + + + + + + + +""" + + +@pytest.fixture +def locked_package_meta(): + return """ + Example from Kernel Module Packages Manual + + + + + + + + + + + + + + + + + + + + + +""" + + +def test_get_project_meta(requests_mock): + matcher = prj_meta_re + text = '' + 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 = '' + 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] == '' +def test_ls_prj(requests_mock): + matcher = re.compile('/source/.*') + text = '' + 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] == '' +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 -- cgit v1.2.3