ed/toaster/fix-toastergui/tests
cover ed/toaster/fix-toastergui/tests
This patchset contains fixes and code cleanups for toastergui tests. Some tests were completely rewritten.
Now all 3 test cases are passed and pylint score is 10.
The following changes since commit a8b723498c9a7106210db140452886894494b4d6:
bitbake: cooker: Resolve file monitoring race issues when using memres bitbake (2015-08-03 07:36:25 +0100)
are available in the git repository at:
git://git.yoctoproject.org/poky-contrib ed/toaster/fix-toastergui-tests
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=ed/toaster/fix-toastergui-tests
Ed Bartosh (9):
toaster: fix test_get_json_call_returns_json test
toaster: fix test_xhr_datatypeahead_layer test
toaster: wrap long lines
toaster: get rid of AllProjectsViewTestCase
toaster: put all test cases into one class
toaster: get rid of class attribute LAYER_NAME
toaster: remove unused import
toaster: add header and docsting
toaster: don't catch json.load exceptions
bitbake/lib/toaster/toastergui/tests.py | 119 +++++++++++++++++++------------- 1 file changed, 70 insertions(+), 49 deletions(-)
--
Regards,
Ed
PATCH 1/9 toaster: fix test_get_json_call_returns_json test
This test case used wrong field name. Fixed by renaming field 'lists' -> 'rows'.
--- bitbake/lib/toaster/toastergui/tests.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
bitbake/lib/toaster/toastergui/tests.py +6 -6
@@ -34,13 +34,13 @@ class AllProjectsViewTestCase(ProvisionedProjectTestCase): self.assertTrue("error" in data) self.assertEqual(data["error"], "ok") - self.assertTrue("list" in data) + self.assertTrue("rows" in data) - self.assertTrue(AllProjectsViewTestCase.TEST_PROJECT_NAME in map(lambda x: x["name"], data["list"])) - self.assertTrue("id" in data["list"][0]) - self.assertTrue("projectLayersUrl" in data["list"][0]) - self.assertTrue("projectPageUrl" in data["list"][0]) - self.assertTrue("projectBuildsUrl" in data["list"][0]) + self.assertTrue(AllProjectsViewTestCase.TEST_PROJECT_NAME in map(lambda x: x["name"], data["rows"])) + self.assertTrue("id" in data["rows"][0]) + self.assertTrue("projectLayersUrl" in data["rows"][0]) + self.assertTrue("projectPageUrl" in data["rows"][0]) + self.assertTrue("projectBuildsUrl" in data["rows"][0]) class ProvisionedLayersProjectTestCase(ProvisionedProjectTestCase): LAYER_NAME = "base-layer"
Signature · 1 line
2.1.4
PATCH 2/9 toaster: fix test_xhr_datatypeahead_layer test
The test was expecting data returned from the ReST call, but it was not valid expectation as database is empty. It also used wrong field name 'list' instead of 'rows'.
Fixed by adjusting assert to expect empty response. Used correct field name 'rows' instead of 'list'.
--- bitbake/lib/toaster/toastergui/tests.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
bitbake/lib/toaster/toastergui/tests.py +3 -5
@@ -59,7 +59,7 @@ class XHRDataTypeAheadTestCase(ProvisionedLayersProjectTestCase): self.assertTrue(self.lv in self.project.compatible_layerversions()) def test_xhr_datatypeahead_layer(self): - response = self.client.get(reverse('xhr_datatypeahead', args=(self.project.id,)), {"type": "layerdeps"}) + response = self.client.get(reverse('xhr_datatypeahead', args=(self.project.id,)), {"type": "versionlayers"}) self.assertEqual(response.status_code, 200) self.assertTrue(response['Content-Type'].startswith('application/json'))
@@ -71,7 +71,5 @@ class XHRDataTypeAheadTestCase(ProvisionedLayersProjectTestCase): self.assertTrue("error" in data) self.assertEqual(data["error"], "ok") - self.assertTrue("list" in data) - self.assertTrue(len(data["list"]) > 0) - - self.assertTrue(XHRDataTypeAheadTestCase.LAYER_NAME in map(lambda x: x["name"], data["list"])) + self.assertTrue("rows" in data) + self.assertEqual(len(data["rows"]), 0)
Signature · 1 line
2.1.4
PATCH 4/9 toaster: get rid of AllProjectsViewTestCase
In reply to Ed BartoshRemoved AllProjectsViewTestCase class as it had one method 'setUp' and used as a parent for another class AllProjectsViewTestCase.
Moved setUp method to AllProjectsViewTestCase.
--- bitbake/lib/toaster/toastergui/tests.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
bitbake/lib/toaster/toastergui/tests.py +1 -4
@@ -6,7 +6,7 @@ from orm.models import Layer, Layer_Version PROJECT_NAME = "test project" -class ProvisionedProjectTestCase(TestCase): +class AllProjectsViewTestCase(TestCase): def setUp(self): self.bbv = BitbakeVersion.objects.create(\
@@ -17,9 +17,6 @@ class ProvisionedProjectTestCase(TestCase): self.project = Project.objects.create_project(name=PROJECT_NAME, release=self.release) - -class AllProjectsViewTestCase(ProvisionedProjectTestCase): - def test_get_base_call_returns_html(self): response = self.client.get(reverse('all-projects'), follow=True) self.assertEqual(response.status_code, 200)
Signature · 1 line
2.1.4
PATCH 5/9 toaster: put all test cases into one class
In reply to Ed BartoshMoved all functionality (one setup method and one test case) from ProvisionedLayersProjectTestCase and XHRDataTypeAheadTestCase to AllProjectsViewTestCase.
Renamed AllProjectsViewTestCase -> ViewTests.
--- bitbake/lib/toaster/toastergui/tests.py | 40 +++++++++++++-------------------- 1 file changed, 15 insertions(+), 25 deletions(-)
bitbake/lib/toaster/toastergui/tests.py +15 -25
@@ -6,8 +6,8 @@ from orm.models import Layer, Layer_Version PROJECT_NAME = "test project" -class AllProjectsViewTestCase(TestCase): - +class ViewTests(TestCase): + LAYER_NAME = "base-layer" def setUp(self): self.bbv = BitbakeVersion.objects.create(\ name="test bbv", giturl="/tmp/",
@@ -16,6 +16,19 @@ class AllProjectsViewTestCase(TestCase): name="test release", bitbake_version=self.bbv) self.project = Project.objects.create_project(name=PROJECT_NAME, release=self.release) + self.layersrc = LayerSource.objects.create(\ + sourcetype=LayerSource.TYPE_IMPORTED) + self.priority = ReleaseLayerSourcePriority.objects.create(\ + release=self.release, + layer_source=self.layersrc) + self.layer = Layer.objects.create(\ + name=self.LAYER_NAME, + layer_source=self.layersrc, vcs_url="/tmp/") + self.lver = Layer_Version.objects.create(\ + layer=self.layer, project=self.project, + layer_source=self.layersrc, commit="master") + + self.assertTrue(self.lver in self.project.compatible_layerversions()) def test_get_base_call_returns_html(self): response = self.client.get(reverse('all-projects'), follow=True)
@@ -46,29 +59,6 @@ class AllProjectsViewTestCase(TestCase): self.assertTrue("projectPageUrl" in data["rows"][0]) self.assertTrue("projectBuildsUrl" in data["rows"][0]) -class ProvisionedLayersProjectTestCase(ProvisionedProjectTestCase): - LAYER_NAME = "base-layer" - def setUp(self): - super(ProvisionedLayersProjectTestCase, self).setUp() - self.layersrc = LayerSource.objects.create(\ - sourcetype=LayerSource.TYPE_IMPORTED) - self.priority = ReleaseLayerSourcePriority.objects.create(\ - release=self.release, - layer_source=self.layersrc) - self.layer = Layer.objects.create(\ - name=XHRDataTypeAheadTestCase.LAYER_NAME, - layer_source=self.layersrc, vcs_url="/tmp/") - self.lver = Layer_Version.objects.create(\ - layer=self.layer, project=self.project, - layer_source=self.layersrc, commit="master") - - -class XHRDataTypeAheadTestCase(ProvisionedLayersProjectTestCase): - - def setUp(self): - super(XHRDataTypeAheadTestCase, self).setUp() - self.assertTrue(self.lver in self.project.compatible_layerversions()) - def test_xhr_datatypeahead_layer(self): url = reverse('xhr_datatypeahead', args=(self.project.id,)) response = self.client.get(url, {"type": "versionlayers"})
Signature · 1 line
2.1.4
PATCH 6/9 toaster: get rid of class attribute LAYER_NAME
In reply to Ed BartoshThe attribute doesn't make sense as it's used only once.
--- bitbake/lib/toaster/toastergui/tests.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
bitbake/lib/toaster/toastergui/tests.py +1 -2
@@ -7,7 +7,6 @@ from orm.models import Layer, Layer_Version PROJECT_NAME = "test project" class ViewTests(TestCase): - LAYER_NAME = "base-layer" def setUp(self): self.bbv = BitbakeVersion.objects.create(\ name="test bbv", giturl="/tmp/",
@@ -22,7 +21,7 @@ class ViewTests(TestCase): release=self.release, layer_source=self.layersrc) self.layer = Layer.objects.create(\ - name=self.LAYER_NAME, + name="base-layer", layer_source=self.layersrc, vcs_url="/tmp/") self.lver = Layer_Version.objects.create(\ layer=self.layer, project=self.project,
Signature · 1 line
2.1.4
PATCH 8/9 toaster: add header and docsting
In reply to Ed BartoshAdded header and docstrings to toastergui tests module.
--- bitbake/lib/toaster/toastergui/tests.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+)
bitbake/lib/toaster/toastergui/tests.py +28 -0
@@ -1,3 +1,26 @@ +#! /usr/bin/env python +# ex:ts=4:sw=4:sts=4:et +# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- +# +# BitBake Toaster Implementation +# +# Copyright (C) 2013-2015 Intel Corporation +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. +# +# 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. + +"""Test cases for Toaster GUI and ReST.""" + from django.test import TestCase from django.core.urlresolvers import reverse from orm.models import Project, Release, BitbakeVersion
@@ -7,6 +30,8 @@ from orm.models import Layer, Layer_Version PROJECT_NAME = "test project" class ViewTests(TestCase): + """Tests to verify view APIs.""" + def setUp(self): self.bbv = BitbakeVersion.objects.create(\ name="test bbv", giturl="/tmp/",
@@ -30,6 +55,7 @@ class ViewTests(TestCase): self.assertTrue(self.lver in self.project.compatible_layerversions()) def test_get_base_call_returns_html(self): + """Basic test for all-projects view.""" response = self.client.get(reverse('all-projects'), follow=True) self.assertEqual(response.status_code, 200) self.assertTrue(response['Content-Type'].startswith('text/html'))
@@ -37,6 +63,7 @@ class ViewTests(TestCase): self.assertTrue(PROJECT_NAME in response.content) def test_get_json_call_returns_json(self): + """Test for all projects output in json format.""" url = reverse('all-projects') response = self.client.get(url, {"format": "json"}, follow=True) self.assertEqual(response.status_code, 200)
@@ -59,6 +86,7 @@ class ViewTests(TestCase): self.assertTrue("projectBuildsUrl" in data["rows"][0]) def test_xhr_datatypeahead_layer(self): + """Test ReST API xhr_datatypeahead.""" url = reverse('xhr_datatypeahead', args=(self.project.id,)) response = self.client.get(url, {"type": "versionlayers"}) self.assertEqual(response.status_code, 200)
Signature · 1 line
2.1.4
PATCH 7/9 toaster: remove unused import
In reply to Ed BartoshFixed pylint warning:
Unused Build imported from orm.models (unused-import)
--- bitbake/lib/toaster/toastergui/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
bitbake/lib/toaster/toastergui/tests.py +1 -1
@@ -1,6 +1,6 @@ from django.test import TestCase from django.core.urlresolvers import reverse -from orm.models import Project, Release, BitbakeVersion, Build +from orm.models import Project, Release, BitbakeVersion from orm.models import ReleaseLayerSourcePriority, LayerSource from orm.models import Layer, Layer_Version
Signature · 1 line
2.1.4
PATCH 3/9 toaster: wrap long lines
In reply to Ed BartoshFixed pylint warning Line too long (line-too-long).
--- bitbake/lib/toaster/toastergui/tests.py | 43 ++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 14 deletions(-)
bitbake/lib/toaster/toastergui/tests.py +29 -14
@@ -1,15 +1,21 @@ from django.test import TestCase from django.core.urlresolvers import reverse from orm.models import Project, Release, BitbakeVersion, Build -from orm.models import ReleaseLayerSourcePriority, LayerSource, Layer, Layer_Version +from orm.models import ReleaseLayerSourcePriority, LayerSource +from orm.models import Layer, Layer_Version + +PROJECT_NAME = "test project" class ProvisionedProjectTestCase(TestCase): - TEST_PROJECT_NAME = "test project" def setUp(self): - self.bbv, created = BitbakeVersion.objects.get_or_create(name="test bbv", giturl="/tmp/", branch="master", dirpath="") - self.release, created = Release.objects.get_or_create(name="test release", bitbake_version = self.bbv) - self.project = Project.objects.create_project(name=AllProjectsViewTestCase.TEST_PROJECT_NAME, release=self.release) + self.bbv = BitbakeVersion.objects.create(\ + name="test bbv", giturl="/tmp/", + branch="master", dirpath="") + self.release = Release.objects.create(\ + name="test release", bitbake_version=self.bbv) + self.project = Project.objects.create_project(name=PROJECT_NAME, + release=self.release) class AllProjectsViewTestCase(ProvisionedProjectTestCase):
@@ -19,10 +25,11 @@ class AllProjectsViewTestCase(ProvisionedProjectTestCase): self.assertEqual(response.status_code, 200) self.assertTrue(response['Content-Type'].startswith('text/html')) self.assertTemplateUsed(response, "projects.html") - self.assertTrue(AllProjectsViewTestCase.TEST_PROJECT_NAME in response.content) + self.assertTrue(PROJECT_NAME in response.content) def test_get_json_call_returns_json(self): - response = self.client.get(reverse('all-projects'), {"format": "json"}, follow=True) + url = reverse('all-projects') + response = self.client.get(url, {"format": "json"}, follow=True) self.assertEqual(response.status_code, 200) self.assertTrue(response['Content-Type'].startswith('application/json'))
@@ -36,7 +43,7 @@ class AllProjectsViewTestCase(ProvisionedProjectTestCase): self.assertEqual(data["error"], "ok") self.assertTrue("rows" in data) - self.assertTrue(AllProjectsViewTestCase.TEST_PROJECT_NAME in map(lambda x: x["name"], data["rows"])) + self.assertTrue(PROJECT_NAME in [x["name"] for x in data["rows"]]) self.assertTrue("id" in data["rows"][0]) self.assertTrue("projectLayersUrl" in data["rows"][0]) self.assertTrue("projectPageUrl" in data["rows"][0])
@@ -46,20 +53,28 @@ class ProvisionedLayersProjectTestCase(ProvisionedProjectTestCase): LAYER_NAME = "base-layer" def setUp(self): super(ProvisionedLayersProjectTestCase, self).setUp() - self.layersource, created = LayerSource.objects.get_or_create(sourcetype = LayerSource.TYPE_IMPORTED) - self.releaselayersourcepriority, created = ReleaseLayerSourcePriority.objects.get_or_create(release = self.release, layer_source = self.layersource) - self.layer, created = Layer.objects.get_or_create(name=XHRDataTypeAheadTestCase.LAYER_NAME, layer_source=self.layersource, vcs_url="/tmp/") - self.lv, created = Layer_Version.objects.get_or_create(layer = self.layer, project = self.project, layer_source=self.layersource, commit="master") + self.layersrc = LayerSource.objects.create(\ + sourcetype=LayerSource.TYPE_IMPORTED) + self.priority = ReleaseLayerSourcePriority.objects.create(\ + release=self.release, + layer_source=self.layersrc) + self.layer = Layer.objects.create(\ + name=XHRDataTypeAheadTestCase.LAYER_NAME, + layer_source=self.layersrc, vcs_url="/tmp/") + self.lver = Layer_Version.objects.create(\ + layer=self.layer, project=self.project, + layer_source=self.layersrc, commit="master") class XHRDataTypeAheadTestCase(ProvisionedLayersProjectTestCase): def setUp(self): super(XHRDataTypeAheadTestCase, self).setUp() - self.assertTrue(self.lv in self.project.compatible_layerversions()) + self.assertTrue(self.lver in self.project.compatible_layerversions()) def test_xhr_datatypeahead_layer(self): - response = self.client.get(reverse('xhr_datatypeahead', args=(self.project.id,)), {"type": "versionlayers"}) + url = reverse('xhr_datatypeahead', args=(self.project.id,)) + response = self.client.get(url, {"type": "versionlayers"}) self.assertEqual(response.status_code, 200) self.assertTrue(response['Content-Type'].startswith('application/json'))
Signature · 1 line
2.1.4
PATCH 9/9 toaster: don't catch json.load exceptions
In reply to Ed BartoshIt doesn't make sense to catch json.load exceptions in the testing code. It's not a production code and if it fails because some API doesn't return json code it's better to see full traceback.
--- bitbake/lib/toaster/toastergui/tests.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-)
bitbake/lib/toaster/toastergui/tests.py +4 -10
@@ -21,6 +21,8 @@ """Test cases for Toaster GUI and ReST.""" +import json + from django.test import TestCase from django.core.urlresolvers import reverse from orm.models import Project, Release, BitbakeVersion
@@ -69,11 +71,7 @@ class ViewTests(TestCase): self.assertEqual(response.status_code, 200) self.assertTrue(response['Content-Type'].startswith('application/json')) - try: - import json - data = json.loads(response.content) - except: - self.fail("Response %s is not json-loadable" % response.content) + data = json.loads(response.content) self.assertTrue("error" in data) self.assertEqual(data["error"], "ok")
@@ -92,11 +90,7 @@ class ViewTests(TestCase): self.assertEqual(response.status_code, 200) self.assertTrue(response['Content-Type'].startswith('application/json')) - try: - import json - data = json.loads(response.content) - except: - self.fail("Response %s is not json-loadable" % response.content) + data = json.loads(response.content) self.assertTrue("error" in data) self.assertEqual(data["error"], "ok")
Signature · 1 line
2.1.4
Re: [PATCH 9/9] toaster: don't catch json.load exceptions
Thanks - Submitted upstream (with the additional patches post-rebase)
Quoted 49 lines · Ed Bartosh
It doesn't make sense to catch json.load exceptions in the testing code. It's not a production code and if it fails because some API doesn't return json code it's better to see full traceback.
Signed-off-by Ed Bartosh <[email protected]>--- bitbake/lib/toaster/toastergui/tests.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-)bitbake/lib/toaster/toastergui/tests.py +4
-10@@ -21,6 +21,8 @@ """Test cases for Toaster GUI and ReST.""" +import json + from django.test import TestCase from django.core.urlresolvers import reverse from orm.models import Project, Release, BitbakeVersion@@ -69,11 +71,7 @@ class ViewTests(TestCase): self.assertEqual(response.status_code, 200) self.assertTrue(response['Content-Type'].startswith('application/json')) - try: - import json - data = json.loads(response.content) - except: - self.fail("Response %s is not json-loadable" % response.content) + data = json.loads(response.content) self.assertTrue("error" in data) self.assertEqual(data["error"], "ok")@@ -92,11 +90,7 @@ class ViewTests(TestCase): self.assertEqual(response.status_code, 200) self.assertTrue(response['Content-Type'].startswith('application/json')) - try: - import json - data = json.loads(response.content) - except: - self.fail("Response %s is not json-loadable" % response.content) + data = json.loads(response.content) self.assertTrue("error" in data) self.assertEqual(data["error"], "ok")