File size: 3,048 Bytes
6aecb2e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import importlib.util
import logging
import sys
import types
from pathlib import Path


ROOT = Path(__file__).resolve().parents[1]
EXPORT_SUPPORT_PATH = ROOT / "src" / "landppt" / "web" / "route_modules" / "export_support.py"
WEB_DIR = ROOT / "src" / "landppt" / "web"
ROUTE_MODULES_DIR = WEB_DIR / "route_modules"


def _load_export_support_module():
    import landppt

    web_pkg = types.ModuleType("landppt.web")
    web_pkg.__path__ = [str(WEB_DIR)]
    route_modules_pkg = types.ModuleType("landppt.web.route_modules")
    route_modules_pkg.__path__ = [str(ROUTE_MODULES_DIR)]
    support_module = types.ModuleType("landppt.web.route_modules.support")
    support_module.logger = logging.getLogger("test.export_support")

    original_web = sys.modules.get("landppt.web")
    original_route_modules = sys.modules.get("landppt.web.route_modules")
    original_support = sys.modules.get("landppt.web.route_modules.support")
    sys.modules["landppt.web"] = web_pkg
    sys.modules["landppt.web.route_modules"] = route_modules_pkg
    sys.modules["landppt.web.route_modules.support"] = support_module
    setattr(landppt, "web", web_pkg)

    module_name = "landppt.web.route_modules._export_support_test"
    spec = importlib.util.spec_from_file_location(module_name, EXPORT_SUPPORT_PATH)
    assert spec is not None and spec.loader is not None

    module = importlib.util.module_from_spec(spec)
    sys.modules[module_name] = module
    try:
        spec.loader.exec_module(module)
        return module
    finally:
        sys.modules.pop(module_name, None)
        if original_web is not None:
            sys.modules["landppt.web"] = original_web
            setattr(landppt, "web", original_web)
        else:
            sys.modules.pop("landppt.web", None)
            if hasattr(landppt, "web"):
                delattr(landppt, "web")

        if original_route_modules is not None:
            sys.modules["landppt.web.route_modules"] = original_route_modules
        else:
            sys.modules.pop("landppt.web.route_modules", None)

        if original_support is not None:
            sys.modules["landppt.web.route_modules.support"] = original_support
        else:
            sys.modules.pop("landppt.web.route_modules.support", None)


def test_image_pptx_export_request_validates_after_model_rebuild():
    module = _load_export_support_module()
    payload = module.ImagePPTXExportRequest.model_validate(
        {
            "slides": [
                {
                    "index": 1,
                    "html_content": "<div>slide</div>",
                    "title": "封面",
                }
            ],
            "images": [
                {
                    "index": 1,
                    "data": "base64-data",
                    "width": 1280,
                    "height": 720,
                }
            ],
        }
    )

    assert payload.slides is not None
    assert payload.slides[0]["index"] == 1
    assert payload.images is not None
    assert payload.images[0]["width"] == 1280