Files
leocrm/test_report.md
T
2026-07-14 20:09:18 +02:00

4.3 KiB

Test Report — Report Generator Core Plugin

Date: 2026-07-08

Task: Build Report Generator Core Plugin for LeoCRM

Files Created

  1. app/plugins/builtins/report_generator/__init__.py — Plugin package init (5 lines)
  2. app/plugins/builtins/report_generator/plugin.py — Plugin manifest + class (29 lines)
  3. app/plugins/builtins/report_generator/models.py — ReportTemplate + ReportInstance models (63 lines)
  4. app/plugins/builtins/report_generator/schemas.py — Pydantic schemas (52 lines)
  5. app/plugins/builtins/report_generator/routes.py — 8 API endpoints (415 lines)
  6. app/plugins/builtins/report_generator/migrations/0001_initial.sql — PostgreSQL migration (32 lines)
  7. app/plugins/builtins/__init__.py — Updated to include ReportGeneratorPlugin import

Tests Run

1. AST Syntax Check

Command: python -c 'import ast; ast.parse(...)' Result: All 6 Python files passed AST syntax check.

OK: app/plugins/builtins/report_generator/__init__.py
OK: app/plugins/builtins/report_generator/plugin.py
OK: app/plugins/builtins/report_generator/models.py
OK: app/plugins/builtins/report_generator/schemas.py
OK: app/plugins/builtins/report_generator/routes.py
OK: app/plugins/builtins/__init__.py

2. Import Verification

Command: python -c 'from app.plugins.builtins.report_generator.plugin import ReportGeneratorPlugin; ...' Result: All imports resolve correctly.

Base + TenantMixin OK
Schemas OK
TemplateCreate validation OK: {'name': 'test', 'description': '', 'template_type': 'jinja2', 'content': '{{ data }}', 'output_format': 'csv'}
Models OK
ReportTemplate table: report_templates
ReportInstance table: report_instances

3. Jinja2 Template Rendering

Result: Template rendered successfully.

Jinja2 render OK: 'Name,Value\nAlice,100\nBob,200'

4. CSV Generation (Python stdlib csv)

Result: CSV file generated with UTF-8 BOM.

CSV generation OK, size: 44 bytes

5. Excel Generation (openpyxl)

Result: Excel workbook created.

Excel generation OK, size: 4874 bytes

6. JSON Generation

Result: JSON parsed and returned.

JSON generation OK: {'key': 'value'}

7. Plugin Manifest + Routes

Result: Plugin loads with correct manifest and 8 routes registered.

Plugin instance: <ReportGeneratorPlugin name=report_generator version=1.0.0>
Manifest name: report_generator
Manifest version: 1.0.0
Is core: True
Dependencies: ['permissions']
Events: ['report.requested', 'report.generated']
Permissions: ['reports.read', 'reports.generate', 'reports.manage_templates']
Routes loaded: 1 router(s)
Router prefix: /api/v1/reports
Router routes: 8
  {'GET'} /api/v1/reports/templates
  {'POST'} /api/v1/reports/templates
  {'GET'} /api/v1/reports/templates/{template_id}
  {'PUT'} /api/v1/reports/templates/{template_id}
  {'DELETE'} /api/v1/reports/templates/{template_id}
  {'POST'} /api/v1/reports/generate
  {'GET'} /api/v1/reports/{report_id}
  {'GET'} /api/v1/reports/{report_id}/download

8. Migration SQL Validation

Result: 2 tables, 5 indexes, all required columns and FK present.

Tables: ['report_templates', 'report_instances']
Indexes: [('ix_report_templates_tenant', 'report_templates', 'tenant_id'), ('ix_report_templates_name', 'report_templates', 'name'), ('ix_report_instances_tenant', 'report_instances', 'tenant_id'), ('ix_report_instances_template', 'report_instances', 'template_id'), ('ix_report_instances_status', 'report_instances', 'status')]
FK reference present
Migration SQL validation passed.

Smoke Test Summary

  • Plugin class instantiates and loads routes correctly
  • All 8 endpoints registered under /api/v1/reports prefix
  • Jinja2 template rendering works with data injection
  • CSV output uses Python stdlib csv module (with UTF-8 BOM for Excel compat)
  • Excel output uses openpyxl Workbook
  • JSON output parses rendered template as JSON
  • Migration SQL creates 2 tables with correct columns, indexes, and FK
  • Tenant isolation: all queries filter by tenant_id from current_user
  • Soft delete: templates have deleted_at column, queries filter deleted_at.is_(None)

Note on Dependencies

  • openpyxl>=3.1 and redis>=5.0 and passlib were in requirements.txt but not installed in venv. Installed them to verify import chain. No changes to requirements.txt.

Result: ALL TESTS PASSED