mithril-vndb/pathname/tests/test-compileTemplate.js
Isiah Meadows 85bfd0f77d
Clarify pathname docs, follow spec with fragments (#2448)
* Clarify pathname docs, follow spec with fragments

- Valid URLs must not contain a `#` within its fragment.
  https://github.com/MithrilJS/mithril.js/issues/2445
- Our docs were a little confusing and misleading - `m.pathname` isn't
  aware of URLs, just path names.
- Removed the relevant extension to `m.parseQueryString` required to
  support the hash parsing extension. Now we just shave it off and
  ignore it.
- Fix support for arbitrary prefixes, so prefixes like `?#` are
  handled correctly.
- Add a bunch of tests to cover various areas of confusion and unusual
  edge cases.

* Update with PR [skip ci]
2019-07-03 06:22:25 -04:00

221 lines
9.2 KiB
JavaScript

"use strict"
var o = require("../../ospec/ospec")
var parsePathname = require("../../pathname/parse")
var compileTemplate = require("../../pathname/compileTemplate")
o.spec("compileTemplate", function() {
o("checks empty string", function() {
var data = parsePathname("/")
o(compileTemplate("/")(data)).equals(true)
o(data.params).deepEquals({})
})
o("checks identical match", function() {
var data = parsePathname("/foo")
o(compileTemplate("/foo")(data)).equals(true)
o(data.params).deepEquals({})
})
o("checks identical mismatch", function() {
var data = parsePathname("/bar")
o(compileTemplate("/foo")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks single parameter", function() {
var data = parsePathname("/1")
o(compileTemplate("/:id")(data)).equals(true)
o(data.params).deepEquals({id: "1"})
})
o("checks single variadic parameter", function() {
var data = parsePathname("/some/path")
o(compileTemplate("/:id...")(data)).equals(true)
o(data.params).deepEquals({id: "some/path"})
})
o("checks single parameter with extra match", function() {
var data = parsePathname("/1/foo")
o(compileTemplate("/:id/foo")(data)).equals(true)
o(data.params).deepEquals({id: "1"})
})
o("checks single parameter with extra mismatch", function() {
var data = parsePathname("/1/bar")
o(compileTemplate("/:id/foo")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks single variadic parameter with extra match", function() {
var data = parsePathname("/some/path/foo")
o(compileTemplate("/:id.../foo")(data)).equals(true)
o(data.params).deepEquals({id: "some/path"})
})
o("checks single variadic parameter with extra mismatch", function() {
var data = parsePathname("/some/path/bar")
o(compileTemplate("/:id.../foo")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks multiple parameters", function() {
var data = parsePathname("/1/2")
o(compileTemplate("/:id/:name")(data)).equals(true)
o(data.params).deepEquals({id: "1", name: "2"})
})
o("checks incomplete multiple parameters", function() {
var data = parsePathname("/1")
o(compileTemplate("/:id/:name")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks multiple parameters with extra match", function() {
var data = parsePathname("/1/2/foo")
o(compileTemplate("/:id/:name/foo")(data)).equals(true)
o(data.params).deepEquals({id: "1", name: "2"})
})
o("checks multiple parameters with extra mismatch", function() {
var data = parsePathname("/1/2/bar")
o(compileTemplate("/:id/:name/foo")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks multiple parameters, last variadic, with extra match", function() {
var data = parsePathname("/1/some/path/foo")
o(compileTemplate("/:id/:name.../foo")(data)).equals(true)
o(data.params).deepEquals({id: "1", name: "some/path"})
})
o("checks multiple parameters, last variadic, with extra mismatch", function() {
var data = parsePathname("/1/some/path/bar")
o(compileTemplate("/:id/:name.../foo")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks multiple separated parameters", function() {
var data = parsePathname("/1/sep/2")
o(compileTemplate("/:id/sep/:name")(data)).equals(true)
o(data.params).deepEquals({id: "1", name: "2"})
})
o("checks incomplete multiple separated parameters", function() {
var data = parsePathname("/1")
o(compileTemplate("/:id/sep/:name")(data)).equals(false)
o(data.params).deepEquals({})
data = parsePathname("/1/sep")
o(compileTemplate("/:id/sep/:name")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks multiple separated parameters missing sep", function() {
var data = parsePathname("/1/2")
o(compileTemplate("/:id/sep/:name")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks multiple separated parameters with extra match", function() {
var data = parsePathname("/1/sep/2/foo")
o(compileTemplate("/:id/sep/:name/foo")(data)).equals(true)
o(data.params).deepEquals({id: "1", name: "2"})
})
o("checks multiple separated parameters with extra mismatch", function() {
var data = parsePathname("/1/sep/2/bar")
o(compileTemplate("/:id/sep/:name/foo")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks multiple separated parameters, last variadic, with extra match", function() {
var data = parsePathname("/1/sep/some/path/foo")
o(compileTemplate("/:id/sep/:name.../foo")(data)).equals(true)
o(data.params).deepEquals({id: "1", name: "some/path"})
})
o("checks multiple separated parameters, last variadic, with extra mismatch", function() {
var data = parsePathname("/1/sep/some/path/bar")
o(compileTemplate("/:id/sep/:name.../foo")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks multiple parameters + prefix", function() {
var data = parsePathname("/route/1/2")
o(compileTemplate("/route/:id/:name")(data)).equals(true)
o(data.params).deepEquals({id: "1", name: "2"})
})
o("checks incomplete multiple parameters + prefix", function() {
var data = parsePathname("/route/1")
o(compileTemplate("/route/:id/:name")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks multiple parameters + prefix with extra match", function() {
var data = parsePathname("/route/1/2/foo")
o(compileTemplate("/route/:id/:name/foo")(data)).equals(true)
o(data.params).deepEquals({id: "1", name: "2"})
})
o("checks multiple parameters + prefix with extra mismatch", function() {
var data = parsePathname("/route/1/2/bar")
o(compileTemplate("/route/:id/:name/foo")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks multiple parameters + prefix, last variadic, with extra match", function() {
var data = parsePathname("/route/1/some/path/foo")
o(compileTemplate("/route/:id/:name.../foo")(data)).equals(true)
o(data.params).deepEquals({id: "1", name: "some/path"})
})
o("checks multiple parameters + prefix, last variadic, with extra mismatch", function() {
var data = parsePathname("/route/1/some/path/bar")
o(compileTemplate("/route/:id/:name.../foo")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks multiple separated parameters + prefix", function() {
var data = parsePathname("/route/1/sep/2")
o(compileTemplate("/route/:id/sep/:name")(data)).equals(true)
o(data.params).deepEquals({id: "1", name: "2"})
})
o("checks incomplete multiple separated parameters + prefix", function() {
var data = parsePathname("/route/1")
o(compileTemplate("/route/:id/sep/:name")(data)).equals(false)
o(data.params).deepEquals({})
var data = parsePathname("/route/1/sep")
o(compileTemplate("/route/:id/sep/:name")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks multiple separated parameters + prefix missing sep", function() {
var data = parsePathname("/route/1/2")
o(compileTemplate("/route/:id/sep/:name")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks multiple separated parameters + prefix with extra match", function() {
var data = parsePathname("/route/1/sep/2/foo")
o(compileTemplate("/route/:id/sep/:name/foo")(data)).equals(true)
o(data.params).deepEquals({id: "1", name: "2"})
})
o("checks multiple separated parameters + prefix with extra mismatch", function() {
var data = parsePathname("/route/1/sep/2/bar")
o(compileTemplate("/route/:id/sep/:name/foo")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks multiple separated parameters + prefix, last variadic, with extra match", function() {
var data = parsePathname("/route/1/sep/some/path/foo")
o(compileTemplate("/route/:id/sep/:name.../foo")(data)).equals(true)
o(data.params).deepEquals({id: "1", name: "some/path"})
})
o("checks multiple separated parameters + prefix, last variadic, with extra mismatch", function() {
var data = parsePathname("/route/1/sep/some/path/bar")
o(compileTemplate("/route/:id/sep/:name.../foo")(data)).equals(false)
o(data.params).deepEquals({})
})
o("checks query params match", function() {
var data = parsePathname("/route/1?foo=bar")
o(compileTemplate("/route/:id?foo=bar")(data)).equals(true)
o(data.params).deepEquals({id: "1", foo: "bar"})
})
o("checks query params mismatch", function() {
var data = parsePathname("/route/1?foo=bar")
o(compileTemplate("/route/:id?foo=1")(data)).equals(false)
o(data.params).deepEquals({foo: "bar"})
o(compileTemplate("/route/:id?bar=foo")(data)).equals(false)
o(data.params).deepEquals({foo: "bar"})
})
o("checks dot before dot", function() {
var data = parsePathname("/file.test.png/edit")
o(compileTemplate("/:file.:ext/edit")(data)).equals(true)
o(data.params).deepEquals({file: "file.test", ext: "png"})
})
o("checks dash before dot", function() {
var data = parsePathname("/file-test.png/edit")
o(compileTemplate("/:file.:ext/edit")(data)).equals(true)
o(data.params).deepEquals({file: "file-test", ext: "png"})
})
o("checks dot before dash", function() {
var data = parsePathname("/file.test-png/edit")
o(compileTemplate("/:file-:ext/edit")(data)).equals(true)
o(data.params).deepEquals({file: "file.test", ext: "png"})
})
o("checks dash before dash", function() {
var data = parsePathname("/file-test-png/edit")
o(compileTemplate("/:file-:ext/edit")(data)).equals(true)
o(data.params).deepEquals({file: "file-test", ext: "png"})
})
})