Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import pathlib
  2. import random
  3. import secrets
  4. from collections.abc import Generator
  5. import pytest
  6. from flask import Flask
  7. from flask.testing import FlaskClient
  8. from sqlalchemy.orm import Session
  9. from app_factory import create_app
  10. from extensions.ext_database import db
  11. from models import Account, DifySetup, Tenant, TenantAccountJoin
  12. from services.account_service import AccountService, RegisterService
  13. # Loading the .env file if it exists
  14. def _load_env():
  15. current_file_path = pathlib.Path(__file__).absolute()
  16. # Items later in the list have higher precedence.
  17. files_to_load = [".env", "vdb.env"]
  18. env_file_paths = [current_file_path.parent / i for i in files_to_load]
  19. for path in env_file_paths:
  20. if not path.exists():
  21. continue
  22. from dotenv import load_dotenv
  23. # Set `override=True` to ensure values from `vdb.env` take priority over values from `.env`
  24. load_dotenv(str(path), override=True)
  25. _load_env()
  26. _CACHED_APP = create_app()
  27. @pytest.fixture
  28. def flask_app() -> Flask:
  29. return _CACHED_APP
  30. @pytest.fixture(scope="session")
  31. def setup_account(request) -> Generator[Account, None, None]:
  32. """`dify_setup` completes the setup process for the Dify application.
  33. It creates `Account` and `Tenant`, and inserts a `DifySetup` record into the database.
  34. Most tests in the `controllers` package may require dify has been successfully setup.
  35. """
  36. with _CACHED_APP.test_request_context():
  37. rand_suffix = random.randint(int(1e6), int(1e7)) # noqa
  38. name = f"test-user-{rand_suffix}"
  39. email = f"{name}@example.com"
  40. RegisterService.setup(
  41. email=email,
  42. name=name,
  43. password=secrets.token_hex(16),
  44. ip_address="localhost",
  45. )
  46. with _CACHED_APP.test_request_context():
  47. with Session(bind=db.engine, expire_on_commit=False) as session:
  48. account = session.query(Account).filter_by(email=email).one()
  49. yield account
  50. with _CACHED_APP.test_request_context():
  51. db.session.query(DifySetup).delete()
  52. db.session.query(TenantAccountJoin).delete()
  53. db.session.query(Account).delete()
  54. db.session.query(Tenant).delete()
  55. db.session.commit()
  56. @pytest.fixture
  57. def flask_req_ctx():
  58. with _CACHED_APP.test_request_context():
  59. yield
  60. @pytest.fixture
  61. def auth_header(setup_account) -> dict[str, str]:
  62. token = AccountService.get_account_jwt_token(setup_account)
  63. return {"Authorization": f"Bearer {token}"}
  64. @pytest.fixture
  65. def test_client() -> Generator[FlaskClient, None, None]:
  66. with _CACHED_APP.test_client() as client:
  67. yield client