# What this PR does This PR adds new API endpoints for migrating routes from regex format to jinja2 format. The changes include the following: * `filtering_term_as_jinja2` field to GET `channels_filters` endpoint * A POST endpoint `channel_filters/ABCDEF123/convert_from_regex_to_jinja2/` for migrating routes to jinja2 format. These new endpoints will allow users to preview and migrate their existing regex routes to the more flexible and maintainable jinja2 format. Check the screenshot where this endpoints will be used <img width="407" alt="Screenshot 2023-04-14 at 09 50 23" src="https://user-images.githubusercontent.com/2262529/231920771-20792c7e-d6ef-4681-80e1-c82bb4aa4b8e.png"> ## Which issue(s) this PR fixes ## Checklist - [ ] Unit, integration, and e2e (if applicable) tests updated - [ ] Documentation added (or `pr:no public docs` PR label added if not required) - [ ] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not required)
98 lines
3.6 KiB
Python
98 lines
3.6 KiB
Python
import json
|
|
|
|
import pytest
|
|
from django.conf import settings
|
|
|
|
from common.jinja_templater import apply_jinja_template
|
|
from common.jinja_templater.apply_jinja_template import JinjaTemplateError, JinjaTemplateWarning
|
|
|
|
|
|
def test_apply_jinja_template():
|
|
payload = {"name": "test"}
|
|
rendered = apply_jinja_template("{{ payload | tojson_pretty }}", payload)
|
|
result = json.loads(rendered)
|
|
assert payload == result
|
|
|
|
|
|
def test_apply_jinja_template_json_dumps():
|
|
payload = {"name": "test"}
|
|
|
|
result = apply_jinja_template("{{ payload | json_dumps }}", payload)
|
|
expected = json.dumps(payload)
|
|
assert result == expected
|
|
|
|
|
|
def test_apply_jinja_template_regex_match():
|
|
payload = {"name": "test"}
|
|
|
|
assert apply_jinja_template("{{ payload.name | regex_match('.*') }}", payload) == "True"
|
|
assert apply_jinja_template("{{ payload.name | regex_match('tes') }}", payload) == "True"
|
|
assert apply_jinja_template("{{ payload.name | regex_match('test1') }}", payload) == "False"
|
|
|
|
# Check that exception is raised when regex is invalid
|
|
with pytest.raises(JinjaTemplateError):
|
|
apply_jinja_template("{{ payload.name | regex_match('*') }}", payload)
|
|
|
|
|
|
def test_apply_jinja_template_regex_search():
|
|
payload = {"name": "test"}
|
|
|
|
assert apply_jinja_template("{{ payload.name | regex_search('.*') }}", payload) == "True"
|
|
assert apply_jinja_template("{{ payload.name | regex_search('tes') }}", payload) == "True"
|
|
assert apply_jinja_template("{{ payload.name | regex_search('est') }}", payload) == "True"
|
|
assert apply_jinja_template("{{ payload.name | regex_search('test1') }}", payload) == "False"
|
|
|
|
# Check that exception is raised when regex is invalid
|
|
with pytest.raises(JinjaTemplateError):
|
|
apply_jinja_template("{{ payload.name | regex_search('*') }}", payload)
|
|
|
|
|
|
def test_apply_jinja_template_bad_syntax_error():
|
|
with pytest.raises(JinjaTemplateError):
|
|
apply_jinja_template("{{%", payload={})
|
|
|
|
|
|
def test_apply_jinja_template_unknown_filter_error():
|
|
with pytest.raises(JinjaTemplateError):
|
|
apply_jinja_template("{{ payload | to_json_pretty }}", payload={})
|
|
|
|
|
|
def test_apply_jinja_template_unsafe_error():
|
|
with pytest.raises(JinjaTemplateError):
|
|
apply_jinja_template("{{ payload.__init__() }}", payload={})
|
|
|
|
|
|
def test_apply_jinja_template_restricted_error():
|
|
with pytest.raises(JinjaTemplateError):
|
|
apply_jinja_template("{% for n in range(100) %}Hello{% endfor %}", payload={})
|
|
|
|
|
|
def test_apply_jinja_template_restricted_inside_conditional():
|
|
template = "{% if 'blabla' in payload %}{% for n in range(100) %}Hello{% endfor %}{% endif %}"
|
|
# No exception when condition == False
|
|
apply_jinja_template(template, payload={})
|
|
with pytest.raises(JinjaTemplateError):
|
|
apply_jinja_template(template, payload={"blabla": "test"})
|
|
|
|
|
|
def test_apply_jinja_template_missing_field_warning():
|
|
with pytest.raises(JinjaTemplateWarning):
|
|
apply_jinja_template("{{ payload.field.name }}", payload={})
|
|
|
|
|
|
def test_apply_jinja_template_type_warning():
|
|
with pytest.raises(JinjaTemplateWarning):
|
|
apply_jinja_template("{{ payload.name + 25 }}", payload={"name": "test"})
|
|
|
|
|
|
def test_apply_jinja_template_too_large():
|
|
template = "test" * 20000
|
|
with pytest.raises(JinjaTemplateError):
|
|
apply_jinja_template(template, payload={})
|
|
|
|
|
|
def test_apply_jinja_template_result_truncate():
|
|
payload = {"value": "test" * 20000}
|
|
result = apply_jinja_template("{{ payload.value }}", payload)
|
|
# Length == Limit + 2 to account for '..' appended to end
|
|
assert len(result) == settings.JINJA_RESULT_MAX_LENGTH + 2
|