Files
Inventory/inventory/test_specification_migration.py
2026-09-29 08:43:05 +02:00

73 lines
4.4 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")]
LATEST = [("inventory", "0012_allinonespecification_desktopspecification_and_more")]
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:
MigrationExecutor(connection).migrate(LATEST)
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
MigrationExecutor(connection).migrate(LATEST)
apps = MigrationExecutor(connection).loader.project_state(LATEST).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:
MigrationExecutor(connection).migrate(LATEST)