49 lines
1.7 KiB
Python
49 lines
1.7 KiB
Python
import re
|
|
|
|
import pytest
|
|
|
|
from skyvern.utils.templating import Constants, get_missing_variables
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"template,data,expected",
|
|
[
|
|
("", {}, set()),
|
|
("Hello {{ name }}", {"name": "World"}, set()),
|
|
("Hello {{ name }}", {"age": 30}, {"name"}),
|
|
("{{ one }}", {"one": 1, "two": 2}, set()), # extra vars allowed
|
|
# nested (dotted) variables
|
|
("{{ user.name }}", {"user": {"name": "Alice"}}, set()),
|
|
("{{ user.name }}", {"user": {"age": 30}}, {"user.name"}),
|
|
# list access
|
|
("{{ items[0] }}", {}, {"items"}),
|
|
("{{ items[0] }}", {"items": [1, 2, 3]}, set()),
|
|
("{{ items[0] }}", {"items": []}, {"items[0]"}),
|
|
# deeply nested lists and dicts
|
|
("{{ data.users[0].name }}", {"data": {"users": [{"name": "Bob"}]}}, set()),
|
|
("{{ data.users[0].name }}", {"data": {"users": [{}]}}, {"data.users[0].name"}),
|
|
("{{ data.users[0].name }}", {"data": {}}, {"data.users[0].name"}),
|
|
],
|
|
)
|
|
def test_get_missing_variables(template, data, expected):
|
|
missing_vars = get_missing_variables(template, data)
|
|
assert missing_vars == expected
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"template,expected",
|
|
[
|
|
("{{ var }}", {"var"}),
|
|
("{{ var.attr }}", {"var.attr"}),
|
|
("{{ var[0] }}", {"var[0]"}),
|
|
("{{ var['key'] }}", {"var['key']"}),
|
|
('{{ var["key"] }}', {'var["key"]'}),
|
|
("{{ var.attr[0] }}", {"var.attr[0]"}),
|
|
("No variables here", set()),
|
|
("{{ var1 }} and {{ var2.attr }}", {"var1", "var2.attr"}),
|
|
],
|
|
)
|
|
def test_regex_missing_variable_pattern(template, expected):
|
|
matches = set(re.findall(Constants.MissingVariablePattern, template))
|
|
assert matches == expected
|