[Toaster] [review-request][PATCH 3/3] toaster: Add tests for /project/X/builds page
Elliot Smith
elliot.smith at intel.com
Wed Sep 2 09:04:13 PDT 2015
Add tests to check whether "in progress" builds are filtered
out correctly, and that only builds for the current project
are shown.
Adds a dependency on BeautifulSoup 4, which is used to simplify
writing tests which verify the HTML.
[YOCTO #8236]
Signed-off-by: Elliot Smith <elliot.smith at intel.com>
---
bitbake/lib/toaster/toastergui/tests.py | 91 ++++++++++++++++++++++++++++++++-
bitbake/toaster-requirements.txt | 1 +
2 files changed, 90 insertions(+), 2 deletions(-)
diff --git a/bitbake/lib/toaster/toastergui/tests.py b/bitbake/lib/toaster/toastergui/tests.py
index 85e27fe..6c2235f 100644
--- a/bitbake/lib/toaster/toastergui/tests.py
+++ b/bitbake/lib/toaster/toastergui/tests.py
@@ -23,10 +23,12 @@
from django.test import TestCase
from django.core.urlresolvers import reverse
-from orm.models import Project, Release, BitbakeVersion
-from orm.models import ReleaseLayerSourcePriority, LayerSource, Layer
+from django.utils import timezone
+from orm.models import Project, Release, BitbakeVersion, ProjectTarget
+from orm.models import ReleaseLayerSourcePriority, LayerSource, Layer, Build
from orm.models import Layer_Version, Recipe, Machine, ProjectLayer
import json
+from bs4 import BeautifulSoup
PROJECT_NAME = "test project"
@@ -178,3 +180,88 @@ class ViewTests(TestCase):
response = self.client.post(reverse('xhr_importlayer'), args)
data = json.loads(response.content)
self.assertNotEqual(data["error"], "ok")
+
+class ProjectBuildsDisplayTest(TestCase):
+ """ Test data at /project/X/builds is displayed correctly """
+
+ def setUp(self):
+ bbv = BitbakeVersion.objects.create(name="bbv1", giturl="/tmp/",
+ branch="master", dirpath="")
+ release = Release.objects.create(name="release1",
+ bitbake_version=bbv)
+ self.project1 = Project.objects.create_project(name=PROJECT_NAME,
+ release=release)
+ self.project2 = Project.objects.create_project(name=PROJECT_NAME,
+ release=release)
+
+ # parameters for builds to associate with the projects
+ now = timezone.now()
+
+ self.project1_build_success = {
+ "project": self.project1,
+ "started_on": now,
+ "completed_on": now,
+ "outcome": Build.SUCCEEDED
+ }
+
+ self.project1_build_in_progress = {
+ "project": self.project1,
+ "started_on": now,
+ "completed_on": now,
+ "outcome": Build.IN_PROGRESS
+ }
+
+ self.project2_build_success = {
+ "project": self.project2,
+ "started_on": now,
+ "completed_on": now,
+ "outcome": Build.SUCCEEDED
+ }
+
+ self.project2_build_in_progress = {
+ "project": self.project2,
+ "started_on": now,
+ "completed_on": now,
+ "outcome": Build.IN_PROGRESS
+ }
+
+ def _get_rows_for_project(self, project_id):
+ url = reverse("projectbuilds", args=(project_id,))
+ response = self.client.get(url, follow=True)
+ soup = BeautifulSoup(response.content)
+ return soup.select('tr[class="data"]')
+
+ def test_show_builds_for_project(self):
+ """ Builds for a project should be displayed """
+ build1a = Build.objects.create(**self.project1_build_success)
+ build1b = Build.objects.create(**self.project1_build_success)
+ build_rows = self._get_rows_for_project(self.project1.id)
+ self.assertEqual(len(build_rows), 2)
+
+ def test_show_builds_for_project_only(self):
+ """ Builds for other projects should be excluded """
+ build1a = Build.objects.create(**self.project1_build_success)
+ build1b = Build.objects.create(**self.project1_build_success)
+ build1c = Build.objects.create(**self.project1_build_success)
+
+ # shouldn't see these two
+ build2a = Build.objects.create(**self.project2_build_success)
+ build2b = Build.objects.create(**self.project2_build_in_progress)
+
+ build_rows = self._get_rows_for_project(self.project1.id)
+ self.assertEqual(len(build_rows), 3)
+
+ def test_show_builds_exclude_in_progress(self):
+ """ "in progress" builds should not be shown """
+ build1a = Build.objects.create(**self.project1_build_success)
+ build1b = Build.objects.create(**self.project1_build_success)
+
+ # shouldn't see this one
+ build1c = Build.objects.create(**self.project1_build_in_progress)
+
+ # shouldn't see these two either, as they belong to a different project
+ build2a = Build.objects.create(**self.project2_build_success)
+ build2b = Build.objects.create(**self.project2_build_in_progress)
+
+ build_rows = self._get_rows_for_project(self.project1.id)
+ self.assertEqual(len(build_rows), 2)
diff --git a/bitbake/toaster-requirements.txt b/bitbake/toaster-requirements.txt
index 19b5293..1d7d21b 100644
--- a/bitbake/toaster-requirements.txt
+++ b/bitbake/toaster-requirements.txt
@@ -2,3 +2,4 @@ Django==1.6
South==0.8.4
argparse==1.2.1
wsgiref==0.1.2
+beautifulsoup4>=4.4.0
--
Elliot Smith
Software Engineer
Intel OTC
---------------------------------------------------------------------
Intel Corporation (UK) Limited
Registered No. 1134945 (England)
Registered Office: Pipers Way, Swindon SN3 1RJ
VAT No: 860 2173 47
This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.
More information about the toaster
mailing list