ADR-013 Phase 2: enforcement + signed shelf + adopt (adversarial-review hardened)
This commit is contained in:
@@ -58,18 +58,21 @@ def test_registry_migrates_equipment_to_machines(tmp_path):
|
||||
|
||||
# --- Manager enable/disable dependency guards + permission seeding -----------
|
||||
|
||||
def _write_plugin(plugins_dir, name, deps=None, permissions=None):
|
||||
def _write_plugin(plugins_dir, name, deps=None, permissions=None, tier=None):
|
||||
"""Write a minimal valid synthetic plugin (manifest.json + plugin.py)."""
|
||||
pdir = plugins_dir / name
|
||||
pdir.mkdir()
|
||||
(pdir / 'manifest.json').write_text(json.dumps({
|
||||
manifest = {
|
||||
'name': name,
|
||||
'version': '1.0.0',
|
||||
'description': f'synthetic {name}',
|
||||
'dependencies': deps or [],
|
||||
'core_version': '>=0.1.0,<1.0.0',
|
||||
'api_prefix': f'/api/{name}',
|
||||
}))
|
||||
}
|
||||
if tier:
|
||||
manifest['tier'] = tier
|
||||
(pdir / 'manifest.json').write_text(json.dumps(manifest))
|
||||
(pdir / '__init__.py').write_text('')
|
||||
(pdir / 'plugin.py').write_text(
|
||||
'from shopdb.plugins.base import BasePlugin, PluginMeta\n\n'
|
||||
@@ -286,6 +289,28 @@ def test_validate_bundled_plugin_passes(app):
|
||||
assert 'valid' in result.output
|
||||
|
||||
|
||||
def test_core_tier_plugin_cannot_be_disabled_or_uninstalled(app, db, tmp_path):
|
||||
"""A tier=core plugin refuses disable and uninstall (ADR-013)."""
|
||||
plugins_dir = tmp_path / 'plugins'
|
||||
plugins_dir.mkdir()
|
||||
_write_plugin(plugins_dir, 'kernel', tier='core')
|
||||
|
||||
registry = PluginRegistry(tmp_path / 'plugins.json')
|
||||
registry.register('kernel', '1.0.0', enabled=True)
|
||||
|
||||
pm = PluginManager()
|
||||
pm._app = app
|
||||
pm._db = db
|
||||
pm.registry = registry
|
||||
pm.loader = PluginLoader(plugins_dir, registry)
|
||||
pm.migration_manager = None
|
||||
|
||||
assert pm.disable_plugin('kernel') is False
|
||||
assert pm.registry.is_enabled('kernel')
|
||||
assert pm.uninstall_plugin('kernel') is False
|
||||
assert pm.registry.is_installed('kernel')
|
||||
|
||||
|
||||
# --- Seed idempotency -------------------------------------------------------
|
||||
|
||||
def test_seed_settings_is_idempotent(app, db):
|
||||
|
||||
Reference in New Issue
Block a user