54 lines
2.9 KiB
Python
54 lines
2.9 KiB
Python
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)
|