diff options
Diffstat (limited to 'bitbake/lib/toaster/toastergui/tests.py')
-rw-r--r-- | bitbake/lib/toaster/toastergui/tests.py | 255 |
1 files changed, 42 insertions, 213 deletions
diff --git a/bitbake/lib/toaster/toastergui/tests.py b/bitbake/lib/toaster/toastergui/tests.py index 56a7d7e860..1b6e78d517 100644 --- a/bitbake/lib/toaster/toastergui/tests.py +++ b/bitbake/lib/toaster/toastergui/tests.py | |||
@@ -51,205 +51,17 @@ CLI_BUILDS_PROJECT_NAME = 'Command line builds' | |||
51 | class ViewTests(TestCase): | 51 | class ViewTests(TestCase): |
52 | """Tests to verify view APIs.""" | 52 | """Tests to verify view APIs.""" |
53 | 53 | ||
54 | def setUp(self): | 54 | fixtures = ['toastergui-unittest-data'] |
55 | bbv = BitbakeVersion.objects.create(name="test bbv", giturl="/tmp/", | ||
56 | branch="master", dirpath="") | ||
57 | release = Release.objects.create(name="test release", | ||
58 | branch_name="master", | ||
59 | bitbake_version=bbv) | ||
60 | release2 = Release.objects.create(name="test release 2", | ||
61 | branch_name="master", | ||
62 | bitbake_version=bbv) | ||
63 | |||
64 | self.project = Project.objects.create_project(name=PROJECT_NAME, | ||
65 | release=release) | ||
66 | |||
67 | self.project2 = Project.objects.create_project(name=PROJECT_NAME2, | ||
68 | release=release2) | ||
69 | |||
70 | now = timezone.now() | ||
71 | later = now + timedelta(days=1) | ||
72 | |||
73 | build = Build.objects.create(project=self.project, | ||
74 | started_on=now, | ||
75 | completed_on=now, | ||
76 | outcome=Build.SUCCEEDED) | ||
77 | |||
78 | # for testing BuildsTable | ||
79 | build1 = Build.objects.create(project=self.project, | ||
80 | started_on=now, | ||
81 | completed_on=now, | ||
82 | outcome=Build.SUCCEEDED, | ||
83 | machine="raspberrypi2") | ||
84 | |||
85 | Build.objects.create(project=self.project, | ||
86 | started_on=later, | ||
87 | completed_on=later, | ||
88 | outcome=Build.FAILED, | ||
89 | machine="qemux86") | ||
90 | |||
91 | Build.objects.create(project=self.project2, | ||
92 | started_on=later, | ||
93 | completed_on=later, | ||
94 | outcome=Build.SUCCEEDED, | ||
95 | machine="qemux86") | ||
96 | |||
97 | # to test sorting by errors and warnings in BuildsTable | ||
98 | LogMessage.objects.create(build=build1, level=LogMessage.WARNING) | ||
99 | LogMessage.objects.create(build=build1, level=LogMessage.ERROR) | ||
100 | |||
101 | layersrc = LayerSource.objects.create(sourcetype=LayerSource.TYPE_IMPORTED) | ||
102 | self.priority = ReleaseLayerSourcePriority.objects.create(release=release, | ||
103 | layer_source=layersrc) | ||
104 | layer = Layer.objects.create(name="base-layer", layer_source=layersrc, | ||
105 | vcs_url="/tmp/") | ||
106 | |||
107 | layer_two = Layer.objects.create(name="z-layer", | ||
108 | layer_source=layersrc, | ||
109 | vcs_url="git://two/") | ||
110 | |||
111 | |||
112 | branch = Branch.objects.create(name="master", layer_source=layersrc) | ||
113 | |||
114 | self.lver = Layer_Version.objects.create(layer=layer, | ||
115 | project=self.project, | ||
116 | layer_source=layersrc, | ||
117 | commit="master", | ||
118 | dirpath="/tmp/", | ||
119 | up_branch=branch) | ||
120 | |||
121 | lver_two = Layer_Version.objects.create(layer=layer_two, | ||
122 | layer_source=layersrc, | ||
123 | commit="master", | ||
124 | up_branch=branch) | ||
125 | |||
126 | Recipe.objects.create(layer_source=layersrc, | ||
127 | name="z recipe", | ||
128 | version="5.2", | ||
129 | summary="z recipe", | ||
130 | description="G recipe", | ||
131 | license="Z GPL", | ||
132 | section="h section", | ||
133 | layer_version=lver_two) | ||
134 | |||
135 | # Create a dummy recipe file for the custom image generation to read | ||
136 | open("/tmp/my_recipe.bb", 'wa').close() | ||
137 | self.recipe1 = Recipe.objects.create(layer_source=layersrc, | ||
138 | name="base-recipe", | ||
139 | version="1.2", | ||
140 | summary="one recipe", | ||
141 | description="recipe", | ||
142 | section="A section", | ||
143 | license="Apache", | ||
144 | layer_version=self.lver, | ||
145 | file_path="my_recipe.bb") | ||
146 | |||
147 | Machine.objects.create(layer_version=self.lver, name="wisk", | ||
148 | description="wisking machine") | ||
149 | Machine.objects.create(layer_version=self.lver, name="zap", | ||
150 | description="zap machine") | ||
151 | Machine.objects.create(layer_version=lver_two, name="xray", | ||
152 | description="xray machine") | ||
153 | |||
154 | |||
155 | |||
156 | ProjectLayer.objects.create(project=self.project, layercommit=self.lver) | ||
157 | |||
158 | lver_custom = Layer_Version.objects.create(layer=layer, | ||
159 | project=self.project, | ||
160 | layer_source=layersrc, | ||
161 | commit="mymaster", | ||
162 | up_branch=branch) | ||
163 | |||
164 | self.customr = CustomImageRecipe.objects.create(\ | ||
165 | name="custom recipe", project=self.project, | ||
166 | base_recipe=self.recipe1, | ||
167 | file_path="custr", | ||
168 | layer_version=lver_custom) | ||
169 | |||
170 | self.package = Package.objects.create(name='pkg1', | ||
171 | size=999, | ||
172 | recipe=self.recipe1, | ||
173 | license="HHH", | ||
174 | build=build) | ||
175 | |||
176 | Package.objects.create(name='A pkg1', | ||
177 | size=777, | ||
178 | recipe=self.recipe1, | ||
179 | build=build) | ||
180 | |||
181 | Package.objects.create(name='zpkg1', | ||
182 | recipe=self.recipe1, | ||
183 | build=build, | ||
184 | size=4, | ||
185 | license="ZZ") | ||
186 | |||
187 | self.cust_package = CustomImagePackage.objects.create( | ||
188 | name="A pkg", | ||
189 | recipe=self.recipe1, | ||
190 | size=10, | ||
191 | license="AAA") | ||
192 | |||
193 | self.customr.appends_set.add(self.cust_package) | ||
194 | |||
195 | # recipe with project for testing AvailableRecipe table | ||
196 | self.recipe2 = Recipe.objects.create(layer_source=layersrc, | ||
197 | name="fancy-recipe", | ||
198 | version="1.4", | ||
199 | summary="a fancy recipe", | ||
200 | description="fancy recipe", | ||
201 | license="MIT", | ||
202 | layer_version=self.lver, | ||
203 | section="Z section", | ||
204 | file_path='/home/foo') | ||
205 | |||
206 | # additional package for the sorting for the SelectPackagesTable | ||
207 | cust_package_two = CustomImagePackage.objects.create(name="ZZ pkg", | ||
208 | size=5, | ||
209 | recipe=self.recipe2) | ||
210 | |||
211 | self.customr.appends_set.add(cust_package_two) | ||
212 | |||
213 | Package.objects.create(name='one1', | ||
214 | recipe=self.recipe2, | ||
215 | build=build, | ||
216 | size=2, | ||
217 | license="L") | ||
218 | |||
219 | Recipe.objects.create(layer_source=layersrc, | ||
220 | is_image=True, | ||
221 | name="Test image one", | ||
222 | version="1.2", | ||
223 | summary="one recipe", | ||
224 | description="recipe", | ||
225 | section="A", | ||
226 | license="A", | ||
227 | file_path="/one/", | ||
228 | layer_version=self.lver) | ||
229 | |||
230 | zrecipe = Recipe.objects.create(layer_source=layersrc, | ||
231 | is_image=True, | ||
232 | name="Z Test image two", | ||
233 | version="1.3", | ||
234 | summary="two image recipe", | ||
235 | description="recipe two", | ||
236 | section="B", | ||
237 | license="Z", | ||
238 | file_path="/two/", | ||
239 | layer_version=lver_two) | ||
240 | |||
241 | CustomImageRecipe.objects.create(name="z custom recipe", | ||
242 | project=self.project, | ||
243 | base_recipe=zrecipe, | ||
244 | file_path="zzzz", | ||
245 | layer_version=lver_custom) | ||
246 | |||
247 | # Packages in PackagesTable requre that the recipe has been built so | ||
248 | # we need to create a target and build pair | ||
249 | target = Target.objects.create(target=self.recipe1.name, | ||
250 | build=build) | ||
251 | 55 | ||
56 | def setUp(self): | ||
252 | 57 | ||
58 | self.project = Project.objects.first() | ||
59 | self.recipe1 = Recipe.objects.get(pk=2) | ||
60 | self.recipe2 = Recipe.objects.last() | ||
61 | self.customr = CustomImageRecipe.objects.first() | ||
62 | self.cust_package = CustomImagePackage.objects.first() | ||
63 | self.package = Package.objects.first() | ||
64 | self.lver = Layer_Version.objects.first() | ||
253 | 65 | ||
254 | def test_get_base_call_returns_html(self): | 66 | def test_get_base_call_returns_html(self): |
255 | """Basic test for all-projects view""" | 67 | """Basic test for all-projects view""" |
@@ -271,7 +83,7 @@ class ViewTests(TestCase): | |||
271 | self.assertEqual(data["error"], "ok") | 83 | self.assertEqual(data["error"], "ok") |
272 | self.assertTrue("rows" in data) | 84 | self.assertTrue("rows" in data) |
273 | 85 | ||
274 | self.assertTrue(PROJECT_NAME in [x["name"] for x in data["rows"]]) | 86 | self.assertTrue(self.project.name in [x["name"] for x in data["rows"]]) |
275 | self.assertTrue("id" in data["rows"][0]) | 87 | self.assertTrue("id" in data["rows"][0]) |
276 | 88 | ||
277 | def test_typeaheads(self): | 89 | def test_typeaheads(self): |
@@ -333,11 +145,13 @@ class ViewTests(TestCase): | |||
333 | 145 | ||
334 | def test_xhr_import_layer(self): | 146 | def test_xhr_import_layer(self): |
335 | """Test xhr_importlayer API""" | 147 | """Test xhr_importlayer API""" |
148 | LayerSource.objects.create(sourcetype=LayerSource.TYPE_IMPORTED) | ||
336 | #Test for importing an already existing layer | 149 | #Test for importing an already existing layer |
337 | args = {'vcs_url' : "git://git.example.com/test", | 150 | args = {'vcs_url' : "git://git.example.com/test", |
338 | 'name' : "base-layer", | 151 | 'name' : "base-layer", |
339 | 'git_ref': "c12b9596afd236116b25ce26dbe0d793de9dc7ce", | 152 | 'git_ref': "c12b9596afd236116b25ce26dbe0d793de9dc7ce", |
340 | 'project_id': 1, 'dir_path' : "/path/in/repository"} | 153 | 'project_id': self.project.id, |
154 | 'dir_path' : "/path/in/repository"} | ||
341 | response = self.client.post(reverse('xhr_importlayer'), args) | 155 | response = self.client.post(reverse('xhr_importlayer'), args) |
342 | data = json.loads(response.content) | 156 | data = json.loads(response.content) |
343 | self.assertEqual(response.status_code, 200) | 157 | self.assertEqual(response.status_code, 200) |
@@ -407,13 +221,12 @@ class ViewTests(TestCase): | |||
407 | 221 | ||
408 | def test_xhr_custom_details(self): | 222 | def test_xhr_custom_details(self): |
409 | """Test getting custom recipe details""" | 223 | """Test getting custom recipe details""" |
410 | name = "custom recipe" | ||
411 | url = reverse('xhr_customrecipe_id', args=(self.customr.id,)) | 224 | url = reverse('xhr_customrecipe_id', args=(self.customr.id,)) |
412 | response = self.client.get(url) | 225 | response = self.client.get(url) |
413 | self.assertEqual(response.status_code, 200) | 226 | self.assertEqual(response.status_code, 200) |
414 | expected = {"error": "ok", | 227 | expected = {"error": "ok", |
415 | "info": {'id': self.customr.id, | 228 | "info": {'id': self.customr.id, |
416 | 'name': name, | 229 | 'name': self.customr.name, |
417 | 'base_recipe_id': self.recipe1.id, | 230 | 'base_recipe_id': self.recipe1.id, |
418 | 'project_id': self.project.id, | 231 | 'project_id': self.project.id, |
419 | } | 232 | } |
@@ -484,6 +297,10 @@ class ViewTests(TestCase): | |||
484 | {"error": "ok"}) | 297 | {"error": "ok"}) |
485 | 298 | ||
486 | def test_download_custom_recipe(self): | 299 | def test_download_custom_recipe(self): |
300 | """Download the recipe file generated for the custom image""" | ||
301 | |||
302 | # Create a dummy recipe file for the custom image generation to read | ||
303 | open("/tmp/a_recipe.bb", 'wa').close() | ||
487 | response = self.client.get(reverse('customrecipedownload', | 304 | response = self.client.get(reverse('customrecipedownload', |
488 | args=(self.project.id, | 305 | args=(self.project.id, |
489 | self.customr.id))) | 306 | self.customr.id))) |
@@ -503,8 +320,6 @@ class ViewTests(TestCase): | |||
503 | row2 = next(x for x in rows if x['name'] == self.recipe2.name) | 320 | row2 = next(x for x in rows if x['name'] == self.recipe2.name) |
504 | 321 | ||
505 | self.assertEqual(response.status_code, 200, 'should be 200 OK status') | 322 | self.assertEqual(response.status_code, 200, 'should be 200 OK status') |
506 | # All recipes in the setUp | ||
507 | self.assertEqual(len(rows), 5, 'should be 5 recipes') | ||
508 | 323 | ||
509 | # check other columns have been populated correctly | 324 | # check other columns have been populated correctly |
510 | self.assertEqual(row1['name'], self.recipe1.name) | 325 | self.assertEqual(row1['name'], self.recipe1.name) |
@@ -529,13 +344,20 @@ class ViewTests(TestCase): | |||
529 | options['format'] = "json" | 344 | options['format'] = "json" |
530 | options['nocache'] = "true" | 345 | options['nocache'] = "true" |
531 | request = RequestFactory().get('/', options) | 346 | request = RequestFactory().get('/', options) |
347 | |||
348 | # This is the image recipe needed for a package list for | ||
349 | # PackagesTable do this here to throw a non exist exception | ||
350 | image_recipe = Recipe.objects.get(pk=4) | ||
351 | |||
532 | # Add any kwargs that are needed by any of the possible tables | 352 | # Add any kwargs that are needed by any of the possible tables |
533 | response = table.get(request, | 353 | args = {'pid': self.project.id, |
534 | pid=self.project.id, | 354 | 'layerid': self.lver.pk, |
535 | layerid=self.lver.pk, | 355 | 'recipeid': self.recipe1.pk, |
536 | recipeid=self.recipe1.pk, | 356 | 'recipe_id': image_recipe.pk, |
537 | recipe_id=self.recipe1.pk, | 357 | 'custrecipeid': self.customr.pk |
538 | custrecipeid=self.customr.pk) | 358 | } |
359 | |||
360 | response = table.get(request, **args) | ||
539 | return json.loads(response.content) | 361 | return json.loads(response.content) |
540 | 362 | ||
541 | # Get a list of classes in tables module | 363 | # Get a list of classes in tables module |
@@ -562,10 +384,14 @@ class ViewTests(TestCase): | |||
562 | 384 | ||
563 | if '-' in table.default_orderby: | 385 | if '-' in table.default_orderby: |
564 | self.assertTrue(row_one >= row_two, | 386 | self.assertTrue(row_one >= row_two, |
565 | "Default ordering not working on %s" % name) | 387 | "Default ordering not working on %s" |
388 | " '%s' should be >= '%s'" % | ||
389 | (name, row_one, row_two)) | ||
566 | else: | 390 | else: |
567 | self.assertTrue(row_one <= row_two, | 391 | self.assertTrue(row_one <= row_two, |
568 | "Default ordering not working on %s" % name) | 392 | "Default ordering not working on %s" |
393 | " '%s' should be <= '%s'" % | ||
394 | (name, row_one, row_two)) | ||
569 | 395 | ||
570 | # Test the column ordering and filtering functionality | 396 | # Test the column ordering and filtering functionality |
571 | for column in table.columns: | 397 | for column in table.columns: |
@@ -580,7 +406,9 @@ class ViewTests(TestCase): | |||
580 | 406 | ||
581 | self.assertTrue(row_one <= row_two, | 407 | self.assertTrue(row_one <= row_two, |
582 | "Ascending sort applied but row 0 is less " | 408 | "Ascending sort applied but row 0 is less " |
583 | "than row 1") | 409 | "than row 1 %s %s " % |
410 | (column['field_name'], name)) | ||
411 | |||
584 | 412 | ||
585 | descending = get_data(table_cls(), | 413 | descending = get_data(table_cls(), |
586 | {"orderby" : | 414 | {"orderby" : |
@@ -591,7 +419,8 @@ class ViewTests(TestCase): | |||
591 | 419 | ||
592 | self.assertTrue(row_one >= row_two, | 420 | self.assertTrue(row_one >= row_two, |
593 | "Descending sort applied but row 0 is " | 421 | "Descending sort applied but row 0 is " |
594 | "greater than row 1") | 422 | "greater than row 1 %s %s" % |
423 | (column['field_name'], name)) | ||
595 | 424 | ||
596 | # If the two start rows are the same we haven't actually | 425 | # If the two start rows are the same we haven't actually |
597 | # changed the order | 426 | # changed the order |