Initialize clean CSR inventory repository
This commit is contained in:
53
inventory/test_migration.py
Normal file
53
inventory/test_migration.py
Normal file
@@ -0,0 +1,53 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user