diff --git a/InvenTree/build/tests.py b/InvenTree/build/tests.py index 36e8223a9b..6816b93fcd 100644 --- a/InvenTree/build/tests.py +++ b/InvenTree/build/tests.py @@ -2,6 +2,13 @@ from __future__ import unicode_literals from django.test import TestCase +from django.urls import reverse +from django.contrib.auth import get_user_model + +from rest_framework.test import APITestCase +from rest_framework import status + +import json from .models import Build from part.models import Part @@ -11,23 +18,20 @@ from InvenTree.status_codes import BuildStatus class BuildTestSimple(TestCase): + fixtures = [ + 'category', + 'part', + 'location', + 'build', + ] + def setUp(self): - part = Part.objects.create(name='Test part', - description='Simple description') + # Create a user for auth + User = get_user_model() + User.objects.create_user('testuser', 'test@testing.com', 'password') - Build.objects.create(part=part, - batch='B1', - status=BuildStatus.PENDING, - title='Building 7 parts', - quantity=7, - notes='Some simple notes') - - Build.objects.create(part=part, - batch='B2', - status=BuildStatus.COMPLETE, - title='Building 21 parts', - quantity=21, - notes='Some simple notes') + self.user = User.objects.get(username='testuser') + self.client.login(username='testuser', password='password') def test_build_objects(self): # Ensure the Build objects were correctly created @@ -36,7 +40,7 @@ class BuildTestSimple(TestCase): self.assertEqual(b.batch, 'B2') self.assertEqual(b.quantity, 21) - self.assertEqual(str(b), 'Build 21 x Test part - Simple description') + self.assertEqual(str(b), 'Build 21 x Orphan - A part without a category') def test_url(self): b1 = Build.objects.get(pk=1) @@ -62,13 +66,183 @@ class BuildTestSimple(TestCase): # TODO - Generate BOM for test part pass - def cancel_build(self): + def test_cancel_build(self): """ Test build cancellation function """ build = Build.objects.get(id=1) self.assertEqual(build.status, BuildStatus.PENDING) - build.cancelBuild() + build.cancelBuild(self.user) self.assertEqual(build.status, BuildStatus.CANCELLED) + + + +class TestBuildAPI(APITestCase): + """ + Series of tests for the Build DRF API + - Tests for Build API + - Tests for BuildItem API + """ + + fixtures = [ + 'category', + 'part', + 'location', + 'build', + ] + + def setUp(self): + # Create a user for auth + User = get_user_model() + User.objects.create_user('testuser', 'test@testing.com', 'password') + + self.client.login(username='testuser', password='password') + + def test_get_build_list(self): + """ Test that we can retrieve list of build objects """ + url = reverse('api-build-list') + response = self.client.get(url, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_get_build_item_list(self): + """ Test that we can retrieve list of BuildItem objects """ + url = reverse('api-build-item-list') + + response = self.client.get(url, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + # Test again, filtering by park ID + response = self.client.get(url, {'part': '1'}, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + +class TestBuildViews(TestCase): + """ Tests for Build app views """ + + fixtures = [ + 'category', + 'part', + 'location', + 'build', + ] + + def setUp(self): + super().setUp() + + # Create a user + User = get_user_model() + User.objects.create_user('username', 'user@email.com', 'password') + + self.client.login(username='username', password='password') + + def test_build_index(self): + """ test build index view """ + + response = self.client.get(reverse('build-index')) + self.assertEqual(response.status_code, 200) + + content = str(response.content) + + # Content should contain build titles + for build in Build.objects.all(): + self.assertIn(build.title, content) + + def test_build_detail(self): + """ Test the detail view for a Build object """ + + pk = 1 + + response = self.client.get(reverse('build-detail', args=(pk,))) + self.assertEqual(response.status_code, 200) + + build = Build.objects.get(pk=pk) + + content = str(response.content) + + self.assertIn(build.title, content) + + def test_build_create(self): + """ Test the build creation view (ajax form) """ + + url = reverse('build-create') + + # Create build without specifying part + response = self.client.get(url, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # Create build with valid part + response = self.client.get(url, {'part': 1}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # Create build with invalid part + response = self.client.get(url, {'part': 9999}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + def test_build_allocate(self): + """ Test the part allocation view for a Build """ + + url = reverse('build-allocate', args=(1,)) + + # Get the page normally + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + + # Get the page in editing mode + response = self.client.get(url, {'edit': 1}) + self.assertEqual(response.status_code, 200) + + def test_build_item_create(self): + """ Test the BuildItem creation view (ajax form) """ + + url = reverse('build-item-create') + + # Try without a part specified + response = self.client.get(url, {'build': 1,}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # Try with an invalid build ID + response = self.client.get(url, {'build': 9999,}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # Try with a valid part specified + response = self.client.get(url, {'build': 1, 'part': 1}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # Try with an invalid part specified + response = self.client.get(url, {'build': 1, 'part': 9999}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + def test_build_item_edit(self): + """ Test the BuildItem edit view (ajax form) """ + + # TODO + # url = reverse('build-item-edit') + pass + + def test_build_cancel(self): + """ Test the build cancellation form """ + + url = reverse('build-cancel', args=(1,)) + + # Test without confirmation + response = self.client.post(url, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + data = json.loads(response.content) + + self.assertFalse(data['form_valid']) + + b = Build.objects.get(pk=1) + self.assertEqual(b.status, 10) # Build status is still PENDING + + # Test with confirmation + response = self.client.post(url, {'confirm_cancel': 1}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + data = json.loads(response.content) + self.assertTrue(data['form_valid']) + + b = Build.objects.get(pk=1) + self.assertEqual(b.status, 30) # Build status is now CANCELLED \ No newline at end of file