"""Small import fallbacks for running focused tests without optional services.""" import sys import types try: import psycopg2 # noqa: F401 except ModuleNotFoundError: psycopg2 = types.ModuleType("psycopg2") extras = types.ModuleType("psycopg2.extras") errors = types.ModuleType("psycopg2.errors") class Json: def __init__(self, adapted): self.adapted = adapted class RealDictCursor: pass class UniqueViolation(Exception): pass def connect(**_kwargs): raise AssertionError("Tests must mock PostgreSQL connections") def execute_values(*_args, **_kwargs): raise AssertionError("Tests must mock bulk PostgreSQL writes") extras.Json = Json extras.RealDictCursor = RealDictCursor extras.execute_values = execute_values errors.UniqueViolation = UniqueViolation psycopg2.connect = connect psycopg2.extras = extras psycopg2.errors = errors sys.modules["psycopg2"] = psycopg2 sys.modules["psycopg2.extras"] = extras sys.modules["psycopg2.errors"] = errors try: import bcrypt # noqa: F401 except ModuleNotFoundError: bcrypt = types.ModuleType("bcrypt") def unavailable(*_args, **_kwargs): raise AssertionError("Tests exercising bcrypt require project dependencies") bcrypt.gensalt = unavailable bcrypt.hashpw = unavailable bcrypt.checkpw = unavailable sys.modules["bcrypt"] = bcrypt try: import jwt # noqa: F401 except ModuleNotFoundError: jwt = types.ModuleType("jwt") exceptions = types.ModuleType("jwt.exceptions") class ExpiredSignatureError(Exception): pass class InvalidTokenError(Exception): pass def unavailableJwt(*_args, **_kwargs): raise AssertionError("Tests exercising JWT encoding require project dependencies") jwt.encode = unavailableJwt jwt.decode = unavailableJwt exceptions.ExpiredSignatureError = ExpiredSignatureError exceptions.InvalidTokenError = InvalidTokenError jwt.exceptions = exceptions sys.modules["jwt"] = jwt sys.modules["jwt.exceptions"] = exceptions