Skip to contentSkip to conversation

ed/toaster/fix-toastergui/tests

PATCH In review Ed Bartosh 2 participants 11 messages Aug 6, 2015 – Aug 11, 2015

lore
Share & tools
lore

Ed Bartosh

author
#0 lore raw

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

author
#1 lore raw

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
index 77e80fe..e3bbd62 100644
@@ -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
author
#2 lore raw

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
index e3bbd62..f2403e8 100644
@@ -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
author
#4 lore raw

PATCH 4/9 toaster: get rid of AllProjectsViewTestCase

In reply to Ed Bartosh

Removed 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
index d4aacb3..bba6f37 100644
@@ -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
author
#5 lore raw

PATCH 5/9 toaster: put all test cases into one class

In reply to Ed Bartosh

Moved 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
index bba6f37..0a51c01 100644
@@ -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
author
#6 lore raw

PATCH 6/9 toaster: get rid of class attribute LAYER_NAME

In reply to Ed Bartosh

The 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
index 0a51c01..14a847d 100644
@@ -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
author
#8 lore raw

PATCH 8/9 toaster: add header and docsting

In reply to Ed Bartosh

Added 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
index a6b5c9b..a549a02 100644
@@ -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
author
#7 lore raw

PATCH 7/9 toaster: remove unused import

In reply to Ed Bartosh

Fixed 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
index 14a847d..a6b5c9b 100644
@@ -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
author
#3 lore raw

PATCH 3/9 toaster: wrap long lines

In reply to Ed Bartosh

Fixed 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
index f2403e8..d4aacb3 100644
@@ -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
author
#9 lore raw

PATCH 9/9 toaster: don't catch json.load exceptions

In reply to 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.

---
 bitbake/lib/toaster/toastergui/tests.py | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)
bitbake/lib/toaster/toastergui/tests.py +4 -10
index a549a02..a38cdab 100644
@@ -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
#10 lore raw

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.

---
  bitbake/lib/toaster/toastergui/tests.py | 14 ++++----------
  1 file changed, 4 insertions(+), 10 deletions(-)
bitbake/lib/toaster/toastergui/tests.py +4 -10
index a549a02..a38cdab 100644
@@ -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")