Fixes and clean ups for toastergui unit tests
cover Fixes and clean ups for toastergui unit tests
This patchset contains fixes and code cleanups for Toaster GUI tests. Reviewed by Michael Wood.
The following changes since commit c75cefe8a382a63f625123c156137782db118f64:
libpam: Fix patch broken during upgrade (2015-08-09 15:15:33 -0700)
are available in the git repository at:
git://git.yoctoproject.org/poky-contrib michaelw/toaster/submit/ed/toaster/fix-toastergui-tests
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=michaelw/toaster/submit/ed/toaster/fix-toastergui-tests
Ed Bartosh (11):
toaster: fix test_get_json_call_returns_json test
toaster: wrap long lines
toaster: get rid of AllProjectsViewTestCase
toaster: put all test cases into one class
toaster: get rid of class attributes
toaster: remove unused import
toaster: add header and docstings
toaster: don't catch json.load exceptions
toaster: fix test_get_json_call_returns_json again
toaster: fix pylint warning 'no space allowed'
toaster: reduced amount of instance attributes
lib/toaster/toastergui/tests.py | 133 +++++++++++++++++++++++----------------- 1 file changed, 78 insertions(+), 55 deletions(-)
Signature · 1 line
2.1.4
PATCH 1/11 toaster: fix test_get_json_call_returns_json test
From: Ed Bartosh <[email protected]>
This test case used wrong field name.
Fixed by renaming field 'lists' -> 'rows'.
--- lib/toaster/toastergui/tests.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
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/11 toaster: wrap long lines
From: Ed Bartosh <[email protected]>
Fixed pylint warning Line too long (line-too-long).
--- lib/toaster/toastergui/tests.py | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-)
lib/toaster/toastergui/tests.py +27 -13
@@ -1,16 +1,22 @@ 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, Recipe, Machine, ProjectLayer +from orm.models import ReleaseLayerSourcePriority, LayerSource, Layer +from orm.models import Layer_Version, Recipe, Machine, ProjectLayer import json +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):
@@ -20,10 +26,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])
@@ -49,10 +56,17 @@ class ProvisionedLayersProjectTestCase(ProvisionedProjectTestCase): 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") self.recipe, created = Recipe.objects.get_or_create(layer_source=self.layersource, name=ProvisionedLayersProjectTestCase.RECIPE_NAME, version="1.2", summary="one recipe", description="recipe", layer_version=self.lv)
@@ -66,7 +80,7 @@ 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_typeaheads(self): layers_url = reverse('xhr_layerstypeahead', args=(self.project.id,))
Signature · 1 line
2.1.4
PATCH 3/11 toaster: get rid of AllProjectsViewTestCase
In reply to Michael WoodFrom: Ed Bartosh <[email protected]>
Removed AllProjectsViewTestCase class as it had one method 'setUp' and used as a parent for another class AllProjectsViewTestCase.
Moved setUp method to AllProjectsViewTestCase.
--- lib/toaster/toastergui/tests.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
lib/toaster/toastergui/tests.py +1 -4
@@ -7,7 +7,7 @@ import json PROJECT_NAME = "test project" -class ProvisionedProjectTestCase(TestCase): +class AllProjectsViewTestCase(TestCase): def setUp(self): self.bbv = BitbakeVersion.objects.create(\
@@ -18,9 +18,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 4/11 toaster: put all test cases into one class
In reply to Michael WoodFrom: Ed Bartosh <[email protected]>
Moved all functionality (one setup method and one test case) from ProvisionedLayersProjectTestCase and XHRDataTypeAheadTestCase to AllProjectsViewTestCase.
Renamed AllProjectsViewTestCase -> ViewTests.
--- lib/toaster/toastergui/tests.py | 63 +++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 34 deletions(-)
lib/toaster/toastergui/tests.py +29 -34
@@ -7,7 +7,10 @@ import json PROJECT_NAME = "test project" -class AllProjectsViewTestCase(TestCase): +class ViewTests(TestCase): + """Tests to verify view APIs.""" + LAYER_NAME = "base-layer" + RECIPE_NAME = "base-recipe" def setUp(self): self.bbv = BitbakeVersion.objects.create(\
@@ -17,6 +20,31 @@ 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.recipe = Recipe.objects.create(\ + layer_source=self.layersrc, name=self.RECIPE_NAME, + version="1.2", summary="one recipe", + description="recipe", layer_version=self.lver) + + self.machine = Machine.objects.create(\ + layer_version=self.lver, name="wisk", + description="wisking machine") + + ProjectLayer.objects.create(project=self.project, + layercommit=self.lver) + + 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,39 +74,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" - RECIPE_NAME = "base-recipe" - - - 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") - - self.recipe, created = Recipe.objects.get_or_create(layer_source=self.layersource, name=ProvisionedLayersProjectTestCase.RECIPE_NAME, version="1.2", summary="one recipe", description="recipe", layer_version=self.lv) - - self.machine, created = Machine.objects.get_or_create(layer_version=self.lv, name="wisk", description="wisking machine") - - ProjectLayer.objects.get_or_create(project = self.project, - layercommit = self.lv) - - -class XHRDataTypeAheadTestCase(ProvisionedLayersProjectTestCase): - - def setUp(self): - super(XHRDataTypeAheadTestCase, self).setUp() - self.assertTrue(self.lver in self.project.compatible_layerversions()) - def test_typeaheads(self): layers_url = reverse('xhr_layerstypeahead', args=(self.project.id,)) prj_url = reverse('xhr_projectstypeahead')
Signature · 1 line
2.1.4
PATCH 5/11 toaster: get rid of class attributes
In reply to Michael WoodFrom: Ed Bartosh <[email protected]>
LAYER_NAME and RECIPE_NAME attributes don't make sense as they're used only once.
--- lib/toaster/toastergui/tests.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
lib/toaster/toastergui/tests.py +2 -4
@@ -9,8 +9,6 @@ PROJECT_NAME = "test project" class ViewTests(TestCase): """Tests to verify view APIs.""" - LAYER_NAME = "base-layer" - RECIPE_NAME = "base-recipe" def setUp(self): self.bbv = BitbakeVersion.objects.create(\
@@ -26,14 +24,14 @@ 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, layer_source=self.layersrc, commit="master") self.recipe = Recipe.objects.create(\ - layer_source=self.layersrc, name=self.RECIPE_NAME, + layer_source=self.layersrc, name="base-recipe", version="1.2", summary="one recipe", description="recipe", layer_version=self.lver)
Signature · 1 line
2.1.4
PATCH 6/11 toaster: remove unused import
In reply to Michael WoodFrom: Ed Bartosh <[email protected]>
Fixed pylint warning:
Unused Build imported from orm.models (unused-import)
--- lib/toaster/toastergui/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
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, Layer from orm.models import Layer_Version, Recipe, Machine, ProjectLayer import json
Signature · 1 line
2.1.4
PATCH 7/11 toaster: add header and docstings
In reply to Michael WoodFrom: Ed Bartosh <[email protected]>
Added header and docstrings to toastergui tests module.
--- lib/toaster/toastergui/tests.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-)
lib/toaster/toastergui/tests.py +28 -1
@@ -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
@@ -45,6 +68,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'))
@@ -52,6 +76,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)
@@ -73,6 +98,7 @@ class ViewTests(TestCase): self.assertTrue("projectBuildsUrl" in data["rows"][0]) def test_typeaheads(self): + """Test typeahead ReST API""" layers_url = reverse('xhr_layerstypeahead', args=(self.project.id,)) prj_url = reverse('xhr_projectstypeahead')
@@ -82,7 +108,8 @@ class ViewTests(TestCase): reverse('xhr_machinestypeahead', args=(self.project.id,)), ] - def basic_reponse_check(reponse, url): + def basic_reponse_check(response, url): + """Check data structure of http response.""" self.assertEqual(response.status_code, 200) self.assertTrue(response['Content-Type'].startswith('application/json'))
Signature · 1 line
2.1.4
PATCH 8/11 toaster: don't catch json.load exceptions
In reply to Michael WoodFrom: Ed Bartosh <[email protected]>
It doesn't make sense to catch json.load exceptions in the testing code. If API throws traceback it's better to see it instead of error message.
--- lib/toaster/toastergui/tests.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-)
lib/toaster/toastergui/tests.py +3 -8
@@ -82,10 +82,7 @@ class ViewTests(TestCase): self.assertEqual(response.status_code, 200) self.assertTrue(response['Content-Type'].startswith('application/json')) - try: - 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")
@@ -113,10 +110,8 @@ class ViewTests(TestCase): self.assertEqual(response.status_code, 200) self.assertTrue(response['Content-Type'].startswith('application/json')) - try: - 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") self.assertTrue("results" in data)
Signature · 1 line
2.1.4
PATCH 9/11 toaster: fix test_get_json_call_returns_json again
In reply to Michael WoodFrom: Ed Bartosh <[email protected]>
Fixed this test case again after rebase. Improved it to check for all returned keys. Previously it was checking only 3 of them.
--- lib/toaster/toastergui/tests.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
lib/toaster/toastergui/tests.py +7 -3
@@ -90,9 +90,13 @@ class ViewTests(TestCase): 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]) - self.assertTrue("projectBuildsUrl" in data["rows"][0]) + + self.assertEqual(sorted(data["rows"][0]), + ['bitbake_version_id', 'created', 'id', + 'layersTypeAheadUrl', 'name', 'projectBuildsUrl', + 'projectPageUrl', 'recipesTypeAheadUrl', + 'release_id', 'short_description', 'updated', + 'user_id']) def test_typeaheads(self): """Test typeahead ReST API"""
Signature · 1 line
2.1.4
PATCH 10/11 toaster: fix pylint warning 'no space allowed'
In reply to Michael WoodFrom: Ed Bartosh <[email protected]>
Fixed pylint warning "No space allowed before/after bracket".
--- lib/toaster/toastergui/tests.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
lib/toaster/toastergui/tests.py +5 -5
@@ -103,10 +103,10 @@ class ViewTests(TestCase): layers_url = reverse('xhr_layerstypeahead', args=(self.project.id,)) prj_url = reverse('xhr_projectstypeahead') - urls = [ layers_url, - prj_url, - reverse('xhr_recipestypeahead', args=(self.project.id,)), - reverse('xhr_machinestypeahead', args=(self.project.id,)), + urls = [layers_url, + prj_url, + reverse('xhr_recipestypeahead', args=(self.project.id,)), + reverse('xhr_machinestypeahead', args=(self.project.id,)), ] def basic_reponse_check(response, url):
@@ -147,7 +147,7 @@ class ViewTests(TestCase): results = False for typeing in list(string.ascii_letters): - response = self.client.get(url, { 'search' : typeing }) + response = self.client.get(url, {'search': typeing}) results = basic_reponse_check(response, url) if results: break
Signature · 1 line
2.1.4
PATCH 11/11 toaster: reduced amount of instance attributes
In reply to Michael WoodFrom: Ed Bartosh <[email protected]>
Used local variables instead of instance attributes in ViewTests.setUp
Fixed pylint warning:
Too many instance attributes (9/7) (too-many-instance-attributes)
--- lib/toaster/toastergui/tests.py | 55 ++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 31 deletions(-)
lib/toaster/toastergui/tests.py +24 -31
@@ -34,38 +34,31 @@ class ViewTests(TestCase): """Tests to verify view APIs.""" def setUp(self): - 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) + bbv = BitbakeVersion.objects.create(name="test bbv", giturl="/tmp/", + branch="master", dirpath="") + release = Release.objects.create(name="test release", + bitbake_version=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="base-layer", - 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.recipe = Recipe.objects.create(\ - layer_source=self.layersrc, name="base-recipe", - version="1.2", summary="one recipe", - description="recipe", layer_version=self.lver) - - self.machine = Machine.objects.create(\ - layer_version=self.lver, name="wisk", - description="wisking machine") - - ProjectLayer.objects.create(project=self.project, - layercommit=self.lver) - - self.assertTrue(self.lver in self.project.compatible_layerversions()) + release=release) + layersrc = LayerSource.objects.create(sourcetype=LayerSource.TYPE_IMPORTED) + self.priority = ReleaseLayerSourcePriority.objects.create(release=release, + layer_source=layersrc) + layer = Layer.objects.create(name="base-layer", layer_source=layersrc, + vcs_url="/tmp/") + + lver = Layer_Version.objects.create(layer=layer, project=self.project, + layer_source=layersrc, commit="master") + + Recipe.objects.create(layer_source=layersrc, name="base-recipe", + version="1.2", summary="one recipe", + description="recipe", layer_version=lver) + + Machine.objects.create(layer_version=lver, name="wisk", + description="wisking machine") + + ProjectLayer.objects.create(project=self.project, layercommit=lver) + + self.assertTrue(lver in self.project.compatible_layerversions()) def test_get_base_call_returns_html(self): """Basic test for all-projects view"""
Signature · 1 line
2.1.4