From 34dbfe6d28cde72c21f26b93433f61b76e20570a Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Wed, 3 Feb 2021 23:16:23 +1100 Subject: [PATCH] Test troublesome migration 0019 --- .../migrations/0019_auto_20200413_0642.py | 62 ++++++++------ InvenTree/company/test_migrations.py | 80 +++++++++++++++++++ 2 files changed, 119 insertions(+), 23 deletions(-) create mode 100644 InvenTree/company/test_migrations.py diff --git a/InvenTree/company/migrations/0019_auto_20200413_0642.py b/InvenTree/company/migrations/0019_auto_20200413_0642.py index 509c45aaa2..2bd059edb9 100644 --- a/InvenTree/company/migrations/0019_auto_20200413_0642.py +++ b/InvenTree/company/migrations/0019_auto_20200413_0642.py @@ -1,14 +1,21 @@ # Generated by Django 2.2.10 on 2020-04-13 06:42 +import sys import os from rapidfuzz import fuzz from django.db import migrations, connection from django.db.utils import OperationalError, ProgrammingError +""" +When this migration is tested by CI, it cannot accept user input. +So a simplified version of the migration is implemented. +""" +TESTING = 'test' in sys.argv def clear(): - os.system('cls' if os.name == 'nt' else 'clear') + if not TESTING: + os.system('cls' if os.name == 'nt' else 'clear') def reverse_association(apps, schema_editor): @@ -222,23 +229,31 @@ def associate_manufacturers(apps, schema_editor): clear() # Present a list of options - print("----------------------------------") + if not TESTING: + print("----------------------------------") + print("Checking part [{pk}] ({idx} of {total})".format(pk=part_id, idx=idx+1, total=total)) - print("Manufacturer name: '{n}'".format(n=name)) - print("----------------------------------") - print("Select an option from the list below:") + + if not TESTING: + print("Manufacturer name: '{n}'".format(n=name)) + print("----------------------------------") + print("Select an option from the list below:") - print("0) - Create new manufacturer '{n}'".format(n=name)) - print("") + print("0) - Create new manufacturer '{n}'".format(n=name)) + print("") - for i, m in enumerate(matches[:10]): - print("{i}) - Use manufacturer '{opt}'".format(i=i+1, opt=m)) + for i, m in enumerate(matches[:10]): + print("{i}) - Use manufacturer '{opt}'".format(i=i+1, opt=m)) - print("") - print("OR - Type a new custom manufacturer name") + print("") + print("OR - Type a new custom manufacturer name") while True: - response = str(input("> ")).strip() + if TESTING: + # When running unit tests, simply select the name of the part + response = '0' + else: + response = str(input("> ")).strip() # Attempt to parse user response as an integer try: @@ -300,18 +315,19 @@ def associate_manufacturers(apps, schema_editor): print("") clear() - print("---------------------------------------") - print("The SupplierPart model needs to be migrated,") - print("as the new 'manufacturer' field maps to a 'Company' reference.") - print("The existing 'manufacturer_name' field will be used to match") - print("against possible companies.") - print("This process requires user input.") - print("") - print("Note: This process MUST be completed to migrate the database.") - print("---------------------------------------") - print("") + if not TESTING: + print("---------------------------------------") + print("The SupplierPart model needs to be migrated,") + print("as the new 'manufacturer' field maps to a 'Company' reference.") + print("The existing 'manufacturer_name' field will be used to match") + print("against possible companies.") + print("This process requires user input.") + print("") + print("Note: This process MUST be completed to migrate the database.") + print("---------------------------------------") + print("") - input("Press to continue.") + input("Press to continue.") clear() diff --git a/InvenTree/company/test_migrations.py b/InvenTree/company/test_migrations.py new file mode 100644 index 0000000000..16d9059f23 --- /dev/null +++ b/InvenTree/company/test_migrations.py @@ -0,0 +1,80 @@ +""" +Tests for the company model database migrations +""" + +from django_test_migrations.contrib.unittest_case import MigratorTestCase + + +class TestManufacturerField(MigratorTestCase): + """ + Tests for migration 0019 which migrates from old 'manufacturer_name' field to new 'manufacturer' field + """ + + migrate_from = ('company', '0018_supplierpart_manufacturer') + migrate_to = ('company', '0019_auto_20200413_0642') + + def prepare(self): + """ + Prepare the database by adding some test data 'before' the change: + + - Part object + - Company object (supplier) + - SupplierPart object + """ + + Part = self.old_state.apps.get_model('part', 'part') + Company = self.old_state.apps.get_model('company', 'company') + SupplierPart = self.old_state.apps.get_model('company', 'supplierpart') + + # Create an initial part + part = Part.objects.create( + name='Screw', + description='A single screw' + ) + + # Create a company to act as the supplier + supplier = Company.objects.create( + name='Supplier', + description='A supplier of parts', + is_supplier=True, + is_customer=False, + ) + + # Add some SupplierPart objects + SupplierPart.objects.create( + part=part, + supplier=supplier, + SKU='SCREW.001', + manufacturer_name='ACME', + ) + + SupplierPart.objects.create( + part=part, + supplier=supplier, + SKU='SCREW.002', + manufacturer_name='Zero Corp' + ) + + self.assertEqual(Company.objects.count(), 1) + + def test_company_objects(self): + """ + Test that the new companies have been created successfully + """ + + # Two additional company objects should have been created + Company = self.new_state.apps.get_model('company', 'company') + self.assertEqual(Company.objects.count(), 3) + + # The new company/ies must be marked as "manufacturers" + acme = Company.objects.get(name='ACME') + self.assertTrue(acme.is_manufacturer) + + SupplierPart = self.new_state.apps.get_model('company', 'supplierpart') + parts = SupplierPart.objects.filter(manufacturer=acme) + self.assertEqual(parts.count(), 1) + part = parts.first() + + # Checks on the SupplierPart object + self.assertEqual(part.manufacturer_name, 'ACME') + self.assertEqual(part.manufacturer.name, 'ACME')