Files
RuoYi-Vue3-FastAPI/ruoyi-fastapi-backend/tests/sql/test_plugin_release_schema.py
T
insistence 4bd83bc7cd feat: 支持 v2 插件、独立前端和签名制品发布 (#130)
* feat: 支持 v2 插件、原生扩展与签名发布

* fix: 修复测试

* feat: 增强宿主 SDK、运行观测与制品维护能力

* feat: 增强文件传输、配置观测与本地开发能力

* feat: 支持 SSE 实时事件流并完善开发脚手架

* feat: 完善长连接鉴权复核与关闭回收

* feat: 增强生命周期与任务关闭可靠性

* feat: 收紧健康检查契约并补齐前端与真实网络验收

* feat: 增加SDK溯源与离线更新工具并验证跨版本兼容

* feat: 增加持久化业务示例与受控 Python 交付

* feat: 增加统一运行诊断与多worker状态观测

* feat: 增加固定目标发布等待与自动验收

* fix: 修复多环境插件部署前缀与代理配置不一致

* fix: 修复测试
2026-10-09 23:49:45 +08:00

56 lines
2.5 KiB
Python

import re
from pathlib import Path
import pytest
from sqlalchemy import CheckConstraint
from sqlalchemy.dialects import mysql, postgresql
from sqlalchemy.schema import CreateTable
from plugins.core.lifecycle.script import PluginLifecycleScriptHelper
from plugins.core.management.entity.do.release_models import SysPluginArtifact, SysPluginRelease, SysPluginWorker
SQL_ROOT = Path(__file__).resolve().parents[2] / 'sql'
@pytest.mark.parametrize(
('initial', 'time_type'),
[
('ruoyi-fastapi.sql', 'datetime(3)'),
('ruoyi-fastapi-pg.sql', 'timestamp(3) with time zone'),
],
)
def test_initial_release_schema_matches_models(initial: str, time_type: str) -> None:
initialization = (SQL_ROOT / initial).read_text(encoding='utf-8')
statements = PluginLifecycleScriptHelper.split_sql_statements(initialization)
for table in (SysPluginArtifact.__table__, SysPluginRelease.__table__, SysPluginWorker.__table__):
table_statements = [
statement
for statement in statements
if re.match(rf'CREATE\s+TABLE\s+IF\s+NOT\s+EXISTS\s+{table.name}\s*\(', statement, re.IGNORECASE)
]
assert len(table_statements) == 1
ddl = table_statements[0].lower()
normalized_ddl = ' '.join(ddl.split())
assert time_type in ddl
for column in table.columns:
assert re.search(rf'^\s*{column.name}\s+\w+', ddl, re.MULTILINE)
primary_keys = ', '.join(column.name for column in table.primary_key.columns)
assert f'primary key ({primary_keys})' in normalized_ddl
for constraint in table.constraints:
if isinstance(constraint, CheckConstraint):
assert f'constraint {constraint.name} check ({constraint.sqltext})' in normalized_ddl
for index in table.indexes:
columns = ', '.join(column.name for column in index.columns)
if initial == 'ruoyi-fastapi-pg.sql':
assert f'create index if not exists {index.name} on {table.name} ({columns})' in statements
else:
assert f'key {index.name} ({columns})' in normalized_ddl
@pytest.mark.parametrize('dialect', [mysql.dialect(), postgresql.dialect()])
def test_release_orm_schema_compiles_for_supported_database_dialects(dialect: object) -> None:
for model in (SysPluginArtifact, SysPluginRelease, SysPluginWorker):
ddl = str(CreateTable(model.__table__).compile(dialect=dialect))
assert model.__tablename__ in ddl
assert 'PRIMARY KEY' in ddl