182 lines
4.3 KiB
Python
182 lines
4.3 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
pytest 配置和 fixtures
|
|
|
|
Author: PANJIT IT Team
|
|
Created: 2024-01-28
|
|
Modified: 2024-01-28
|
|
"""
|
|
|
|
import pytest
|
|
import tempfile
|
|
import os
|
|
from pathlib import Path
|
|
from app import create_app, db
|
|
from app.models.user import User
|
|
from app.models.job import TranslationJob
|
|
|
|
|
|
@pytest.fixture(scope='session')
|
|
def app():
|
|
"""建立測試應用程式"""
|
|
# 建立臨時資料庫
|
|
db_fd, db_path = tempfile.mkstemp()
|
|
|
|
# 測試配置
|
|
test_config = {
|
|
'TESTING': True,
|
|
'SQLALCHEMY_DATABASE_URI': f'sqlite:///{db_path}',
|
|
'WTF_CSRF_ENABLED': False,
|
|
'SECRET_KEY': 'test-secret-key',
|
|
'UPLOAD_FOLDER': tempfile.mkdtemp(),
|
|
'MAX_CONTENT_LENGTH': 26214400,
|
|
'SMTP_SERVER': 'localhost',
|
|
'SMTP_PORT': 25,
|
|
'SMTP_SENDER_EMAIL': 'test@example.com',
|
|
'LDAP_SERVER': 'localhost',
|
|
'LDAP_PORT': 389,
|
|
'LDAP_BIND_USER_DN': 'test',
|
|
'LDAP_BIND_USER_PASSWORD': 'test',
|
|
'LDAP_SEARCH_BASE': 'dc=test',
|
|
'REDIS_URL': 'redis://localhost:6379/15' # 使用測試資料庫
|
|
}
|
|
|
|
app = create_app('testing')
|
|
|
|
# 覆蓋測試配置
|
|
for key, value in test_config.items():
|
|
app.config[key] = value
|
|
|
|
with app.app_context():
|
|
db.create_all()
|
|
yield app
|
|
db.drop_all()
|
|
|
|
os.close(db_fd)
|
|
os.unlink(db_path)
|
|
|
|
|
|
@pytest.fixture
|
|
def client(app):
|
|
"""建立測試客戶端"""
|
|
return app.test_client()
|
|
|
|
|
|
@pytest.fixture
|
|
def runner(app):
|
|
"""建立 CLI 測試執行器"""
|
|
return app.test_cli_runner()
|
|
|
|
|
|
@pytest.fixture
|
|
def auth_user(app):
|
|
"""建立測試使用者"""
|
|
with app.app_context():
|
|
user = User(
|
|
username='testuser',
|
|
display_name='Test User',
|
|
email='test@panjit.com.tw',
|
|
department='IT',
|
|
is_admin=False
|
|
)
|
|
db.session.add(user)
|
|
db.session.commit()
|
|
return user
|
|
|
|
|
|
@pytest.fixture
|
|
def admin_user(app):
|
|
"""建立管理員使用者"""
|
|
with app.app_context():
|
|
admin = User(
|
|
username='admin',
|
|
display_name='Admin User',
|
|
email='admin@panjit.com.tw',
|
|
department='IT',
|
|
is_admin=True
|
|
)
|
|
db.session.add(admin)
|
|
db.session.commit()
|
|
return admin
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_job(app, auth_user):
|
|
"""建立測試翻譯任務"""
|
|
with app.app_context():
|
|
job = TranslationJob(
|
|
user_id=auth_user.id,
|
|
original_filename='test.docx',
|
|
file_extension='.docx',
|
|
file_size=1024,
|
|
file_path='/tmp/test.docx',
|
|
source_language='auto',
|
|
target_languages=['en', 'vi'],
|
|
status='PENDING'
|
|
)
|
|
db.session.add(job)
|
|
db.session.commit()
|
|
return job
|
|
|
|
|
|
@pytest.fixture
|
|
def authenticated_client(client, auth_user):
|
|
"""已認證的測試客戶端"""
|
|
with client.session_transaction() as sess:
|
|
sess['user_id'] = auth_user.id
|
|
sess['username'] = auth_user.username
|
|
sess['is_admin'] = auth_user.is_admin
|
|
|
|
return client
|
|
|
|
|
|
@pytest.fixture
|
|
def admin_client(client, admin_user):
|
|
"""管理員測試客戶端"""
|
|
with client.session_transaction() as sess:
|
|
sess['user_id'] = admin_user.id
|
|
sess['username'] = admin_user.username
|
|
sess['is_admin'] = admin_user.is_admin
|
|
|
|
return client
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_file():
|
|
"""建立測試檔案"""
|
|
import io
|
|
|
|
# 建立假的 DOCX 檔案內容
|
|
file_content = b"Mock DOCX file content for testing"
|
|
|
|
return io.BytesIO(file_content)
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_dify_response():
|
|
"""模擬 Dify API 回應"""
|
|
return {
|
|
'answer': 'This is a translated text.',
|
|
'metadata': {
|
|
'usage': {
|
|
'prompt_tokens': 10,
|
|
'completion_tokens': 5,
|
|
'total_tokens': 15,
|
|
'prompt_unit_price': 0.0001,
|
|
'prompt_price_unit': 'USD'
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_ldap_response():
|
|
"""模擬 LDAP 認證回應"""
|
|
return {
|
|
'username': 'testuser',
|
|
'display_name': 'Test User',
|
|
'email': 'test@panjit.com.tw',
|
|
'department': 'IT',
|
|
'user_principal_name': 'testuser@panjit.com.tw'
|
|
} |