diff options
| -rw-r--r-- | obsapi/core.py | 24 | ||||
| -rw-r--r-- | test/test_api.py | 31 |
2 files changed, 55 insertions, 0 deletions
diff --git a/obsapi/core.py b/obsapi/core.py index 45d19c6..748044c 100644 --- a/obsapi/core.py +++ b/obsapi/core.py @@ -393,3 +393,27 @@ class ObsApi(object): for srcfile in flist: if srcfile.name.endswith('.spec'): yield self.source.get(prj, pkg, srcfile.name) + + def set_flag(self, prj, pkg=None, flag=None): + if flag is None: + return None + + try: + flag_type = getattr(flag, 'flag', flag.get('flag', None)) + if flag_type is None: + raise Exception('Invalid flag type: None') + except AttributeError: + raise Exception('flag type %s missing get function' % type(flag)) + + status = getattr(flag, 'status', flag.get('status', 'enable')) + if status not in ['enable', 'disable']: + raise ValueError('flag status expected "enable" or "disable" got %s' % status) + + params = dict(cmd='set_flag', + flag=flag_type, + status=status, + repository=getattr(flag, 'repository', flag.get('repository', None)), + arch=getattr(flag, 'arch', flag.get('arch', None)), + ) + + return self.source.post(prj, pkg, **params) diff --git a/test/test_api.py b/test/test_api.py index 5a46fb9..3fbf349 100644 --- a/test/test_api.py +++ b/test/test_api.py @@ -4,6 +4,12 @@ import os from . import test_dir from obsapi import ObsApi from lxml import etree +try: + from urllib.parse import urlparse + from urllib.parse import parse_qs +except Exception: + from urlparse import urlparse + from urlparse import parse_qs apiurl = 'https://api.opensuse.org' api = ObsApi(apiurl=apiurl) @@ -514,3 +520,28 @@ def test_get_project_spec_files(requests_mock, project_directory, package_direct expected_specfiles = [spec_file_1, spec_file_2, spec_file_3] specfiles = api.get_spec_files(prj) assert list(specfiles) == expected_specfiles + + +# POST /source/<project>?cmd=set_flag&repository=:opt&arch=:opt&flag=flag&status=status +def test_set_project_flags(requests_mock): + matcher = re.compile(r'/source/.*') + requests_mock.post(matcher) + params = dict(cmd='set_flag', flag='publish', status='enable') + + response = api.set_flag(prj, flag=params) + assert response.status_code == 200 + + url = requests_mock.request_history[0].url + query = parse_qs(urlparse(url).query) + assert query.keys() == params.keys() + for key, values in query.items(): + assert len(values) == 1 + assert params.get(key, None) == query.get(key, [])[0] + + +# POST /source/<project>/<package>?cmd=set_flag&repository=:opt&arch=:opt&flag=flag&status=status +def test_set_package_flags(requests_mock): + pass + +# POST /source/<project>/<package>?cmd=remove_flag&repository=:opt&arch=:opt&flag=flag +# POST /source/<project>?cmd=remove_flag&repository=:opt&arch=:opt&flag=flag |
