foxygit / RPA-Remisser Log in
commits tags

/tests/test_run_vars.py · 2.91 KB

raw
"""initial_vars: värden som matas in vid körning (flödets 'inputs' / värde-set)."""

import json

import pytest

from rpa import flow_engine, runs


def test_run_flow_seeds_initial_vars(tmp_path, monkeypatch):
    monkeypatch.setattr(flow_engine, "launch_context", lambda *a, **k: (_ for _ in ()).throw(AssertionError()))
    monkeypatch.setattr(flow_engine.config, "EXPORT_DIR", tmp_path)

    result: dict = {}
    flow_engine.run_flow(
        [
            {"type": "set_var", "var": "hälsning", "text": "Hej {namn}"},
            {"type": "save_var", "var": "hälsning", "filename": "ut.json"},
        ],
        log=lambda _m: None,
        initial_vars={"namn": "Världen"},
        on_finished=lambda err, v: result.update({"err": err, "vars": v}),
    )
    assert result["err"] is None
    assert result["vars"]["namn"] == "Världen"
    assert result["vars"]["hälsning"] == "Hej Världen"
    assert json.loads((tmp_path / "ut.json").read_text(encoding="utf-8")) == "Hej Världen"


def test_initial_vars_stringified():
    """Motorn tvingar nycklar till str (frontend kan skicka annat)."""
    result: dict = {}
    flow_engine.run_flow(
        [{"type": "set_var", "var": "x", "text": "{a}-{b}"}],
        log=lambda _m: None,
        initial_vars={"a": 1, "b": True},
        on_finished=lambda err, v: result.update({"vars": v}),
    )
    assert result["vars"]["x"] == "1-True"


def test_start_run_propagates_initial_vars(monkeypatch):
    seen: dict = {}

    def fake_run_flow(steps, **kw):
        seen.update(kw)
        kw.get("on_finished") and kw["on_finished"](None, {})

    monkeypatch.setattr(runs, "run_flow", fake_run_flow)
    runs.start_run([], initial_vars={"k": "v"}, entry_subflow="sub1")
    import time

    time.sleep(0.1)
    assert seen.get("initial_vars") == {"k": "v"}
    assert seen.get("entry_subflow") == "sub1"


def test_entry_subflow_runs_only_that_subgraph():
    flow = {
        "format": "graph",
        "nodes": [{"id": "a", "type": "set_var", "var": "main_ran", "text": "yes"}],
        "edges": [], "start": "a", "settings": {},
        "subflows": [{
            "id": "calc", "name": "Calc",
            "nodes": [{"id": "s", "type": "set_var", "var": "y", "text": "{x}!"}],
            "edges": [], "start": "s", "inputs": [{"name": "x"}],
        }],
    }
    result: dict = {}
    flow_engine.run_flow(
        flow, log=lambda _m: None, initial_vars={"x": "hej"}, entry_subflow="calc",
        on_finished=lambda err, v: result.update({"err": err, "vars": v}),
    )
    assert result["err"] is None
    assert result["vars"]["y"] == "hej!"
    assert "main_ran" not in result["vars"]


def test_entry_subflow_unknown_id_errors():
    result: dict = {}
    flow_engine.run_flow(
        {"format": "graph", "nodes": [], "edges": [], "subflows": []},
        log=lambda _m: None, entry_subflow="nope",
        on_finished=lambda err, v: result.update({"err": err}),
    )
    assert result["err"] is not None