aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/router.scm30
-rw-r--r--weeb/router.scm5
2 files changed, 27 insertions, 8 deletions
diff --git a/tests/router.scm b/tests/router.scm
index 59ec793..9d5befe 100644
--- a/tests/router.scm
+++ b/tests/router.scm
@@ -18,8 +18,9 @@
(use-modules (srfi srfi-11)
(srfi srfi-64)
- (weeb router)
(weeb request)
+ (weeb response)
+ (weeb router)
(weeb struct))
;; Private imports for testing purposes.
@@ -34,22 +35,22 @@
(test-group "simple static route"
(let-values (((re vars) (uri-template->regexp-string "/health")))
- (test-equal "/health" re)
+ (test-equal "^/health$" re)
(test-equal '() vars)))
(test-group "single variable route"
(let-values (((re vars) (uri-template->regexp-string "/user/:id:")))
- (test-equal "/user/([^/]+)" re)
+ (test-equal "^/user/([^/]+)$" re)
(test-equal '(id) vars)))
(test-group "multiple variables with trailing slash"
(let-values (((re vars) (uri-template->regexp-string "/org/:org_id:/user/:user_id:/")))
- (test-equal "/org/([^/]+)/user/([^/]+)" re)
+ (test-equal "^/org/([^/]+)/user/([^/]+)/?$" re)
(test-equal '(org_id user_id) vars)))
(test-group "middle variables"
(let-values (((re vars) (uri-template->regexp-string "/api/:version:/data")))
- (test-equal "/api/([^/]+)/data" re)
+ (test-equal "^/api/([^/]+)/data$" re)
(test-equal '(version) vars)))
(test-group "handle route"
@@ -57,10 +58,10 @@
(list id))
(define-router router
("/user/:id:" (GET) handler))
- (let* ((req (make-struct <request> 'GET "/user/123/" #f #f #f))
+ (let* ((req (make-struct <request> 'GET "/user/123" #f #f #f))
(route-obj (car router)))
(test-equal '("123") (handle-route req route-obj)))
- (let ((req (make-struct <request> 'POST "/user/123/" #f #f #f))
+ (let ((req (make-struct <request> 'POST "/user/123" #f #f #f))
(route-obj (car router)))
(test-eqv #f (handle-route req route-obj))))
@@ -94,4 +95,19 @@
(let ((req (make-struct <request> 'GET "/" #f #f #f)))
(test-equal "home" (iter-routes req router))))
+(test-group "edge cases 3: anchor validation"
+ (define-router router
+ ("/health" (GET) (lambda (r) "ok"))
+ ("/user/:id:" (GET) (lambda (r id) id))
+ ("/" (GET) (lambda (r) "home")))
+ (let* ((req (make-struct <request> 'GET "/health/extra" #f #f #f))
+ (res (any->response (iter-routes req router))))
+ (with-accessors (res code) (test-eqv 404 code)))
+ (let* ((req (make-struct <request> 'GET "/user/123/extra" #f #f #f))
+ (res (any->response (iter-routes req router))))
+ (with-accessors (res code) (test-eqv 404 code)))
+ (let* ((req (make-struct <request> 'GET "/anything" #f #f #f))
+ (res (any->response (iter-routes req router))))
+ (with-accessors (res code) (test-eqv 404 code))))
+
(test-end)
diff --git a/weeb/router.scm b/weeb/router.scm
index 689084a..20f129d 100644
--- a/weeb/router.scm
+++ b/weeb/router.scm
@@ -37,7 +37,10 @@
(substring template 1 (- (string-length template) 1))
(substring template 1))
#\/)))
- (values (string-append "/" (string-join (map cadr components) "/"))
+ (values (string-append "^/"
+ (string-join (map cadr components) "/")
+ (if trailing-slash? "/?" "")
+ "$")
(filter symbol? (map car components))))
(define (handle-route request route-object)

© 2015 - 2026 Jakob L. Kreuze