foxygit / RPA-Remisser Log in
commits tags

/tests/test_blocks.py · 2.9 KB

raw
import pytest

from rpa import blocks, config


@pytest.fixture(autouse=True)
def tmp_dirs(tmp_path, monkeypatch):
    user = tmp_path / "user"
    builtin = tmp_path / "builtin"
    user.mkdir()
    builtin.mkdir()
    monkeypatch.setattr(config, "BLOCKS_DIR", user)
    monkeypatch.setattr(config, "BUILTIN_BLOCKS_DIR", builtin)
    return user, builtin


def test_crud_round_trip():
    assert blocks.list_blocks() == []
    blocks.save_block("mitt block", {
        "description": "test",
        "steps": [{"type": "goto", "url": "https://x.se"}],
    })
    meta = blocks.list_blocks()
    assert meta == [{"name": "mitt block", "description": "test", "step_count": 1, "builtin": False}]

    b = blocks.load_block("mitt block")
    assert b["nodes"][0]["url"] == "https://x.se"
    assert b["builtin"] is False

    assert blocks.delete_block("mitt block") is True
    assert blocks.list_blocks() == []


def test_save_block_accepts_graph_form():
    blocks.save_block("grafblock", {
        "nodes": [{"id": "a", "type": "wait", "seconds": 1}, {"id": "b", "type": "wait", "seconds": 2}],
        "edges": [{"id": "e", "source": "a", "target": "b"}],
    })
    b = blocks.load_block("grafblock")
    assert [n["id"] for n in b["nodes"]] == ["a", "b"]
    assert len(b["edges"]) == 1


def test_builtin_and_user_union(tmp_dirs):
    _user, builtin = tmp_dirs
    import json

    (builtin / "shipped.json").write_text(
        json.dumps({"name": "shipped", "description": "b", "steps": [{"type": "wait", "seconds": 1}]}),
        encoding="utf-8",
    )
    blocks.save_block("egen", {"steps": [{"type": "wait", "seconds": 2}]})
    names = {b["name"]: b["builtin"] for b in blocks.list_blocks()}
    assert names == {"shipped": True, "egen": False}


def test_user_block_shadows_builtin(tmp_dirs):
    _user, builtin = tmp_dirs
    import json

    (builtin / "x.json").write_text(json.dumps({"name": "x", "steps": [{"type": "wait", "seconds": 1}]}), encoding="utf-8")
    blocks.save_block("x", {"steps": [{"type": "wait", "seconds": 9}]})
    assert blocks.load_block("x")["nodes"][0]["seconds"] == 9
    assert blocks.load_block("x")["builtin"] is False


def test_invalid_block_rejected():
    with pytest.raises(blocks.InvalidBlock):
        blocks.save_block("bad", {"steps": [{"type": "nonesuch"}]})
    with pytest.raises(blocks.InvalidBlockName):
        blocks.load_block("../secret")


def test_shipped_example_blocks_are_valid():
    """De medföljande blocken i repo-mappen blocks/ ska validera (som fragment)."""
    from rpa import config as real_config
    from rpa.migrate import flow_to_graph
    from rpa.schema import validate_graph

    for p in (real_config.ROOT_DIR / "blocks").glob("*.json"):
        import json

        data = json.loads(p.read_text(encoding="utf-8"))
        g = flow_to_graph(data)
        errors = [e for e in validate_graph(g, strict=False) if "startnod" not in e.lower()]
        assert errors == [], p.name