feat: add deployment config sync commands
This commit is contained in:
172
backend/workflows/tests/test_portal_deployment_config_sync.py
Normal file
172
backend/workflows/tests/test_portal_deployment_config_sync.py
Normal file
@@ -0,0 +1,172 @@
|
||||
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.branding import get_portal_branding, get_portal_company_config
|
||||
|
||||
|
||||
class PortalDeploymentConfigSyncTests(TestCase):
|
||||
def test_export_writes_branding_and_company_config(self):
|
||||
with TemporaryDirectory() as tmpdir:
|
||||
output_path = Path(tmpdir) / 'portal-deployment-config.json'
|
||||
call_command('export_portal_deployment_config', '--output', str(output_path))
|
||||
payload = json.loads(output_path.read_text(encoding='utf-8'))
|
||||
|
||||
self.assertEqual(payload['format'], 'portal_deployment_config')
|
||||
self.assertEqual(payload['version'], 1)
|
||||
self.assertIn('branding', payload)
|
||||
self.assertIn('company_config', payload)
|
||||
self.assertIn('notes', payload)
|
||||
|
||||
def test_import_updates_branding_and_company_config(self):
|
||||
branding = get_portal_branding()
|
||||
company_config = get_portal_company_config()
|
||||
payload = {
|
||||
'format': 'portal_deployment_config',
|
||||
'version': 1,
|
||||
'branding': {
|
||||
'name': branding.name,
|
||||
'portal_title': 'Workdock Test',
|
||||
'company_name': branding.company_name,
|
||||
'company_domain': 'example.org',
|
||||
'support_email': 'support@example.org',
|
||||
'sender_display_name': branding.sender_display_name,
|
||||
'login_subtitle': branding.login_subtitle,
|
||||
'footer_text': branding.footer_text,
|
||||
'footer_text_en': branding.footer_text_en,
|
||||
'legal_notice': branding.legal_notice,
|
||||
'legal_notice_en': branding.legal_notice_en,
|
||||
'default_language': 'en',
|
||||
'primary_color': '#112233',
|
||||
'secondary_color': '#445566',
|
||||
},
|
||||
'company_config': {
|
||||
'name': company_config.name,
|
||||
'legal_company_name': 'Example GmbH',
|
||||
'street_address': 'Example Street 1',
|
||||
'postal_code': company_config.postal_code,
|
||||
'city': 'Berlin',
|
||||
'country': company_config.country,
|
||||
'website_url': 'https://example.org',
|
||||
'imprint_url': company_config.imprint_url,
|
||||
'privacy_url': company_config.privacy_url,
|
||||
'hr_contact_email': 'hr@example.org',
|
||||
'it_contact_email': company_config.it_contact_email,
|
||||
'operations_contact_email': company_config.operations_contact_email,
|
||||
'phone_number': company_config.phone_number,
|
||||
'vat_id': company_config.vat_id,
|
||||
'registration_number': company_config.registration_number,
|
||||
},
|
||||
}
|
||||
with TemporaryDirectory() as tmpdir:
|
||||
input_path = Path(tmpdir) / 'portal-deployment-config.json'
|
||||
input_path.write_text(json.dumps(payload), encoding='utf-8')
|
||||
call_command('import_portal_deployment_config', str(input_path))
|
||||
|
||||
branding.refresh_from_db()
|
||||
company_config.refresh_from_db()
|
||||
self.assertEqual(branding.portal_title, 'Workdock Test')
|
||||
self.assertEqual(branding.company_domain, 'example.org')
|
||||
self.assertEqual(company_config.legal_company_name, 'Example GmbH')
|
||||
self.assertEqual(company_config.website_url, 'https://example.org')
|
||||
|
||||
def test_import_dry_run_does_not_persist(self):
|
||||
branding = get_portal_branding()
|
||||
company_config = get_portal_company_config()
|
||||
payload = {
|
||||
'format': 'portal_deployment_config',
|
||||
'version': 1,
|
||||
'branding': {
|
||||
'name': branding.name,
|
||||
'portal_title': 'Dry Run Branding',
|
||||
'company_name': branding.company_name,
|
||||
'company_domain': branding.company_domain,
|
||||
'support_email': branding.support_email,
|
||||
'sender_display_name': branding.sender_display_name,
|
||||
'login_subtitle': branding.login_subtitle,
|
||||
'footer_text': branding.footer_text,
|
||||
'footer_text_en': branding.footer_text_en,
|
||||
'legal_notice': branding.legal_notice,
|
||||
'legal_notice_en': branding.legal_notice_en,
|
||||
'default_language': branding.default_language,
|
||||
'primary_color': branding.primary_color,
|
||||
'secondary_color': branding.secondary_color,
|
||||
},
|
||||
'company_config': {
|
||||
'name': company_config.name,
|
||||
'legal_company_name': 'Dry Run Company',
|
||||
'street_address': company_config.street_address,
|
||||
'postal_code': company_config.postal_code,
|
||||
'city': company_config.city,
|
||||
'country': company_config.country,
|
||||
'website_url': company_config.website_url,
|
||||
'imprint_url': company_config.imprint_url,
|
||||
'privacy_url': company_config.privacy_url,
|
||||
'hr_contact_email': company_config.hr_contact_email,
|
||||
'it_contact_email': company_config.it_contact_email,
|
||||
'operations_contact_email': company_config.operations_contact_email,
|
||||
'phone_number': company_config.phone_number,
|
||||
'vat_id': company_config.vat_id,
|
||||
'registration_number': company_config.registration_number,
|
||||
},
|
||||
}
|
||||
with TemporaryDirectory() as tmpdir:
|
||||
input_path = Path(tmpdir) / 'portal-deployment-config.json'
|
||||
input_path.write_text(json.dumps(payload), encoding='utf-8')
|
||||
call_command('import_portal_deployment_config', str(input_path), '--dry-run')
|
||||
|
||||
branding.refresh_from_db()
|
||||
company_config.refresh_from_db()
|
||||
self.assertNotEqual(branding.portal_title, 'Dry Run Branding')
|
||||
self.assertNotEqual(company_config.legal_company_name, 'Dry Run Company')
|
||||
|
||||
def test_import_rejects_unexpected_fields(self):
|
||||
branding = get_portal_branding()
|
||||
company_config = get_portal_company_config()
|
||||
payload = {
|
||||
'format': 'portal_deployment_config',
|
||||
'version': 1,
|
||||
'branding': {
|
||||
'name': branding.name,
|
||||
'portal_title': branding.portal_title,
|
||||
'company_name': branding.company_name,
|
||||
'company_domain': branding.company_domain,
|
||||
'support_email': branding.support_email,
|
||||
'sender_display_name': branding.sender_display_name,
|
||||
'login_subtitle': branding.login_subtitle,
|
||||
'footer_text': branding.footer_text,
|
||||
'footer_text_en': branding.footer_text_en,
|
||||
'legal_notice': branding.legal_notice,
|
||||
'legal_notice_en': branding.legal_notice_en,
|
||||
'default_language': branding.default_language,
|
||||
'primary_color': branding.primary_color,
|
||||
'secondary_color': branding.secondary_color,
|
||||
'logo_image': 'should-not-be-here',
|
||||
},
|
||||
'company_config': {
|
||||
'name': company_config.name,
|
||||
'legal_company_name': company_config.legal_company_name,
|
||||
'street_address': company_config.street_address,
|
||||
'postal_code': company_config.postal_code,
|
||||
'city': company_config.city,
|
||||
'country': company_config.country,
|
||||
'website_url': company_config.website_url,
|
||||
'imprint_url': company_config.imprint_url,
|
||||
'privacy_url': company_config.privacy_url,
|
||||
'hr_contact_email': company_config.hr_contact_email,
|
||||
'it_contact_email': company_config.it_contact_email,
|
||||
'operations_contact_email': company_config.operations_contact_email,
|
||||
'phone_number': company_config.phone_number,
|
||||
'vat_id': company_config.vat_id,
|
||||
'registration_number': company_config.registration_number,
|
||||
},
|
||||
}
|
||||
with TemporaryDirectory() as tmpdir:
|
||||
input_path = Path(tmpdir) / 'portal-deployment-config.json'
|
||||
input_path.write_text(json.dumps(payload), encoding='utf-8')
|
||||
with self.assertRaises(CommandError):
|
||||
call_command('import_portal_deployment_config', str(input_path))
|
||||
Reference in New Issue
Block a user