commits
tags
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