mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-29 12:06:44 +00:00
Test troublesome migration 0019
This commit is contained in:
parent
1d317b1ecb
commit
34dbfe6d28
@ -1,14 +1,21 @@
|
|||||||
# Generated by Django 2.2.10 on 2020-04-13 06:42
|
# Generated by Django 2.2.10 on 2020-04-13 06:42
|
||||||
|
|
||||||
|
import sys
|
||||||
import os
|
import os
|
||||||
from rapidfuzz import fuzz
|
from rapidfuzz import fuzz
|
||||||
|
|
||||||
from django.db import migrations, connection
|
from django.db import migrations, connection
|
||||||
from django.db.utils import OperationalError, ProgrammingError
|
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():
|
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):
|
def reverse_association(apps, schema_editor):
|
||||||
@ -222,23 +229,31 @@ def associate_manufacturers(apps, schema_editor):
|
|||||||
clear()
|
clear()
|
||||||
|
|
||||||
# Present a list of options
|
# 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("Checking part [{pk}] ({idx} of {total})".format(pk=part_id, idx=idx+1, total=total))
|
||||||
print("Manufacturer name: '{n}'".format(n=name))
|
|
||||||
print("----------------------------------")
|
if not TESTING:
|
||||||
print("Select an option from the list below:")
|
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("0) - Create new manufacturer '{n}'".format(n=name))
|
||||||
print("")
|
print("")
|
||||||
|
|
||||||
for i, m in enumerate(matches[:10]):
|
for i, m in enumerate(matches[:10]):
|
||||||
print("{i}) - Use manufacturer '{opt}'".format(i=i+1, opt=m))
|
print("{i}) - Use manufacturer '{opt}'".format(i=i+1, opt=m))
|
||||||
|
|
||||||
print("")
|
print("")
|
||||||
print("OR - Type a new custom manufacturer name")
|
print("OR - Type a new custom manufacturer name")
|
||||||
|
|
||||||
while True:
|
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
|
# Attempt to parse user response as an integer
|
||||||
try:
|
try:
|
||||||
@ -300,18 +315,19 @@ def associate_manufacturers(apps, schema_editor):
|
|||||||
print("")
|
print("")
|
||||||
clear()
|
clear()
|
||||||
|
|
||||||
print("---------------------------------------")
|
if not TESTING:
|
||||||
print("The SupplierPart model needs to be migrated,")
|
print("---------------------------------------")
|
||||||
print("as the new 'manufacturer' field maps to a 'Company' reference.")
|
print("The SupplierPart model needs to be migrated,")
|
||||||
print("The existing 'manufacturer_name' field will be used to match")
|
print("as the new 'manufacturer' field maps to a 'Company' reference.")
|
||||||
print("against possible companies.")
|
print("The existing 'manufacturer_name' field will be used to match")
|
||||||
print("This process requires user input.")
|
print("against possible companies.")
|
||||||
print("")
|
print("This process requires user input.")
|
||||||
print("Note: This process MUST be completed to migrate the database.")
|
print("")
|
||||||
print("---------------------------------------")
|
print("Note: This process MUST be completed to migrate the database.")
|
||||||
print("")
|
print("---------------------------------------")
|
||||||
|
print("")
|
||||||
|
|
||||||
input("Press <ENTER> to continue.")
|
input("Press <ENTER> to continue.")
|
||||||
|
|
||||||
clear()
|
clear()
|
||||||
|
|
||||||
|
80
InvenTree/company/test_migrations.py
Normal file
80
InvenTree/company/test_migrations.py
Normal file
@ -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')
|
Loading…
x
Reference in New Issue
Block a user