diff options
| -rw-r--r-- | tests/router.scm | 30 | ||||
| -rw-r--r-- | weeb/router.scm | 5 |
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) |