Coverage for src/pypermission/util/exception_handling.py: 77%
29 statements
« prev ^ index » next coverage.py v7.11.3, created at 2025-12-01 18:06 +0000
« prev ^ index » next coverage.py v7.11.3, created at 2025-12-01 18:06 +0000
1from sqlite3 import IntegrityError as Sqlite3IntegrityError
2from typing import TYPE_CHECKING, Never
4from sqlalchemy.exc import IntegrityError
6from pypermission.exc import PyPermissionError
7from pypermission.models import Policy
9if TYPE_CHECKING:
10 from psycopg.errors import Diagnostic as PsycopgDiagnostic
11 from psycopg.errors import ForeignKeyViolation as PsycopgForeignKeyViolation
12 from psycopg.errors import UniqueViolation as PsycopgUniqueViolation
13else:
14 try:
15 from psycopg.errors import Diagnostic as PsycopgDiagnostic
16 from psycopg.errors import ForeignKeyViolation as PsycopgForeignKeyViolation
17 from psycopg.errors import UniqueViolation as PsycopgUniqueViolation
18 except ModuleNotFoundError:
20 class PsycopgForeignKeyViolation(Exception): ...
22 class PsycopgUniqueViolation(Exception): ...
24 class PsycopgDiagnostic: ...
27################################################################################
28#### Error Utilities
29################################################################################
32def process_subject_role_integrity_error(
33 *, err: IntegrityError, subject: str, role: str
34) -> Never:
35 match err:
36 case IntegrityError(
37 orig=Sqlite3IntegrityError(sqlite_errorname=str(msg))
38 | PsycopgUniqueViolation(diag=PsycopgDiagnostic(message_detail=str(msg)))
39 ) if msg == "SQLITE_CONSTRAINT_PRIMARYKEY" or (
40 f"Key (role_id, subject_id)=({role}, {subject}) already exists." in msg
41 ):
42 raise PyPermissionError(
43 f"Conflict: Role with ID '{role}' already assigned to Subject with ID '{subject}'!"
44 )
45 case IntegrityError(
46 orig=Sqlite3IntegrityError(sqlite_errorname="SQLITE_CONSTRAINT_FOREIGNKEY")
47 ):
48 raise PyPermissionError(
49 f"Subject '{subject}' or Role '{role}' does not exist!"
50 )
51 case IntegrityError(
52 orig=PsycopgForeignKeyViolation(
53 diag=PsycopgDiagnostic(message_detail=str(msg))
54 )
55 ) if (f"Key (role_id)=({role}) is not present in table" in msg):
56 raise PyPermissionError(f"Role '{role}' does not exist!")
57 case IntegrityError(
58 orig=PsycopgForeignKeyViolation(
59 diag=PsycopgDiagnostic(message_detail=str(msg))
60 )
61 ) if (f"Key (subject_id)=({subject}) is not present in table" in msg):
62 raise PyPermissionError(f"Subject '{subject}' does not exist!")
63 case _: # pragma: no cover
64 ...
65 raise PyPermissionError("Unexpected IntegrityError") # pragma: no cover
68def process_policy_integrity_error(
69 *,
70 err: IntegrityError,
71 policy: Policy,
72) -> Never:
73 match err:
74 case IntegrityError(
75 orig=Sqlite3IntegrityError(sqlite_errorname="SQLITE_CONSTRAINT_PRIMARYKEY")
76 | PsycopgUniqueViolation(diag=PsycopgDiagnostic(message_detail=str()))
77 ):
78 raise PyPermissionError(
79 f"Conflict: Policy '{str(policy)}' already exists!"
80 ) from err
81 case IntegrityError(
82 orig=Sqlite3IntegrityError(sqlite_errorname="SQLITE_CONSTRAINT_FOREIGNKEY")
83 | PsycopgForeignKeyViolation(diag=PsycopgDiagnostic(message_detail=str()))
84 ):
85 raise PyPermissionError(f"Role '{policy.role}' does not exist!") from err
86 case _: # pragma: no cover
87 ...
88 raise PyPermissionError("Unexpected IntegrityError") # pragma: no cover