foxygit / RPA-Remisser Log in
commits tags

/tests/test_export.py · 2.45 KB

raw
"""Det exporterade fristående scriptet."""

import ast
import types

from rpa.export import generate_standalone_script

FLOW = {
    "steps": [{"type": "goto", "url": "https://x.se"}],
    "settings": {"headless": True},
    "inputs": [{"name": "org_id", "default": "4"}],
    "input_sets": {"Test": {"org_id": "9"}, "Prod": {"org_id": "1"}},
}

GRAPH_FLOW = {
    "format": "graph",
    "nodes": [{"id": "n1", "type": "call_flow", "target": "#sub"}],
    "edges": [],
    "start": "n1",
    "settings": {},
    "subflows": [{"id": "sub", "name": "S",
                  "nodes": [{"id": "s1", "type": "wait", "seconds": 1}], "edges": []}],
}


def _script_module(name="flode"):
    src = generate_standalone_script(name, FLOW)
    ast.parse(src)  # måste vara giltig Python
    mod = types.ModuleType("exported")
    # kör bara toppnivån utan att importera rpa (klipp bort import-raderna + main-anropet)
    body = "\n".join(
        line for line in src.splitlines()
        if not line.startswith(("import argparse", "from rpa", "    main()", 'if __name__'))
    )
    exec(compile(body, "<exported>", "exec"), mod.__dict__)  # noqa: S102
    return mod


def test_script_is_valid_python_and_embeds_inputs():
    mod = _script_module()
    assert mod.INPUTS == FLOW["inputs"]
    assert mod.INPUT_SETS == FLOW["input_sets"]


def test_build_initial_vars_merge_order():
    mod = _script_module()
    assert mod.build_initial_vars(None, []) == {"org_id": "4"}          # default
    assert mod.build_initial_vars("Test", []) == {"org_id": "9"}         # set vinner över default
    assert mod.build_initial_vars("Test", ["org_id=99"]) == {"org_id": "99"}  # --var vinner över set
    assert mod.build_initial_vars(None, ["nytt=x"]) == {"org_id": "4", "nytt": "x"}


def test_build_initial_vars_errors():
    mod = _script_module()
    import pytest

    with pytest.raises(SystemExit):
        mod.build_initial_vars("Saknas", [])
    with pytest.raises(SystemExit):
        mod.build_initial_vars(None, ["utan_likhetstecken"])


def test_script_embeds_subflows():
    src = generate_standalone_script("m", GRAPH_FLOW)
    ast.parse(src)
    mod = types.ModuleType("exported")
    body = "\n".join(
        line for line in src.splitlines()
        if not line.startswith(("import argparse", "from rpa", "    main()", 'if __name__'))
    )
    exec(compile(body, "<exported>", "exec"), mod.__dict__)  # noqa: S102
    assert mod.SUBFLOWS[0]["id"] == "sub"
    assert mod.NODES[0]["type"] == "call_flow"