feat: add portal app config sync commands
This commit is contained in:
125
backend/workflows/tests/test_portal_app_config_sync.py
Normal file
125
backend/workflows/tests/test_portal_app_config_sync.py
Normal file
@@ -0,0 +1,125 @@
|
||||
import json
|
||||
from pathlib import Path
|
||||
from tempfile import TemporaryDirectory
|
||||
|
||||
from django.core.management import call_command
|
||||
from django.core.management.base import CommandError
|
||||
from django.test import TestCase
|
||||
|
||||
from workflows.app_registry import ensure_portal_app_configs
|
||||
from workflows.models import PortalAppConfig
|
||||
|
||||
|
||||
class PortalAppConfigSyncTests(TestCase):
|
||||
def setUp(self):
|
||||
ensure_portal_app_configs()
|
||||
|
||||
def test_export_writes_expected_payload(self):
|
||||
with TemporaryDirectory() as tmpdir:
|
||||
output_path = Path(tmpdir) / 'portal-app-config.json'
|
||||
call_command('export_portal_app_config', '--output', str(output_path))
|
||||
payload = json.loads(output_path.read_text(encoding='utf-8'))
|
||||
|
||||
self.assertEqual(payload['format'], 'portal_app_config')
|
||||
self.assertEqual(payload['version'], 1)
|
||||
self.assertEqual(len(payload['items']), PortalAppConfig.objects.count())
|
||||
self.assertIn('generated_at', payload)
|
||||
|
||||
def test_import_applies_runtime_ordering_changes(self):
|
||||
payload = {
|
||||
'format': 'portal_app_config',
|
||||
'version': 1,
|
||||
'items': list(PortalAppConfig.objects.order_by('section', 'sort_order', 'key').values(
|
||||
'key',
|
||||
'section',
|
||||
'sort_order',
|
||||
'is_enabled',
|
||||
'visible_to_super_admin',
|
||||
'visible_to_admin',
|
||||
'visible_to_it_staff',
|
||||
'visible_to_staff',
|
||||
'title_override',
|
||||
'title_override_en',
|
||||
'description_override',
|
||||
'description_override_en',
|
||||
'action_label_override',
|
||||
'action_label_override_en',
|
||||
)),
|
||||
}
|
||||
for item in payload['items']:
|
||||
if item['key'] == 'branding':
|
||||
item['sort_order'] = 0
|
||||
elif item['key'] == 'company_config':
|
||||
item['sort_order'] = 1
|
||||
item['title_override'] = 'Company Setup'
|
||||
|
||||
with TemporaryDirectory() as tmpdir:
|
||||
input_path = Path(tmpdir) / 'portal-app-config.json'
|
||||
input_path.write_text(json.dumps(payload), encoding='utf-8')
|
||||
call_command('import_portal_app_config', str(input_path))
|
||||
|
||||
branding = PortalAppConfig.objects.get(key='branding')
|
||||
company_config = PortalAppConfig.objects.get(key='company_config')
|
||||
self.assertEqual(branding.sort_order, 0)
|
||||
self.assertEqual(company_config.title_override, 'Company Setup')
|
||||
|
||||
def test_import_dry_run_does_not_persist(self):
|
||||
payload = {
|
||||
'format': 'portal_app_config',
|
||||
'version': 1,
|
||||
'items': list(PortalAppConfig.objects.order_by('section', 'sort_order', 'key').values(
|
||||
'key',
|
||||
'section',
|
||||
'sort_order',
|
||||
'is_enabled',
|
||||
'visible_to_super_admin',
|
||||
'visible_to_admin',
|
||||
'visible_to_it_staff',
|
||||
'visible_to_staff',
|
||||
'title_override',
|
||||
'title_override_en',
|
||||
'description_override',
|
||||
'description_override_en',
|
||||
'action_label_override',
|
||||
'action_label_override_en',
|
||||
)),
|
||||
}
|
||||
for item in payload['items']:
|
||||
if item['key'] == 'branding':
|
||||
item['title_override'] = 'Dry Run Only'
|
||||
|
||||
with TemporaryDirectory() as tmpdir:
|
||||
input_path = Path(tmpdir) / 'portal-app-config.json'
|
||||
input_path.write_text(json.dumps(payload), encoding='utf-8')
|
||||
call_command('import_portal_app_config', str(input_path), '--dry-run')
|
||||
|
||||
self.assertEqual(PortalAppConfig.objects.get(key='branding').title_override, '')
|
||||
|
||||
def test_import_rejects_unknown_keys(self):
|
||||
payload = {
|
||||
'format': 'portal_app_config',
|
||||
'version': 1,
|
||||
'items': [
|
||||
{
|
||||
'key': 'unknown_app',
|
||||
'section': 'platform',
|
||||
'sort_order': 0,
|
||||
'is_enabled': True,
|
||||
'visible_to_super_admin': True,
|
||||
'visible_to_admin': True,
|
||||
'visible_to_it_staff': False,
|
||||
'visible_to_staff': False,
|
||||
'title_override': '',
|
||||
'title_override_en': '',
|
||||
'description_override': '',
|
||||
'description_override_en': '',
|
||||
'action_label_override': '',
|
||||
'action_label_override_en': '',
|
||||
}
|
||||
],
|
||||
}
|
||||
with TemporaryDirectory() as tmpdir:
|
||||
input_path = Path(tmpdir) / 'portal-app-config.json'
|
||||
input_path.write_text(json.dumps(payload), encoding='utf-8')
|
||||
with self.assertRaises(CommandError):
|
||||
call_command('import_portal_app_config', str(input_path))
|
||||
Reference in New Issue
Block a user