diff options
| -rw-r--r-- | bitbake/lib/toaster/toastergui/tests.py | 187 |
1 files changed, 182 insertions, 5 deletions
diff --git a/bitbake/lib/toaster/toastergui/tests.py b/bitbake/lib/toaster/toastergui/tests.py index 53012b43cd..5d15ac9478 100644 --- a/bitbake/lib/toaster/toastergui/tests.py +++ b/bitbake/lib/toaster/toastergui/tests.py | |||
| @@ -24,13 +24,21 @@ | |||
| 24 | import re | 24 | import re |
| 25 | 25 | ||
| 26 | from django.test import TestCase | 26 | from django.test import TestCase |
| 27 | from django.test.client import RequestFactory | ||
| 27 | from django.core.urlresolvers import reverse | 28 | from django.core.urlresolvers import reverse |
| 28 | from django.utils import timezone | 29 | from django.utils import timezone |
| 29 | from orm.models import Project, Release, BitbakeVersion, ProjectTarget | 30 | |
| 31 | from orm.models import Project, Release, BitbakeVersion, Build, Package | ||
| 30 | from orm.models import ReleaseLayerSourcePriority, LayerSource, Layer, Build | 32 | from orm.models import ReleaseLayerSourcePriority, LayerSource, Layer, Build |
| 31 | from orm.models import Layer_Version, Recipe, Machine, ProjectLayer, Target | 33 | from orm.models import Layer_Version, Recipe, Machine, ProjectLayer, Target |
| 34 | from orm.models import CustomImageRecipe | ||
| 35 | from orm.models import Branch | ||
| 36 | |||
| 37 | from toastergui.tables import SoftwareRecipesTable | ||
| 38 | from django.utils import timezone | ||
| 32 | import json | 39 | import json |
| 33 | from bs4 import BeautifulSoup | 40 | from bs4 import BeautifulSoup |
| 41 | import re | ||
| 34 | 42 | ||
| 35 | PROJECT_NAME = "test project" | 43 | PROJECT_NAME = "test project" |
| 36 | 44 | ||
| @@ -41,27 +49,58 @@ class ViewTests(TestCase): | |||
| 41 | bbv = BitbakeVersion.objects.create(name="test bbv", giturl="/tmp/", | 49 | bbv = BitbakeVersion.objects.create(name="test bbv", giturl="/tmp/", |
| 42 | branch="master", dirpath="") | 50 | branch="master", dirpath="") |
| 43 | release = Release.objects.create(name="test release", | 51 | release = Release.objects.create(name="test release", |
| 52 | branch_name="master", | ||
| 44 | bitbake_version=bbv) | 53 | bitbake_version=bbv) |
| 45 | self.project = Project.objects.create_project(name=PROJECT_NAME, | 54 | self.project = Project.objects.create_project(name=PROJECT_NAME, |
| 46 | release=release) | 55 | release=release) |
| 56 | now = timezone.now() | ||
| 57 | |||
| 58 | build = Build.objects.create(project=self.project, | ||
| 59 | started_on=now, | ||
| 60 | completed_on=now) | ||
| 61 | |||
| 47 | layersrc = LayerSource.objects.create(sourcetype=LayerSource.TYPE_IMPORTED) | 62 | layersrc = LayerSource.objects.create(sourcetype=LayerSource.TYPE_IMPORTED) |
| 48 | self.priority = ReleaseLayerSourcePriority.objects.create(release=release, | 63 | self.priority = ReleaseLayerSourcePriority.objects.create(release=release, |
| 49 | layer_source=layersrc) | 64 | layer_source=layersrc) |
| 50 | layer = Layer.objects.create(name="base-layer", layer_source=layersrc, | 65 | layer = Layer.objects.create(name="base-layer", layer_source=layersrc, |
| 51 | vcs_url="/tmp/") | 66 | vcs_url="/tmp/") |
| 52 | 67 | ||
| 68 | branch = Branch.objects.create(name="master", layer_source=layersrc) | ||
| 69 | |||
| 53 | lver = Layer_Version.objects.create(layer=layer, project=self.project, | 70 | lver = Layer_Version.objects.create(layer=layer, project=self.project, |
| 54 | layer_source=layersrc, commit="master") | 71 | layer_source=layersrc, commit="master", |
| 72 | up_branch=branch) | ||
| 55 | 73 | ||
| 56 | Recipe.objects.create(layer_source=layersrc, name="base-recipe", | 74 | self.recipe1 = Recipe.objects.create(layer_source=layersrc, |
| 57 | version="1.2", summary="one recipe", | 75 | name="base-recipe", |
| 58 | description="recipe", layer_version=lver) | 76 | version="1.2", |
| 77 | summary="one recipe", | ||
| 78 | description="recipe", | ||
| 79 | layer_version=lver) | ||
| 59 | 80 | ||
| 60 | Machine.objects.create(layer_version=lver, name="wisk", | 81 | Machine.objects.create(layer_version=lver, name="wisk", |
| 61 | description="wisking machine") | 82 | description="wisking machine") |
| 62 | 83 | ||
| 63 | ProjectLayer.objects.create(project=self.project, layercommit=lver) | 84 | ProjectLayer.objects.create(project=self.project, layercommit=lver) |
| 64 | 85 | ||
| 86 | |||
| 87 | self.customr = CustomImageRecipe.objects.create(\ | ||
| 88 | name="custom recipe", project=self.project, | ||
| 89 | base_recipe=self.recipe1) | ||
| 90 | |||
| 91 | self.package = Package.objects.create(name='pkg1', recipe=self.recipe1, | ||
| 92 | build=build) | ||
| 93 | |||
| 94 | |||
| 95 | # recipe with project for testing AvailableRecipe table | ||
| 96 | self.recipe2 = Recipe.objects.create(layer_source=layersrc, | ||
| 97 | name="fancy-recipe", | ||
| 98 | version="1.4", | ||
| 99 | summary="a fancy recipe", | ||
| 100 | description="fancy recipe", | ||
| 101 | layer_version=lver, | ||
| 102 | file_path='/home/foo') | ||
| 103 | |||
| 65 | self.assertTrue(lver in self.project.compatible_layerversions()) | 104 | self.assertTrue(lver in self.project.compatible_layerversions()) |
| 66 | 105 | ||
| 67 | def test_get_base_call_returns_html(self): | 106 | def test_get_base_call_returns_html(self): |
| @@ -183,6 +222,144 @@ class ViewTests(TestCase): | |||
| 183 | data = json.loads(response.content) | 222 | data = json.loads(response.content) |
| 184 | self.assertNotEqual(data["error"], "ok") | 223 | self.assertNotEqual(data["error"], "ok") |
| 185 | 224 | ||
| 225 | def test_custom_ok(self): | ||
| 226 | """Test successful return from ReST API xhr_customrecipe""" | ||
| 227 | url = reverse('xhr_customrecipe') | ||
| 228 | params = {'name': 'custom', 'project': self.project.id, | ||
| 229 | 'base': self.recipe1.id} | ||
| 230 | response = self.client.post(url, params) | ||
| 231 | self.assertEqual(response.status_code, 200) | ||
| 232 | data = json.loads(response.content) | ||
| 233 | self.assertEqual(data['error'], 'ok') | ||
| 234 | self.assertTrue('url' in data) | ||
| 235 | # get recipe from the database | ||
| 236 | recipe = CustomImageRecipe.objects.get(project=self.project, | ||
| 237 | name=params['name']) | ||
| 238 | args = (self.project.id, recipe.id,) | ||
| 239 | self.assertEqual(reverse('customrecipe', args=args), data['url']) | ||
| 240 | |||
| 241 | def test_custom_incomplete_params(self): | ||
| 242 | """Test not passing all required parameters to xhr_customrecipe""" | ||
| 243 | url = reverse('xhr_customrecipe') | ||
| 244 | for params in [{}, {'name': 'custom'}, | ||
| 245 | {'name': 'custom', 'project': self.project.id}]: | ||
| 246 | response = self.client.post(url, params) | ||
| 247 | self.assertEqual(response.status_code, 200) | ||
| 248 | data = json.loads(response.content) | ||
| 249 | self.assertNotEqual(data["error"], "ok") | ||
| 250 | |||
| 251 | def test_xhr_custom_wrong_project(self): | ||
| 252 | """Test passing wrong project id to xhr_customrecipe""" | ||
| 253 | url = reverse('xhr_customrecipe') | ||
| 254 | params = {'name': 'custom', 'project': 0, "base": self.recipe1.id} | ||
| 255 | response = self.client.post(url, params) | ||
| 256 | self.assertEqual(response.status_code, 200) | ||
| 257 | data = json.loads(response.content) | ||
| 258 | self.assertNotEqual(data["error"], "ok") | ||
| 259 | |||
| 260 | def test_xhr_custom_wrong_base(self): | ||
| 261 | """Test passing wrong base recipe id to xhr_customrecipe""" | ||
| 262 | url = reverse('xhr_customrecipe') | ||
| 263 | params = {'name': 'custom', 'project': self.project.id, "base": 0} | ||
| 264 | response = self.client.post(url, params) | ||
| 265 | self.assertEqual(response.status_code, 200) | ||
| 266 | data = json.loads(response.content) | ||
| 267 | self.assertNotEqual(data["error"], "ok") | ||
| 268 | |||
| 269 | def test_xhr_custom_details(self): | ||
| 270 | """Test getting custom recipe details""" | ||
| 271 | name = "custom recipe" | ||
| 272 | url = reverse('xhr_customrecipe_id', args=(self.customr.id,)) | ||
| 273 | response = self.client.get(url) | ||
| 274 | self.assertEqual(response.status_code, 200) | ||
| 275 | expected = {"error": "ok", | ||
| 276 | "info": {'id': self.customr.id, | ||
| 277 | 'name': name, | ||
| 278 | 'base_recipe_id': self.recipe1.id, | ||
| 279 | 'project_id': self.project.id, | ||
| 280 | } | ||
| 281 | } | ||
| 282 | self.assertEqual(json.loads(response.content), expected) | ||
| 283 | |||
| 284 | def test_xhr_custom_del(self): | ||
| 285 | """Test deleting custom recipe""" | ||
| 286 | name = "to be deleted" | ||
| 287 | recipe = CustomImageRecipe.objects.create(\ | ||
| 288 | name=name, project=self.project, | ||
| 289 | base_recipe=self.recipe1) | ||
| 290 | url = reverse('xhr_customrecipe_id', args=(recipe.id,)) | ||
| 291 | response = self.client.delete(url) | ||
| 292 | self.assertEqual(response.status_code, 200) | ||
| 293 | self.assertEqual(json.loads(response.content), {"error": "ok"}) | ||
| 294 | # try to delete not-existent recipe | ||
| 295 | url = reverse('xhr_customrecipe_id', args=(recipe.id,)) | ||
| 296 | response = self.client.delete(url) | ||
| 297 | self.assertEqual(response.status_code, 200) | ||
| 298 | self.assertNotEqual(json.loads(response.content)["error"], "ok") | ||
| 299 | |||
| 300 | def test_xhr_custom_packages(self): | ||
| 301 | """Test adding and deleting package to a custom recipe""" | ||
| 302 | url = reverse('xhr_customrecipe_packages', | ||
| 303 | args=(self.customr.id, self.package.id)) | ||
| 304 | # add self.package1 to recipe | ||
| 305 | response = self.client.put(url) | ||
| 306 | self.assertEqual(response.status_code, 200) | ||
| 307 | self.assertEqual(json.loads(response.content), {"error": "ok"}) | ||
| 308 | self.assertEqual(self.customr.packages.all()[0].id, self.package.id) | ||
| 309 | # delete it | ||
| 310 | response = self.client.delete(url) | ||
| 311 | self.assertEqual(response.status_code, 200) | ||
| 312 | self.assertEqual(json.loads(response.content), {"error": "ok"}) | ||
| 313 | self.assertFalse(self.customr.packages.all()) | ||
| 314 | # delete it again to test error condition | ||
| 315 | response = self.client.delete(url) | ||
| 316 | self.assertEqual(response.status_code, 200) | ||
| 317 | self.assertNotEqual(json.loads(response.content)["error"], "ok") | ||
| 318 | |||
| 319 | def test_xhr_custom_packages_err(self): | ||
| 320 | """Test error conditions of xhr_customrecipe_packages""" | ||
| 321 | # test calls with wrong recipe id and wrong package id | ||
| 322 | for args in [(0, self.package.id), (self.customr.id, 0)]: | ||
| 323 | url = reverse('xhr_customrecipe_packages', args=args) | ||
| 324 | # test put and delete methods | ||
| 325 | for method in (self.client.put, self.client.delete): | ||
| 326 | response = method(url) | ||
| 327 | self.assertEqual(response.status_code, 200) | ||
| 328 | self.assertNotEqual(json.loads(response.content), | ||
| 329 | {"error": "ok"}) | ||
| 330 | |||
| 331 | def test_software_recipes_table(self): | ||
| 332 | """Test structure returned for Software RecipesTable""" | ||
| 333 | table = SoftwareRecipesTable() | ||
| 334 | request = RequestFactory().get('/foo/', {'format': 'json'}) | ||
| 335 | response = table.get(request, pid=self.project.id) | ||
| 336 | data = json.loads(response.content) | ||
| 337 | |||
| 338 | rows = data['rows'] | ||
| 339 | row1 = next(x for x in rows if x['name'] == self.recipe1.name) | ||
| 340 | row1_btns = row1['static:add-del-layers'] | ||
| 341 | row1_btns_data = row1['add-del-layers'] | ||
| 342 | row2 = next(x for x in rows if x['name'] == self.recipe2.name) | ||
| 343 | row2_btns = row2['static:add-del-layers'] | ||
| 344 | row2_btns_data = row2['add-del-layers'] | ||
| 345 | |||
| 346 | self.assertEqual(response.status_code, 200, 'should be 200 OK status') | ||
| 347 | self.assertEqual(len(rows), 2, 'should be 2 recipes') | ||
| 348 | |||
| 349 | # check other columns have been populated correctly | ||
| 350 | self.assertEqual(row1['name'], self.recipe1.name) | ||
| 351 | self.assertEqual(row1['version'], self.recipe1.version) | ||
| 352 | self.assertEqual(row1['get_description_or_summary'], | ||
| 353 | self.recipe1.description) | ||
| 354 | self.assertEqual(row1['layer_version__layer__name'], | ||
| 355 | self.recipe1.layer_version.layer.name) | ||
| 356 | self.assertEqual(row2['name'], self.recipe2.name) | ||
| 357 | self.assertEqual(row2['version'], self.recipe2.version) | ||
| 358 | self.assertEqual(row2['get_description_or_summary'], | ||
| 359 | self.recipe2.description) | ||
| 360 | self.assertEqual(row2['layer_version__layer__name'], | ||
| 361 | self.recipe2.layer_version.layer.name) | ||
| 362 | |||
| 186 | class LandingPageTests(TestCase): | 363 | class LandingPageTests(TestCase): |
| 187 | """ Tests for redirects on the landing page """ | 364 | """ Tests for redirects on the landing page """ |
| 188 | # disable bogus pylint message error: | 365 | # disable bogus pylint message error: |
