103 lines
5.9 KiB
Python
103 lines
5.9 KiB
Python
"""The destructive column move must preserve existing device hardware."""
|
|
|
|
from django.db import connection
|
|
from django.db.migrations.executor import MigrationExecutor
|
|
from django.test import TransactionTestCase
|
|
|
|
|
|
OLD = [("inventory", "0008_normalize_hardware_by_type")]
|
|
NEW = [("inventory", "0009_split_device_specifications")]
|
|
|
|
|
|
def restore_latest_schema():
|
|
executor = MigrationExecutor(connection)
|
|
executor.migrate(executor.loader.graph.leaf_nodes())
|
|
|
|
|
|
class SpecificationMigrationTests(TransactionTestCase):
|
|
def test_existing_rows_move_to_the_correct_type_table(self):
|
|
executor = MigrationExecutor(connection)
|
|
executor.migrate(OLD)
|
|
try:
|
|
apps = executor.loader.project_state(OLD).apps
|
|
Choice = apps.get_model("inventory", "ChoiceValue")
|
|
Device = apps.get_model("inventory", "Device")
|
|
status, _ = Choice.objects.get_or_create(kind="status", label="Eingang")
|
|
laptop, _ = Choice.objects.get_or_create(kind="device_type", label="Laptop")
|
|
printer, _ = Choice.objects.get_or_create(kind="device_type", label="Drucker")
|
|
screen, _ = Choice.objects.get_or_create(kind="device_type", label="Bildschirm")
|
|
laptop_id = Device.objects.create(number=91001, status=status, device_type=laptop, cpu="Core i5", ram_gb=16).pk
|
|
printer_id = Device.objects.create(number=91002, status=status, device_type=printer, wifi="YES").pk
|
|
screen_id = Device.objects.create(number=91003, status=status, device_type=screen, display_inches="24.0").pk
|
|
|
|
executor = MigrationExecutor(connection)
|
|
executor.migrate(NEW)
|
|
apps = executor.loader.project_state(NEW).apps
|
|
Device = apps.get_model("inventory", "Device")
|
|
Computer = apps.get_model("inventory", "ComputerSpecification")
|
|
Printer = apps.get_model("inventory", "PrinterSpecification")
|
|
Monitor = apps.get_model("inventory", "MonitorSpecification")
|
|
self.assertNotIn("ram_gb", {field.name for field in Device._meta.fields})
|
|
self.assertEqual(Computer.objects.get(device_id=laptop_id).ram_gb, 16)
|
|
self.assertEqual(Computer.objects.get(device_id=laptop_id).cpu, "Core i5")
|
|
self.assertEqual(Printer.objects.get(device_id=printer_id).wifi, "YES")
|
|
self.assertEqual(str(Monitor.objects.get(device_id=screen_id).display_inches), "24.0")
|
|
self.assertFalse(Computer.objects.filter(device_id=printer_id).exists())
|
|
finally:
|
|
restore_latest_schema()
|
|
|
|
|
|
class DeviceTypeTableMigrationTests(TransactionTestCase):
|
|
def test_existing_computers_move_to_their_own_tables(self):
|
|
old = [("inventory", "0011_inspectionrecord_repairrecord")]
|
|
executor = MigrationExecutor(connection)
|
|
executor.migrate(old)
|
|
try:
|
|
apps = executor.loader.project_state(old).apps
|
|
Choice = apps.get_model("inventory", "ChoiceValue")
|
|
Device = apps.get_model("inventory", "Device")
|
|
Computer = apps.get_model("inventory", "ComputerSpecification")
|
|
status, _ = Choice.objects.get_or_create(kind="status", label="Eingang")
|
|
ids = {}
|
|
for index, label in enumerate(("Laptop", "Desktop", "AiO", "Sondergerät"), start=1):
|
|
device_type, _ = Choice.objects.get_or_create(kind="device_type", label=label)
|
|
device = Device.objects.create(number=92000 + index, status=status, device_type=device_type)
|
|
Computer.objects.create(device_id=device.pk, cpu="Core i5", ram_gb=8, ssd_gb=256)
|
|
ids[label] = device.pk
|
|
restore_latest_schema()
|
|
apps = MigrationExecutor(connection).loader.project_state().apps
|
|
self.assertEqual(apps.get_model("inventory", "LaptopSpecification").objects.get(device_id=ids["Laptop"]).ram_gb, 8)
|
|
self.assertEqual(apps.get_model("inventory", "DesktopSpecification").objects.get(device_id=ids["Desktop"]).ssd_gb, 256)
|
|
self.assertEqual(apps.get_model("inventory", "AllInOneSpecification").objects.get(device_id=ids["AiO"]).cpu, "Core i5")
|
|
Computer = apps.get_model("inventory", "ComputerSpecification")
|
|
self.assertFalse(Computer.objects.filter(device_id__in=ids.values()).exclude(device_id=ids["Sondergerät"]).exists())
|
|
self.assertTrue(Computer.objects.filter(device_id=ids["Sondergerät"]).exists())
|
|
finally:
|
|
restore_latest_schema()
|
|
|
|
|
|
class EquipmentFieldMigrationTests(TransactionTestCase):
|
|
def test_existing_connection_notes_and_hardware_are_preserved(self):
|
|
old = [("inventory", "0013_deviceregistration")]
|
|
executor = MigrationExecutor(connection)
|
|
executor.migrate(old)
|
|
try:
|
|
apps = executor.loader.project_state(old).apps
|
|
Choice = apps.get_model("inventory", "ChoiceValue")
|
|
Device = apps.get_model("inventory", "Device")
|
|
Monitor = apps.get_model("inventory", "MonitorSpecification")
|
|
status, _ = Choice.objects.get_or_create(kind="status", label="Eingang")
|
|
kind, _ = Choice.objects.get_or_create(kind="device_type", label="Bildschirm")
|
|
device = Device.objects.create(number=93001, status=status, device_type=kind)
|
|
Monitor.objects.create(device=device, ports="HDMI, VGA; DP ungetestet", resolution="1920x1080")
|
|
restore_latest_schema()
|
|
apps = MigrationExecutor(connection).loader.project_state().apps
|
|
specification = apps.get_model("inventory", "MonitorSpecification").objects.get(device_id=device.pk)
|
|
self.assertEqual(specification.ports, "HDMI, VGA; DP ungetestet")
|
|
self.assertEqual(specification.resolution, "1920x1080")
|
|
self.assertEqual(specification.hdmi, "UNKNOWN")
|
|
self.assertEqual(specification.displayport, "UNKNOWN")
|
|
self.assertEqual(specification.aspect_ratio, "")
|
|
finally:
|
|
restore_latest_schema()
|