import json from pathlib import Path import tempfile from django.contrib.auth.models import User from django.core.management import CommandError from django.test import TestCase from .management.commands.import_sqlite_export import Command from .models import ChoiceValue, Device, NumberSequence, UserProfile class MigrationImportTests(TestCase): def setUp(self): self.temporary = tempfile.TemporaryDirectory() self.addCleanup(self.temporary.cleanup) self.fixture = Path(self.temporary.name) / "export.json" def write_fixture(self, objects): self.fixture.write_text(json.dumps(objects), encoding="utf-8") def test_import_accepts_migration_defaults_and_preserves_ids_and_roles(self): # Fresh databases have these rows from migration 0003. Fixture IDs differ. ChoiceValue.objects.all().delete() for order, label in enumerate(("Bildschirm", "Drucker"), 3): ChoiceValue.objects.create(kind="device_type", label=label, sort_order=order) stamp = "2026-09-23T10:00:00Z" self.write_fixture([ {"model": "auth.user", "pk": 50, "fields": {"username": "migrated", "password": "!", "is_active": True}}, {"model": "inventory.userprofile", "pk": 60, "fields": {"user": ["migrated"], "role": "EDITOR", "created_at": stamp, "updated_at": stamp}}, {"model": "inventory.choicevalue", "pk": 70, "fields": {"kind": "status", "label": "Imported", "created_at": stamp, "updated_at": stamp}}, {"model": "inventory.choicevalue", "pk": 80, "fields": {"kind": "device_type", "label": "Bildschirm", "created_at": stamp, "updated_at": stamp}}, {"model": "inventory.device", "pk": 90, "fields": {"number": 2000, "status": 70, "device_type": 80, "created_at": stamp, "updated_at": stamp, "revision": 1}}, ]) self.assertEqual(Command().load_export(self.fixture, verbosity=0), 1) self.assertEqual(User.objects.get(username="migrated").pk, 50) self.assertEqual(UserProfile.objects.get(user_id=50).role, "EDITOR") self.assertEqual(Device.objects.get(pk=90).number, 2000) self.assertEqual(NumberSequence.objects.get(name="device").last_value, 2000) def test_import_refuses_existing_business_data(self): user = User.objects.create_user("existing") self.write_fixture([]) with self.assertRaises(CommandError): Command().load_export(self.fixture, verbosity=0) self.assertTrue(User.objects.filter(pk=user.pk).exists()) def test_bad_fixture_rolls_back_default_removal_and_import(self): before = list(ChoiceValue.objects.values_list("pk", "label")) self.write_fixture([{"model": "inventory.unknown", "pk": 1, "fields": {}}]) with self.assertRaises(CommandError): Command().load_export(self.fixture, verbosity=0) self.assertEqual(list(ChoiceValue.objects.values_list("pk", "label")), before)