From 4e4197eeda4201312c23646c07b1587394b61cca Mon Sep 17 00:00:00 2001 From: Martin Krizek Date: May 12 2014 09:11:40 +0000 Subject: Add unit tests Differential Revision: https://phab.qadevel.cloud.fedoraproject.org/D65 --- diff --git a/.gitignore b/.gitignore index 14d3d5b..fde3bc6 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ *build/ *dist/ *.egg* +.coverage +htmlcov/ diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..2c789da --- /dev/null +++ b/pytest.ini @@ -0,0 +1,4 @@ +[pytest] +minversion = 2.0 +python_functions=test should +python_files=test_* functest_* diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..6ac9972 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +dingus==0.3.4 +pytest>=2.4.2 +pytest-cov>=1.6 +requests>=2.2.1 diff --git a/testing/__init__.py b/testing/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/testing/__init__.py diff --git a/testing/conftest.py b/testing/conftest.py new file mode 100644 index 0000000..f693629 --- /dev/null +++ b/testing/conftest.py @@ -0,0 +1,27 @@ +def pytest_addoption(parser): + """ + Add an option to the py.test parser to detect when the functional tests + should be detected and run + """ + + parser.addoption('-F', '--functional', action='store_true', default=False, + help='Add functional tests') + + +def pytest_ignore_collect(path, config): + """Prevents collection of any files named functest* to speed up non + integration tests""" + if path.fnmatch('*functest*'): + try: + is_functional = config.getvalue('functional') + except KeyError: + return True + + return not is_functional + + +def pytest_configure(config): + """Called after command line options have been parsed and all plugins and + initial conftest files been loaded.""" + + pass diff --git a/testing/test_api.py b/testing/test_api.py new file mode 100644 index 0000000..796beac --- /dev/null +++ b/testing/test_api.py @@ -0,0 +1,217 @@ +# Copyright 2014, Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Authors: +# Martin Krizek + +import resultsdb_api + +import json + +import pytest +import requests +from dingus import patch + + +class TestAPI(): + def setup_method(self, method): + self.rdb_url = "http://0.0.0.0:5000/api/v1.0" + self.ref_url = "http://example.com/someref" + self.ref_status = "SCHEDULED" + self.ref_testcase_name = "testcase" + self.ref_testcase_url = "http://fedoraqa.fedoraproject.org/testcase" + self.ref_outcome = "PASSED" + self.ref_content_type = "application/json" + self.ref_accept = "text/plain" + self.ref_job_id = 1 + self.ref_result_id = 1 + + self.helper = resultsdb_api.ResultsDBapi(self.rdb_url) + + @patch('requests.post') + def test_create_testcase(self): + self.helper.create_testcase(self.ref_testcase_name, self.ref_testcase_url) + + post_calls = requests.post.calls() + + rdb_url = post_calls[0][1][0] + headers = post_calls[0][2]['headers'] + data = json.loads(post_calls[0][2]['data']) + + assert rdb_url == "%s/testcases" % self.rdb_url + assert headers['Content-type'] == self.ref_content_type + assert headers['Accept'] == self.ref_accept + assert data['url'] == self.ref_testcase_url + assert data['name'] == self.ref_testcase_name + + @patch('requests.put') + def test_update_testcase(self): + self.helper.update_testcase(self.ref_testcase_name, self.ref_testcase_url) + + put_calls = requests.put.calls() + + rdb_url = put_calls[0][1][0] + headers = put_calls[0][2]['headers'] + data = json.loads(put_calls[0][2]['data']) + + assert rdb_url == "%s/testcases/%s" % (self.rdb_url, self.ref_testcase_name) + assert headers['Content-type'] == self.ref_content_type + assert headers['Accept'] == self.ref_accept + assert data['url'] == self.ref_testcase_url + + @patch('requests.get') + def test_get_testcase(self): + self.helper.get_testcase(self.ref_testcase_name) + + get_calls = requests.get.calls() + + rdb_url = get_calls[0][1][0] + + assert rdb_url == "%s/testcases/%s" % (self.rdb_url, self.ref_testcase_name) + + @patch('requests.get') + def test_get_testcases(self): + self.helper.get_testcases() + + get_calls = requests.get.calls() + + rdb_url = get_calls[0][1][0] + + assert rdb_url == "%s/testcases" % self.rdb_url + + @patch('requests.post') + def test_create_job(self): + self.helper.create_job(self.ref_url) + + post_calls = requests.post.calls() + + rdb_url = post_calls[0][1][0] + headers = post_calls[0][2]['headers'] + data = json.loads(post_calls[0][2]['data']) + + assert rdb_url == "%s/jobs" % self.rdb_url + assert headers['Content-type'] == self.ref_content_type + assert headers['Accept'] == self.ref_accept + assert data['ref_url'] == self.ref_url + + @patch('requests.put') + def test_update_job(self): + self.helper.update_job(id=self.ref_job_id, status=self.ref_status) + + put_calls = requests.put.calls() + + rdb_url = put_calls[0][1][0] + headers = put_calls[0][2]['headers'] + data = json.loads(put_calls[0][2]['data']) + + assert rdb_url == "%s/jobs/%s" % (self.rdb_url, self.ref_job_id) + assert headers['Content-type'] == self.ref_content_type + assert headers['Accept'] == self.ref_accept + assert data['status'] == self.ref_status + + def test_update_job_invalid(self): + with pytest.raises(TypeError): + self.helper.update_job() + + @patch('requests.get') + def test_get_job(self): + self.helper.get_job(self.ref_job_id) + + get_calls = requests.get.calls() + + rdb_url = get_calls[0][1][0] + + assert rdb_url == "%s/jobs/%s" % (self.rdb_url, self.ref_job_id) + + def test_get_job_invalid(self): + with pytest.raises(TypeError): + self.helper.get_job() + + @patch('requests.get') + def test_get_jobs(self): + self.helper.get_jobs() + + get_calls = requests.get.calls() + + rdb_url = get_calls[0][1][0] + + assert rdb_url == "%s/jobs" % self.rdb_url + + @patch('requests.get') + def test_get_jobs_params(self): + self.helper.get_jobs(status=self.ref_status) + + get_calls = requests.get.calls() + + rdb_url = get_calls[0][1][0] + params = get_calls[0][2]['params'] + + assert rdb_url == "%s/jobs" % self.rdb_url + assert params['status'] == self.ref_status + + @patch('requests.post') + def test_create_result(self): + self.helper.create_result(self.ref_job_id, self.ref_testcase_name, self.ref_outcome) + + post_calls = requests.post.calls() + + rdb_url = post_calls[0][1][0] + headers = post_calls[0][2]['headers'] + data = json.loads(post_calls[0][2]['data']) + + assert rdb_url == "%s/results" % self.rdb_url + assert headers['Content-type'] == self.ref_content_type + assert headers['Accept'] == self.ref_accept + assert data['job_id'] == self.ref_job_id + assert data['testcase_name'] == self.ref_testcase_name + assert data['outcome'] == self.ref_outcome + + @patch('requests.get') + def test_get_result(self): + self.helper.get_result(self.ref_result_id) + + get_calls = requests.get.calls() + + rdb_url = get_calls[0][1][0] + + assert rdb_url == "%s/results/%s" % (self.rdb_url, self.ref_job_id) + + def test_get_result_invalid(self): + with pytest.raises(TypeError): + self.helper.get_result() + + @patch('requests.get') + def test_get_results(self): + self.helper.get_results() + + get_calls = requests.get.calls() + + rdb_url = get_calls[0][1][0] + + assert rdb_url == "%s/results" % self.rdb_url + + @patch('requests.get') + def test_get_results_params(self): + self.helper.get_results(testcase_name=self.ref_testcase_name, job_id=self.ref_job_id) + + get_calls = requests.get.calls() + + rdb_url = get_calls[0][1][0] + params = get_calls[0][2]['params'] + + assert rdb_url == "%s/results" % self.rdb_url + assert params['testcase_name'] == self.ref_testcase_name + assert params['job_id'] == str(self.ref_job_id)