Skip to contentSkip to conversation

Fixes and clean ups for toastergui unit tests

PATCH New Michael Wood 1 participant 12 messages Aug 10, 2015

lore
Share & tools
lore
#0 lore raw

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
#1 lore raw

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
index 8a59af4..39586e0 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
#2 lore raw

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
index 39586e0..a9edd54 100644
@@ -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
#3 lore raw

PATCH 3/11 toaster: get rid of AllProjectsViewTestCase

In reply to Michael Wood

From: 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
index a9edd54..6f3930d 100644
@@ -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
#4 lore raw

PATCH 4/11 toaster: put all test cases into one class

In reply to Michael Wood

From: 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
index 6f3930d..986e6a5 100644
@@ -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
#5 lore raw

PATCH 5/11 toaster: get rid of class attributes

In reply to Michael Wood

From: 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
index 986e6a5..9755a88 100644
@@ -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
#6 lore raw

PATCH 6/11 toaster: remove unused import

In reply to Michael Wood

From: 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
index 9755a88..624ab7c 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, Layer
 from orm.models import Layer_Version, Recipe, Machine, ProjectLayer
 import json
Signature · 1 line
2.1.4
#7 lore raw

PATCH 7/11 toaster: add header and docstings

In reply to Michael Wood

From: 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
index 624ab7c..1ed83dc 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
@@ -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
#8 lore raw

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

In reply to Michael Wood

From: 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
index 1ed83dc..723348d 100644
@@ -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
#9 lore raw

PATCH 9/11 toaster: fix test_get_json_call_returns_json again

In reply to Michael Wood

From: 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
index 723348d..d155849 100644
@@ -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
#10 lore raw

PATCH 10/11 toaster: fix pylint warning 'no space allowed'

In reply to Michael Wood

From: 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
index d155849..bc10801 100644
@@ -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
#11 lore raw

PATCH 11/11 toaster: reduced amount of instance attributes

In reply to Michael Wood

From: 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
index bc10801..93a85ac 100644
@@ -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