65 lines
1.9 KiB
Python
65 lines
1.9 KiB
Python
import importlib
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
from werkzeug.security import generate_password_hash
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(ROOT / 'po_app'))
|
|
PASSWORD = 'Test-only-Password-2026'
|
|
|
|
|
|
@pytest.fixture(scope='session')
|
|
def module(tmp_path_factory):
|
|
os.environ['PO_DATA_DIR'] = str(tmp_path_factory.mktemp('po-data'))
|
|
os.environ.pop('PO_SECRET_KEY', None)
|
|
result = importlib.import_module('app')
|
|
result.app.config['TESTING'] = True
|
|
yield result
|
|
result.engine.dispose()
|
|
|
|
|
|
@pytest.fixture
|
|
def app(module):
|
|
from models import Base
|
|
Base.metadata.drop_all(module.engine)
|
|
Base.metadata.create_all(module.engine)
|
|
hashed = generate_password_hash(PASSWORD)
|
|
with module.Session() as db:
|
|
for name, role in [('admin', 'admin'), ('maker', 'maker'), ('other', 'maker'),
|
|
('reviewer', 'approver'), ('approver', 'approver')]:
|
|
db.add(module.User(username=name, name=name, role=role, active=True,
|
|
session_version=1, must_change_password=False, password_hash=hashed))
|
|
db.commit()
|
|
return module
|
|
|
|
|
|
def post(client, path, data=None, **kwargs):
|
|
with client.session_transaction() as sess:
|
|
token = sess.get('csrf_token')
|
|
if not token:
|
|
client.get('/login')
|
|
with client.session_transaction() as sess:
|
|
token = sess['csrf_token']
|
|
if data is None:
|
|
data = {}
|
|
data = data.copy()
|
|
data['csrf_token'] = token
|
|
return client.post(path, data=data, **kwargs)
|
|
|
|
|
|
def login(app, name):
|
|
client = app.app.test_client()
|
|
client.get('/login')
|
|
response = post(client, '/login', {'username': name, 'password': PASSWORD})
|
|
assert response.status_code == 302
|
|
client.get(response.location)
|
|
return client
|
|
|
|
|
|
@pytest.fixture
|
|
def clients(app):
|
|
return {name: login(app, name) for name in ('admin', 'maker', 'other', 'reviewer', 'approver')}
|