Skip to content

Commit

Permalink
Make sure that blueprints with no slash is maintained when applied (#…
Browse files Browse the repository at this point in the history
…2085)

* Make sure that blueprints with no slash is maintained when applied

* Remove unneeded import
  • Loading branch information
ahopkins authored Mar 23, 2021
1 parent 4998fd5 commit dfd1787
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 2 deletions.
6 changes: 5 additions & 1 deletion sanic/blueprints.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,11 @@ def __init__(
self.routes: List[Route] = []
self.statics: List[RouteHandler] = []
self.strict_slashes = strict_slashes
self.url_prefix = url_prefix
self.url_prefix = (
url_prefix[:-1]
if url_prefix and url_prefix.endswith("/")
else url_prefix
)
self.version = version
self.websocket_routes: List[Route] = []

Expand Down
2 changes: 1 addition & 1 deletion sanic/mixins/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ def route(

# Fix case where the user did not prefix the URL with a /
# and will probably get confused as to why it's not working
if not uri.startswith("/"):
if not uri.startswith("/") and (uri or hasattr(self, "router")):
uri = "/" + uri

if strict_slashes is None:
Expand Down
56 changes: 56 additions & 0 deletions tests/test_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -1175,3 +1175,59 @@ async def handler(request):

with pytest.raises(SanicException):
app.router.finalize()


def test_routes_with_and_without_slash_definitions(app):
bar = Blueprint("bar", url_prefix="bar")
baz = Blueprint("baz", url_prefix="/baz")
fizz = Blueprint("fizz", url_prefix="fizz/")
buzz = Blueprint("buzz", url_prefix="/buzz/")

instances = (
(app, "foo"),
(bar, "bar"),
(baz, "baz"),
(fizz, "fizz"),
(buzz, "buzz"),
)

for instance, term in instances:
route = f"/{term}" if isinstance(instance, Sanic) else ""

@instance.get(route, strict_slashes=True)
def get_without(request):
return text(f"{term}_without")

@instance.get(f"{route}/", strict_slashes=True)
def get_with(request):
return text(f"{term}_with")

@instance.post(route, strict_slashes=True)
def post_without(request):
return text(f"{term}_without")

@instance.post(f"{route}/", strict_slashes=True)
def post_with(request):
return text(f"{term}_with")

app.blueprint(bar)
app.blueprint(baz)
app.blueprint(fizz)
app.blueprint(buzz)

for _, term in instances:
_, response = app.test_client.get(f"/{term}")
assert response.status == 200
assert response.text == f"{term}_without"

_, response = app.test_client.get(f"/{term}/")
assert response.status == 200
assert response.text == f"{term}_with"

_, response = app.test_client.post(f"/{term}")
assert response.status == 200
assert response.text == f"{term}_without"

_, response = app.test_client.post(f"/{term}/")
assert response.status == 200
assert response.text == f"{term}_with"

0 comments on commit dfd1787

Please sign in to comment.