diff options
| author | mo khan <mo@mokhan.ca> | 2025-07-02 18:36:06 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2025-07-02 18:36:06 -0600 |
| commit | 8cdfa445d6629ffef4cb84967ff7017654045bc2 (patch) | |
| tree | 22f0b0907c024c78d26a731e2e1f5219407d8102 /vendor/matchit/tests/remove.rs | |
| parent | 4351c74c7c5f97156bc94d3a8549b9940ac80e3f (diff) | |
chore: add vendor directory
Diffstat (limited to 'vendor/matchit/tests/remove.rs')
| -rw-r--r-- | vendor/matchit/tests/remove.rs | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/vendor/matchit/tests/remove.rs b/vendor/matchit/tests/remove.rs new file mode 100644 index 00000000..3237ccde --- /dev/null +++ b/vendor/matchit/tests/remove.rs @@ -0,0 +1,265 @@ +use matchit::Router; + +struct RemoveTest { + routes: Vec<&'static str>, + ops: Vec<(Operation, &'static str, Option<&'static str>)>, + remaining: Vec<&'static str>, +} + +enum Operation { + Insert, + Remove, +} + +use Operation::*; + +impl RemoveTest { + fn run(self) { + let mut router = Router::new(); + + for route in self.routes.iter() { + assert_eq!(router.insert(*route, route.to_owned()), Ok(()), "{route}"); + } + + for (op, route, expected) in self.ops.iter() { + match op { + Insert => { + assert_eq!(router.insert(*route, route), Ok(()), "{route}") + } + Remove => { + assert_eq!(router.remove(*route), *expected, "removing {route}",) + } + } + } + + for route in self.remaining { + assert!(matches!(router.at(route), Ok(_)), "remaining {route}"); + } + } +} + +#[test] +fn normalized() { + RemoveTest { + routes: vec![ + "/x/{foo}/bar", + "/x/{bar}/baz", + "/{foo}/{baz}/bax", + "/{foo}/{bar}/baz", + "/{fod}/{baz}/{bax}/foo", + "/{fod}/baz/bax/foo", + "/{foo}/baz/bax", + "/{bar}/{bay}/bay", + "/s", + "/s/s", + "/s/s/s", + "/s/s/s/s", + "/s/s/{s}/x", + "/s/s/{y}/d", + ], + ops: vec![ + (Remove, "/x/{foo}/bar", Some("/x/{foo}/bar")), + (Remove, "/x/{bar}/baz", Some("/x/{bar}/baz")), + (Remove, "/{foo}/{baz}/bax", Some("/{foo}/{baz}/bax")), + (Remove, "/{foo}/{bar}/baz", Some("/{foo}/{bar}/baz")), + ( + Remove, + "/{fod}/{baz}/{bax}/foo", + Some("/{fod}/{baz}/{bax}/foo"), + ), + (Remove, "/{fod}/baz/bax/foo", Some("/{fod}/baz/bax/foo")), + (Remove, "/{foo}/baz/bax", Some("/{foo}/baz/bax")), + (Remove, "/{bar}/{bay}/bay", Some("/{bar}/{bay}/bay")), + (Remove, "/s", Some("/s")), + (Remove, "/s/s", Some("/s/s")), + (Remove, "/s/s/s", Some("/s/s/s")), + (Remove, "/s/s/s/s", Some("/s/s/s/s")), + (Remove, "/s/s/{s}/x", Some("/s/s/{s}/x")), + (Remove, "/s/s/{y}/d", Some("/s/s/{y}/d")), + ], + remaining: vec![], + } + .run(); +} + +#[test] +fn test() { + RemoveTest { + routes: vec!["/home", "/home/{id}"], + ops: vec![ + (Remove, "/home", Some("/home")), + (Remove, "/home", None), + (Remove, "/home/{id}", Some("/home/{id}")), + (Remove, "/home/{id}", None), + ], + remaining: vec![], + } + .run(); +} + +#[test] +fn blog() { + RemoveTest { + routes: vec![ + "/{page}", + "/posts/{year}/{month}/{post}", + "/posts/{year}/{month}/index", + "/posts/{year}/top", + "/static/{*path}", + "/favicon.ico", + ], + ops: vec![ + (Remove, "/{page}", Some("/{page}")), + ( + Remove, + "/posts/{year}/{month}/{post}", + Some("/posts/{year}/{month}/{post}"), + ), + ( + Remove, + "/posts/{year}/{month}/index", + Some("/posts/{year}/{month}/index"), + ), + (Remove, "/posts/{year}/top", Some("/posts/{year}/top")), + (Remove, "/static/{*path}", Some("/static/{*path}")), + (Remove, "/favicon.ico", Some("/favicon.ico")), + ], + remaining: vec![], + } + .run() +} + +#[test] +fn catchall() { + RemoveTest { + routes: vec!["/foo/{*catchall}", "/bar", "/bar/", "/bar/{*catchall}"], + ops: vec![ + (Remove, "/foo/{*catchall}", Some("/foo/{*catchall}")), + (Remove, "/bar/", Some("/bar/")), + (Insert, "/foo/*catchall", Some("/foo/*catchall")), + (Remove, "/bar/{*catchall}", Some("/bar/{*catchall}")), + ], + remaining: vec!["/bar", "/foo/*catchall"], + } + .run(); +} + +#[test] +fn overlapping_routes() { + RemoveTest { + routes: vec![ + "/home", + "/home/{id}", + "/users", + "/users/{id}", + "/users/{id}/posts", + "/users/{id}/posts/{post_id}", + "/articles", + "/articles/{category}", + "/articles/{category}/{id}", + ], + ops: vec![ + (Remove, "/home", Some("/home")), + (Insert, "/home", Some("/home")), + (Remove, "/home/{id}", Some("/home/{id}")), + (Insert, "/home/{id}", Some("/home/{id}")), + (Remove, "/users", Some("/users")), + (Insert, "/users", Some("/users")), + (Remove, "/users/{id}", Some("/users/{id}")), + (Insert, "/users/{id}", Some("/users/{id}")), + (Remove, "/users/{id}/posts", Some("/users/{id}/posts")), + (Insert, "/users/{id}/posts", Some("/users/{id}/posts")), + ( + Remove, + "/users/{id}/posts/{post_id}", + Some("/users/{id}/posts/{post_id}"), + ), + ( + Insert, + "/users/{id}/posts/{post_id}", + Some("/users/{id}/posts/{post_id}"), + ), + (Remove, "/articles", Some("/articles")), + (Insert, "/articles", Some("/articles")), + (Remove, "/articles/{category}", Some("/articles/{category}")), + (Insert, "/articles/{category}", Some("/articles/{category}")), + ( + Remove, + "/articles/{category}/{id}", + Some("/articles/{category}/{id}"), + ), + ( + Insert, + "/articles/{category}/{id}", + Some("/articles/{category}/{id}"), + ), + ], + remaining: vec![ + "/home", + "/home/{id}", + "/users", + "/users/{id}", + "/users/{id}/posts", + "/users/{id}/posts/{post_id}", + "/articles", + "/articles/{category}", + "/articles/{category}/{id}", + ], + } + .run(); +} + +#[test] +fn trailing_slash() { + RemoveTest { + routes: vec!["/{home}/", "/foo"], + ops: vec![ + (Remove, "/", None), + (Remove, "/{home}", None), + (Remove, "/foo/", None), + (Remove, "/foo", Some("/foo")), + (Remove, "/{home}", None), + (Remove, "/{home}/", Some("/{home}/")), + ], + remaining: vec![], + } + .run(); +} + +#[test] +fn remove_root() { + RemoveTest { + routes: vec!["/"], + ops: vec![(Remove, "/", Some("/"))], + remaining: vec![], + } + .run(); +} + +#[test] +fn check_escaped_params() { + RemoveTest { + routes: vec![ + "/foo/{id}", + "/foo/{id}/bar", + "/bar/{user}/{id}", + "/bar/{user}/{id}/baz", + "/baz/{product}/{user}/{id}", + ], + ops: vec![ + (Remove, "/foo/{a}", None), + (Remove, "/foo/{a}/bar", None), + (Remove, "/bar/{a}/{b}", None), + (Remove, "/bar/{a}/{b}/baz", None), + (Remove, "/baz/{a}/{b}/{c}", None), + ], + remaining: vec![ + "/foo/{id}", + "/foo/{id}/bar", + "/bar/{user}/{id}", + "/bar/{user}/{id}/baz", + "/baz/{product}/{user}/{id}", + ], + } + .run(); +} |
