diff --git a/InvenTree/part/fixtures/part.yaml b/InvenTree/part/fixtures/part.yaml index 7d669cf49d..3f7fbb9886 100644 --- a/InvenTree/part/fixtures/part.yaml +++ b/InvenTree/part/fixtures/part.yaml @@ -58,4 +58,4 @@ name: 'Bob' description: 'Can we build it?' assembly: true - \ No newline at end of file + purchaseable: false \ No newline at end of file diff --git a/InvenTree/stock/test_views.py b/InvenTree/stock/test_views.py new file mode 100644 index 0000000000..c640859ca2 --- /dev/null +++ b/InvenTree/stock/test_views.py @@ -0,0 +1,130 @@ +""" Unit tests for Stock views (see views.py) """ + +from django.test import TestCase +from django.urls import reverse +from django.contrib.auth import get_user_model + + +class StockViewTestCase(TestCase): + + fixtures = [ + 'category', + 'part', + 'company', + 'location', + 'supplier_part', + 'stock', + ] + + 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') + + +class StockListTest(StockViewTestCase): + """ Tests for Stock list views """ + + def test_stock_index(self): + response = self.client.get(reverse('stock-index')) + self.assertEqual(response.status_code, 200) + + +class StockLocationTest(StockViewTestCase): + """ Tests for StockLocation views """ + + def test_location_edit(self): + response = self.client.get(reverse('stock-location-edit', args=(1,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + def test_qr_code(self): + # Request the StockLocation QR view + response = self.client.get(reverse('stock-location-qr', args=(1,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # Test for an invalid StockLocation + response = self.client.get(reverse('stock-location-qr', args=(999,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + def test_create(self): + # Test StockLocation creation view + response = self.client.get(reverse('stock-location-create'), HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # Create with a parent + response = self.client.get(reverse('stock-location-create'), {'location': 1}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # Create with an invalid parent + response = self.client.get(reverse('stock-location-create'), {'location': 999}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + +class StockItemTest(StockViewTestCase): + """" Tests for StockItem views """ + + def test_qr_code(self): + # QR code for a valid item + response = self.client.get(reverse('stock-item-qr', args=(1,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # QR code for an invalid item + response = self.client.get(reverse('stock-item-qr', args=(9999,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + data = str(response.content) + self.assertIn('Error:', data) + + def test_adjust_items(self): + url = reverse('stock-adjust') + + # Move items + response = self.client.get(url, {'stock[]': [1,2,3,4,5], 'action': 'move'}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # Count part + response = self.client.get(url, {'part': 1}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # Remove items + response = self.client.get(url, {'location': 1, 'action': 'take'}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # Add items + response = self.client.get(url, {'item': 1, 'action': 'add'}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # Blank response + response = self.client.get(url, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # TODO - Tests for POST data + + def test_edit_item(self): + # Test edit view for StockItem + response = self.client.get(reverse('stock-item-edit', args=(1,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # Test with a non-purchaseable part + response = self.client.get(reverse('stock-item-edit', args=(100,)), HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + def test_create_item(self): + # Test creation of StockItem + response = self.client.get(reverse('stock-item-create'), {'part': 1}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + response = self.client.get(reverse('stock-item-create'), {'part': 999}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # Copy from a valid item, valid location + response = self.client.get(reverse('stock-item-create'), {'location': 1, 'copy': 1}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) + + # Copy from an invalid item, invalid location + response = self.client.get(reverse('stock-item-create'), {'location': 999, 'copy': 9999}, HTTP_X_REQUESTED_WITH='XMLHttpRequest') + self.assertEqual(response.status_code, 200) \ No newline at end of file diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py index 6fbea9d885..3d36eb91b9 100644 --- a/InvenTree/stock/views.py +++ b/InvenTree/stock/views.py @@ -168,9 +168,9 @@ class StockAdjust(AjaxView, FormMixin): elif 'item' in self.request.GET: items = [StockItem.objects.get(id=self.request.GET.get('item'))] - # Unsupported query + # Unsupported query (no items) else: - items = None + items = [] for item in items: