| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- from __future__ import annotations
- from sqlalchemy import Computed, UniqueConstraint
- import dms.models # noqa: F401
- from dms.common.enums import (
- AllowedModule,
- AuditAction,
- AuditResult,
- AuditTarget,
- ContentExtractStatus,
- RoleCode,
- SecurityLevel,
- SECURITY_LEVEL_VALUES,
- )
- from dms.extensions import db
- EXPECTED_TABLES = {
- "sys_organization",
- "sys_user",
- "doc_category",
- "doc_document",
- "doc_attachment_binding",
- "doc_document_relation",
- "doc_sub_plan_binding",
- "doc_permission",
- "sys_audit_log",
- "sys_role",
- "sys_role_permission",
- "sys_ip_entry",
- "sys_org_ip_assignment",
- }
- BUSINESS_TABLES = EXPECTED_TABLES - {"sys_audit_log"}
- COMMON_COLUMNS = {
- "id",
- "created_by",
- "updated_by",
- "created_at",
- "updated_at",
- "deleted_at",
- "is_deleted",
- "row_version",
- }
- def test_expected_models_are_registered():
- assert set(db.metadata.tables) == EXPECTED_TABLES
- assert len(db.metadata.tables) == 13
- def test_business_tables_have_common_columns():
- for table_name in BUSINESS_TABLES:
- columns = {column.name for column in db.metadata.tables[table_name].columns}
- assert COMMON_COLUMNS <= columns
- def test_audit_log_has_append_only_exception_fields():
- columns = {
- column.name for column in db.metadata.tables["sys_audit_log"].columns
- }
- assert "created_at" in columns
- assert {"updated_at", "deleted_at", "is_deleted", "row_version"}.isdisjoint(
- columns
- )
- def test_auth_version_field_exists_with_default_zero():
- column = db.metadata.tables["sys_user"].c.auth_version
- assert column.nullable is False
- assert str(column.server_default.arg) == "0"
- def test_attachment_type_field_exists():
- column = db.metadata.tables["doc_document"].c.attachment_type
- assert column.nullable is True
- def test_active_marker_columns_are_virtual_generated_columns():
- for table_name in (
- "doc_attachment_binding",
- "doc_permission",
- "sys_role",
- "sys_role_permission",
- "sys_ip_entry",
- "sys_org_ip_assignment",
- "sys_user",
- "doc_sub_plan_binding",
- ):
- column = db.metadata.tables[table_name].c.active_marker
- assert isinstance(column.computed, Computed)
- assert "IF(is_deleted = 0, 1, NULL)" in str(column.computed.sqltext)
- assert column.computed.persisted is False
- def test_role_default_marker_is_virtual_generated_column():
- column = db.metadata.tables["sys_role"].c.default_marker
- assert isinstance(column.computed, Computed)
- assert "IF(is_default = 1 AND is_deleted = 0, 1, NULL)" in str(
- column.computed.sqltext
- )
- assert column.computed.persisted is False
- def _unique_column_sets(table_name: str) -> set[tuple[str, ...]]:
- table = db.metadata.tables[table_name]
- return {
- tuple(column.name for column in constraint.columns)
- for constraint in table.constraints
- if isinstance(constraint, UniqueConstraint)
- }
- def test_active_binding_unique_constraint():
- assert (
- "main_document_id",
- "attachment_document_id",
- "active_marker",
- ) in _unique_column_sets("doc_attachment_binding")
- def test_active_permission_unique_constraint():
- assert (
- "document_id",
- "subject_type",
- "subject_id",
- "active_marker",
- ) in _unique_column_sets("doc_permission")
- def test_role_tables_unique_constraints():
- assert ("role_name", "active_marker") in _unique_column_sets("sys_role")
- assert ("default_marker",) in _unique_column_sets("sys_role")
- assert (
- "role_id",
- "security_level",
- "dept_scope",
- "active_marker",
- ) in _unique_column_sets("sys_role_permission")
- def test_ip_tables_unique_constraints():
- assert ("ip_value", "active_marker") in _unique_column_sets("sys_ip_entry")
- assert (
- "organization_id",
- "ip_entry_id",
- "active_marker",
- ) in _unique_column_sets("sys_org_ip_assignment")
- def test_sub_plan_binding_unique_constraint_and_indexes():
- assert (
- "main_document_id",
- "sub_document_id",
- "active_marker",
- ) in _unique_column_sets("doc_sub_plan_binding")
- names = {
- index.name
- for index in db.metadata.tables["doc_sub_plan_binding"].indexes
- }
- assert {
- "ix_doc_sub_plan_binding_main_active_sort",
- "ix_doc_sub_plan_binding_sub_active",
- } <= names
- def test_portal_user_external_id_unique_constraint():
- assert ("external_id", "active_marker") in _unique_column_sets("sys_user")
- def test_no_foreign_key_uses_cascade_and_audit_has_no_foreign_keys():
- for table in db.metadata.tables.values():
- for foreign_key in table.foreign_keys:
- assert foreign_key.ondelete in {"RESTRICT", "NO ACTION"}
- assert foreign_key.ondelete != "CASCADE"
- assert not db.metadata.tables["sys_audit_log"].foreign_keys
- def test_created_and_updated_by_have_no_foreign_keys():
- for table_name in BUSINESS_TABLES:
- table = db.metadata.tables[table_name]
- assert not table.c.created_by.foreign_keys
- assert not table.c.updated_by.foreign_keys
- def test_required_permanent_unique_codes_exist():
- assert ("org_code", "active_marker") in _unique_column_sets("sys_organization")
- assert ("username",) in _unique_column_sets("sys_user")
- assert ("category_code", "active_marker") in _unique_column_sets("doc_category")
- def test_critical_indexes_exist():
- expected = {
- "doc_document": {
- "ix_doc_document_type_active_updated",
- "ix_doc_document_file_hash",
- "ix_doc_document_attachment_type_active_updated",
- },
- "sys_audit_log": {
- "ix_sys_audit_log_created_at",
- "ix_sys_audit_log_user_created",
- "ix_sys_audit_log_organization_created",
- "ix_sys_audit_log_action_created",
- "ix_sys_audit_log_target_created",
- "ix_sys_audit_log_result_created",
- "ix_sys_audit_log_request_id",
- },
- }
- for table_name, names in expected.items():
- actual = {index.name for index in db.metadata.tables[table_name].indexes}
- assert names <= actual
- def test_permission_model_has_no_inherited_source_column():
- assert "permission_source" not in db.metadata.tables["doc_permission"].c
- def test_contract_enums_are_exact():
- assert {item.value for item in RoleCode} == {"USER", "ADMIN"}
- assert {item.value for item in ContentExtractStatus} == {
- "SUCCESS",
- "EMPTY",
- "UNSUPPORTED",
- "FAILED",
- }
- assert {item.value for item in AllowedModule} == {
- "DOCUMENT_BROWSER",
- "BACKEND_MANAGEMENT",
- "AUDIT_LOG",
- "ORGANIZATION_USER_MANAGEMENT",
- }
- assert {item.value for item in AuditResult} == {"SUCCESS", "FAILURE"}
- assert {item.value for item in AuditAction} == {
- "LOGIN",
- "LOGOUT",
- "VIEW_DOCUMENT",
- "DOWNLOAD_DOCUMENT",
- "UPLOAD_DOCUMENT",
- "BATCH_IMPORT",
- "EDIT_DOCUMENT",
- "DELETE_DOCUMENT",
- "CREATE_CATEGORY",
- "EDIT_CATEGORY",
- "DELETE_CATEGORY",
- "CHANGE_PERMISSION",
- "BIND_ATTACHMENT",
- "UNBIND_ATTACHMENT",
- "RESTORE_DOCUMENT",
- "CREATE_ORGANIZATION",
- "EDIT_ORGANIZATION",
- "DELETE_ORGANIZATION",
- "CREATE_USER",
- "EDIT_USER",
- "DELETE_USER",
- "RESET_USER_PASSWORD",
- "REORDER_DOCUMENT",
- "REORDER_ATTACHMENT",
- "REORDER_CATEGORY",
- "CREATE_ROLE",
- "EDIT_ROLE",
- "DELETE_ROLE",
- "CHANGE_ROLE_PERMISSION",
- "CHANGE_ROLE_USER",
- "DOCUMENT_PASSWORD_SET",
- "DOCUMENT_PASSWORD_REMOVE",
- "CREATE_IP_ENTRY",
- "EDIT_IP_ENTRY",
- "DELETE_IP_ENTRY",
- "ASSIGN_ORG_IP",
- }
- assert {item.value for item in AuditTarget} == {
- "AUTH",
- "CATEGORY",
- "DOCUMENT",
- "ATTACHMENT",
- "PERMISSION",
- "ATTACHMENT_BINDING",
- "ORGANIZATION",
- "USER",
- "ROLE",
- "IP_ENTRY",
- }
- assert SECURITY_LEVEL_VALUES == {
- SecurityLevel.PUBLIC: 10,
- SecurityLevel.INTERNAL: 20,
- SecurityLevel.SECRET: 30,
- SecurityLevel.CONFIDENTIAL: 40,
- SecurityLevel.TOP_SECRET: 50,
- }
|