"""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()