# -*- coding: utf-8 -*- """Flask 兼容会话编解码的单元测试(不依赖网络)。""" import time import pytest from flask import Flask from flask.sessions import SecureCookieSessionInterface from core import session as cs SECRET = 'unit-test-secret-key' @pytest.fixture() def flask_serializer(): app = Flask(__name__) app.secret_key = SECRET return SecureCookieSessionInterface().get_signing_serializer(app) def _flask_cookie(ser, data): return ser.dumps(data) def test_flask_to_core(flask_serializer): """Flask 签发的会话 Cookie 能被 core.session 解出。""" cookie = _flask_cookie(flask_serializer, {'site_uid': 26, 'site_uid_seq': 5}) data = cs.loads(SECRET, cookie) assert data == {'site_uid': 26, 'site_uid_seq': 5} assert cs.get_uid(data) == 26 def test_core_to_flask(flask_serializer): """core.session 签发(含时间戳)的 Cookie 能被 Flask 解出。""" cookie = cs.dumps(SECRET, {'site_uid': 74, 'site_uid_seq': 8}) assert flask_serializer.loads(cookie) == {'site_uid': 74, 'site_uid_seq': 8} def test_core_to_flask_expiry(flask_serializer): """时间戳格式正确:Flask 能按 max_age 校验(未过期可解)。""" cookie = cs.dumps(SECRET, {'site_uid': 1}) assert flask_serializer.loads(cookie, max_age=3600) == {'site_uid': 1} def test_tampered_returns_none(flask_serializer): cookie = _flask_cookie(flask_serializer, {'site_uid': 26}) assert cs.loads(SECRET, cookie[:-3] + 'xyz') is None def test_wrong_key_returns_none(flask_serializer): cookie = _flask_cookie(flask_serializer, {'site_uid': 26}) assert cs.loads('wrong-secret', cookie) is None def test_garbage_returns_none(): assert cs.loads(SECRET, 'not-a-cookie') is None assert cs.loads(SECRET, '') is None def test_roundtrip_selfconsistency(): payload = {'site_uid': 9, 'site_uid_seq': 3, 'site_uid_ts': int(time.time())} assert cs.loads(SECRET, cs.dumps(SECRET, payload)) == payload def test_get_uid_none(): assert cs.get_uid(None) is None assert cs.get_uid({}) is None