Tech Tools section with a code generator, toner report that names the part, toner forecasting, warranty proof of cover, application uploads
This commit is contained in:
55
tests/test_plugins/test_tools.py
Normal file
55
tests/test_plugins/test_tools.py
Normal file
@@ -0,0 +1,55 @@
|
||||
"""Tests for the Tech Tools plugin.
|
||||
|
||||
The plugin owns no API and no tables, so the whole backend contract is: it
|
||||
loads, it advertises one nav entry, and it claims no database. That last part
|
||||
matters - a plugin that accidentally returns models would pull the tools
|
||||
section into the migration and prune-schema machinery it has no business in.
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
|
||||
from plugins.tools.plugin import ToolsPlugin
|
||||
|
||||
|
||||
PLUGIN_DIR = os.path.join(os.path.dirname(os.path.dirname(
|
||||
os.path.dirname(os.path.abspath(__file__)))), 'plugins', 'tools')
|
||||
|
||||
|
||||
def test_meta_matches_manifest():
|
||||
"""The manifest is the single source of truth per ADR-002."""
|
||||
with open(os.path.join(PLUGIN_DIR, 'manifest.json'), encoding='utf-8') as handle:
|
||||
manifest = json.load(handle)
|
||||
|
||||
meta = ToolsPlugin().meta
|
||||
assert meta.name == manifest['name']
|
||||
assert meta.version == manifest['version']
|
||||
assert meta.core_version == manifest['core_version']
|
||||
|
||||
|
||||
def test_no_backend_surface():
|
||||
"""Client-side only: no blueprint to register, no tables to migrate."""
|
||||
plugin = ToolsPlugin()
|
||||
assert plugin.get_blueprint() is None
|
||||
assert plugin.get_models() == []
|
||||
|
||||
|
||||
def test_navigation_item():
|
||||
items = ToolsPlugin().get_navigation_items()
|
||||
assert len(items) == 1
|
||||
item = items[0]
|
||||
assert item['name'] == 'Tech Tools'
|
||||
assert item['route'] == '/tools'
|
||||
# The icon has to exist in AppLayout's iconMap or the nav entry renders
|
||||
# with no glyph.
|
||||
assert item['icon'] == 'wrench'
|
||||
|
||||
|
||||
def test_nav_icon_is_mapped_in_the_frontend():
|
||||
"""Guard the one cross-file coupling: nav icon name -> AppLayout iconMap."""
|
||||
layout = os.path.join(os.path.dirname(PLUGIN_DIR), '..', 'frontend', 'src',
|
||||
'views', 'AppLayout.vue')
|
||||
with open(os.path.normpath(layout), encoding='utf-8') as handle:
|
||||
source = handle.read()
|
||||
for item in ToolsPlugin().get_navigation_items():
|
||||
assert f"'{item['icon']}':" in source
|
||||
Reference in New Issue
Block a user