Skip to content

Commit

Permalink
More arg fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
danjac committed Apr 2, 2021
1 parent 0453aa6 commit a79fef9
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 26 deletions.
16 changes: 4 additions & 12 deletions src/turbo_response/frame.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
# Standard Library
from typing import Any, Dict, List, Optional, Union

# Django
from django.http import HttpRequest

# Local
from .response import TurboFrameResponse, TurboFrameTemplateResponse, render_turbo_frame
from .template import render_turbo_frame_template

Expand Down Expand Up @@ -59,27 +56,22 @@ def __init__(self, dom_id: str):
"""
self.dom_id = dom_id

def render(self, content: str = "", is_safe: bool = False) -> str:
def render(self, content: str = "", **kwargs) -> str:
"""
:param content: enclosed content
:param is_safe: mark content safe for HTML escaping.
:return: a *<turbo-frame>* string
"""
return render_turbo_frame(dom_id=self.dom_id, content=content, is_safe=is_safe)
return render_turbo_frame(dom_id=self.dom_id, content=content, **kwargs)

def response(
self, content: str = "", is_safe: bool = False, **response_kwargs
) -> TurboFrameResponse:
def response(self, content: str = "", **kwargs) -> TurboFrameResponse:
"""
:param content: enclosed content
:param is_safe: mark content safe for HTML escaping.
:return: a *<turbo-frame>* HTTP response
"""
return TurboFrameResponse(
dom_id=self.dom_id, content=content, is_safe=is_safe, **response_kwargs
)
return TurboFrameResponse(dom_id=self.dom_id, content=content, **kwargs)

def template(
self,
Expand Down
6 changes: 5 additions & 1 deletion src/turbo_response/template.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

# Local
from .constants import Action
from .renderers import render_turbo_frame, render_turbo_stream
from .renderers import BaseRenderer, render_turbo_frame, render_turbo_stream


def render_turbo_stream_template(
Expand All @@ -15,6 +15,7 @@ def render_turbo_stream_template(
*,
action: Action,
target: str,
renderer: Optional[BaseRenderer] = None,
**template_kwargs
) -> str:
"""Renders a *<turbo-stream>* template.
Expand All @@ -38,6 +39,7 @@ def render_turbo_stream_template(
**template_kwargs,
).strip(),
is_safe=True,
renderer=renderer,
)


Expand All @@ -46,6 +48,7 @@ def render_turbo_frame_template(
context: Optional[Dict[str, Any]] = None,
*,
dom_id: str,
renderer: Optional[BaseRenderer] = None,
**kwargs
) -> str:
"""Renders a *<turbo-frame>* template.
Expand All @@ -67,4 +70,5 @@ def render_turbo_frame_template(
**kwargs,
).strip(),
is_safe=True,
renderer=renderer,
)
45 changes: 44 additions & 1 deletion src/turbo_response/tests/test_frame.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
# Django Turbo Response
from turbo_response import TurboFrame
from turbo_response.renderers import Jinja2


class TestTurboFrame:
def test_render(self):
s = TurboFrame("my-form").render("OK")
assert s == '<turbo-frame id="my-form">OK</turbo-frame>'

def test_render_jinja2(self):
s = TurboFrame("my-form").render("OK", renderer=Jinja2())
assert s == '<turbo-frame id="my-form">OK</turbo-frame>'

def test_render_xss(self):
s = TurboFrame("my-form").render("<script></script>")
assert (
Expand All @@ -26,12 +30,27 @@ def test_template(self):
assert "my content" in s
assert '<turbo-frame id="my-form">' in s

def test_template_jinja2(self):
s = (
TurboFrame("my-form")
.template("simple.html", {"msg": "my content"})
.render(renderer=Jinja2())
)
assert "my content" in s
assert '<turbo-frame id="my-form">' in s

def test_response(self):
resp = TurboFrame("my-form").response("OK")
assert resp.status_code == 200
assert b"OK" in resp.content
assert b'<turbo-frame id="my-form"' in resp.content

def test_response_jinja2(self):
resp = TurboFrame("my-form").response("OK", renderer=Jinja2())
assert resp.status_code == 200
assert b"OK" in resp.content
assert b'<turbo-frame id="my-form"' in resp.content

def test_response_xss(self):
resp = TurboFrame("my-form").response("<script></script>")
assert resp.status_code == 200
Expand All @@ -54,6 +73,16 @@ def test_template_render(self, rf):
assert "my content" in s
assert '<turbo-frame id="my-form"' in s

def test_template_render_jinja2(self, rf):
req = rf.get("/")
s = (
TurboFrame("my-form")
.template("simple.html", {"msg": "my content"}, request=req)
.render(renderer=Jinja2())
)
assert "my content" in s
assert '<turbo-frame id="my-form"' in s

def test_template_render_xss(self, rf):
req = rf.get("/")
s = (
Expand Down Expand Up @@ -88,6 +117,20 @@ def test_template_response(self, rf):
assert b"my content" in content
assert b'<turbo-frame id="my-form"' in content

def test_template_response_jinja2(self, rf):
req = rf.get("/")
resp = (
TurboFrame("my-form")
.template("simple.html", {"msg": "my content"}, request=req)
.response(renderer=Jinja2())
)
assert resp.status_code == 200
assert "is_turbo_frame" in resp.context_data
assert resp._request == req
content = resp.render().content
assert b"my content" in content
assert b'<turbo-frame id="my-form"' in content

def test_template_response_req_in_arg(self, rf):
req = rf.get("/")
resp = (
Expand Down
48 changes: 40 additions & 8 deletions src/turbo_response/tests/test_stream.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,31 @@
# Django Turbo Response
from turbo_response import TurboStream
from turbo_response.renderers import Jinja2


class TestTurboStream:
def test_render(self):
s = TurboStream("my-form").append.render("OK").strip()
s = TurboStream("my-form").append.render("OK")
assert (
s
== '<turbo-stream action="append" target="my-form"><template>OK</template></turbo-stream>'
)

def test_render_jinja2(self):
s = TurboStream("my-form").append.render("OK", renderer=Jinja2())
assert (
s
== '<turbo-stream action="append" target="my-form"><template>OK</template></turbo-stream>'
)

def test_render_xss(self):
s = TurboStream("my-form").append.render("<script></script>").strip()
s = TurboStream("my-form").append.render("<script></script>")
assert (
s
== '<turbo-stream action="append" target="my-form"><template>&lt;script&gt;&lt;/script&gt;</template></turbo-stream>'
)

def test_render_is_safe(self):
s = (
TurboStream("my-form")
.append.render("<script></script>", is_safe=True)
.strip()
)
s = TurboStream("my-form").append.render("<script></script>", is_safe=True)
assert (
s
== '<turbo-stream action="append" target="my-form"><template><script></script></template></turbo-stream>'
Expand All @@ -37,6 +40,15 @@ def test_template(self):
assert "my content" in s
assert '<turbo-stream action="append" target="my-form">' in s

def test_template_jinja2(self):
s = (
TurboStream("my-form")
.append.template("simple.html", {"msg": "my content"})
.render(renderer=Jinja2())
)
assert "my content" in s
assert '<turbo-stream action="append" target="my-form">' in s

def test_template_xss(self):
s = (
TurboStream("my-form")
Expand Down Expand Up @@ -70,6 +82,12 @@ def test_response(self):
assert b"OK" in resp.content
assert b'<turbo-stream action="append" target="my-form"' in resp.content

def test_response_jinja2(self):
resp = TurboStream("my-form").append.response("OK", renderer=Jinja2())
assert resp.status_code == 200
assert b"OK" in resp.content
assert b'<turbo-stream action="append" target="my-form"' in resp.content

def test_response_xss(self):
resp = TurboStream("my-form").append.response("<script></script>")
assert resp.status_code == 200
Expand Down Expand Up @@ -109,3 +127,17 @@ def test_template_response(self, rf):
content = resp.render().content
assert b"<div>my content</div>" in content
assert b'<turbo-stream action="append" target="my-form"' in content

def test_template_response_jinja2(self, rf):
req = rf.get("/")
resp = (
TurboStream("my-form")
.append.template("simple.html", {"msg": "my content"})
.response(req, renderer=Jinja2())
)
assert resp.status_code == 200
assert "is_turbo_stream" in resp.context_data
assert resp._request == req
content = resp.render().content
assert b"<div>my content</div>" in content
assert b'<turbo-stream action="append" target="my-form"' in content
21 changes: 17 additions & 4 deletions src/turbo_response/tests/test_views.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
# Standard Library
import http

# Django
from django import forms
from django.views.generic import CreateView

# Third Party Libraries
import pytest

# Django Turbo Response
from turbo_response import Action
from turbo_response.mixins import TurboFormAdapterMixin
from turbo_response.renderers import Jinja2
from turbo_response.tests.testapp.forms import TodoForm
from turbo_response.tests.testapp.models import TodoItem
from turbo_response.views import (
Expand Down Expand Up @@ -357,6 +354,22 @@ def get_response_content(self):
assert resp["Content-Type"] == "text/html; charset=utf-8"
assert resp.content == b'<turbo-frame id="test">done</turbo-frame>'

def test_get_jinja2(self, rf):
class MyView(TurboFrameView):
turbo_frame_dom_id = "test"

def get_response_content(self):
return "done"

def render_turbo_frame(self):
return super().render_turbo_frame(renderer=Jinja2())

req = rf.get("/")
resp = MyView.as_view()(req)
assert resp.status_code == http.HTTPStatus.OK
assert resp["Content-Type"] == "text/html; charset=utf-8"
assert resp.content == b'<turbo-frame id="test">done</turbo-frame>'

def test_get_xss(self, rf):
class MyView(TurboFrameView):
turbo_frame_dom_id = "test"
Expand Down

0 comments on commit a79fef9

Please sign in to comment.