RouteLocationNormalized,
} from '../src/types'
import { createMemoryHistory } from '../src'
+import { mount } from './mount'
+import { ref, markNonReactive } from 'vue'
+import { tick } from './utils'
const locations: Record<
string,
return this.history.base + to.fullPath
},
resolve: jest.fn(),
- push: jest.fn(),
+ push: jest.fn().mockResolvedValue(resolvedLocation),
+ currentRoute: ref(markNonReactive(currentLocation)),
+ setActiveApp: jest.fn(),
}
router.resolve.mockReturnValueOnce(resolvedLocation)
- // @ts-ignore TODO: Some information are missing on RouterLink
- const wrapper = mount(RouterLink, {
- propsData,
- slots: {
- default: 'a link',
+ const { app, el } = mount(router as any, {
+ template: `<RouterLink :to="to">a link</RouterLink>`,
+ components: { RouterLink },
+ setup() {
+ const to = ref(propsData.to)
+
+ return { to }
},
- // stubs: { RouterLink },
- mocks: { $route: currentLocation, $router: router },
})
- return { wrapper, router }
+
+ return { app, router, el }
}
it('displays a link with a string prop', () => {
- const { wrapper } = factory(
+ const { el } = factory(
START_LOCATION_NORMALIZED,
{ to: locations.basic.string },
locations.basic.normalized
)
- expect(wrapper.html()).toMatchSnapshot()
+ expect(el.innerHTML).toBe('<a href="/home">a link</a>')
})
it('displays a link with an object with path prop', () => {
- const { wrapper } = factory(
+ const { el } = factory(
START_LOCATION_NORMALIZED,
{ to: { path: locations.basic.string } },
locations.basic.normalized
)
- expect(wrapper.html()).toMatchSnapshot()
+ expect(el.innerHTML).toBe('<a href="/home">a link</a>')
})
it('calls ensureLocation', () => {
expect(router.resolve).toHaveBeenCalledWith(locations.basic.string)
})
- it('calls router.push when clicked', () => {
- const { router, wrapper } = factory(
+ // TODO: call when we can test this
+ it.skip('calls router.push when clicked', async () => {
+ const { router, el } = factory(
START_LOCATION_NORMALIZED,
{ to: locations.basic.string },
locations.basic.normalized
)
- wrapper.trigger('click', {})
+ el.click()
+ await tick()
expect(router.push).toHaveBeenCalledTimes(1)
expect(router.push).toHaveBeenCalledWith(locations.basic.normalized)
})
-
- it('normalizes query with path', () => {
- const { router } = factory(
- START_LOCATION_NORMALIZED,
- { to: locations.withQuery.string },
- locations.withQuery.normalized // it doesn't matter as we want to check what resolve is called with
- )
- expect(router.resolve).toHaveBeenCalledWith(locations.withQuery.string)
- })
})
--- /dev/null
+import { Component, createApp } from 'vue'
+import * as runtimeDom from '@vue/runtime-dom'
+import { compile } from '@vue/compiler-dom'
+import { Router } from '../src'
+
+export function mount(
+ router: Router,
+ Component: Component & {
+ template: string
+ },
+ rootProps = {}
+) {
+ const app = createApp()
+ app.provide('router', router)
+
+ // app.use(RouterPlugin, router)
+
+ const rootEl = document.createElement('div')
+ document.body.appendChild(rootEl)
+
+ const { template, ...ComponentWithoutTemplate } = Component
+ const codegen = compile(template, {
+ mode: 'function',
+ hoistStatic: true,
+ prefixIdentifiers: true,
+ })
+
+ const render = new Function('Vue', codegen.code)(runtimeDom)
+
+ // @ts-ignore
+ ComponentWithoutTemplate.render = render
+
+ app.mount(ComponentWithoutTemplate as any, rootEl, rootProps)
+
+ return { app, el: rootEl }
+}
resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
-abab@^2.0.0, abab@^2.0.3:
+abab@^2.0.0:
version "2.0.3"
resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a"
integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
-cssom@^0.4.1, cssom@^0.4.4:
+cssom@^0.4.1:
version "0.4.4"
resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10"
integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==
whatwg-mimetype "^2.2.0"
whatwg-url "^7.0.0"
-data-urls@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b"
- integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==
- dependencies:
- abab "^2.0.3"
- whatwg-mimetype "^2.3.0"
- whatwg-url "^8.0.0"
-
debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
-decimal.js@^10.2.0:
- version "10.2.0"
- resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231"
- integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==
-
decode-uri-component@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
dependencies:
webidl-conversions "^4.0.2"
-domexception@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
- integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==
- dependencies:
- webidl-conversions "^5.0.0"
-
domhandler@^2.3.0:
version "2.4.2"
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
-escodegen@1.x.x, escodegen@^1.11.1, escodegen@^1.12.1:
+escodegen@1.x.x, escodegen@^1.11.1:
version "1.13.0"
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.13.0.tgz#c7adf9bd3f3cc675bb752f202f79a720189cab29"
integrity sha512-eYk2dCkxR07DsHA/X2hRBj0CFAZeri/LyDMc0C8JT1Hqi6JnVpMhJ7XFITbb0+yZS3lVkaPL2oCkZ3AVmeVbMw==
dependencies:
whatwg-encoding "^1.0.1"
-html-encoding-sniffer@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.0.tgz#70b3b69bb5999f35d0d4495d79079f35630e71ae"
- integrity sha512-Y9prnPKkM7FXxQevZ5UH8Z6aVTY0ede1tHquck5UxGmKWDshxXh95gSa2xXYjS8AsGO5iOvrCI5+GttRKnLdNA==
- dependencies:
- whatwg-encoding "^1.0.5"
-
html-entities@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
ws "^7.0.0"
xml-name-validator "^3.0.0"
-jsdom@^16.0.1:
- version "16.0.1"
- resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.0.1.tgz#5a5214cf69609531bf6fa5b6322fdd90ceed5bf7"
- integrity sha512-wKJe/APzq+ak9i+2ybWE20lDIhF9AkGKSZf8UsjPN39acatFB6oA7K397kQvHVikds0yQono2h6J7UjbPtPOWw==
- dependencies:
- abab "^2.0.3"
- acorn "^7.1.0"
- acorn-globals "^4.3.2"
- cssom "^0.4.4"
- cssstyle "^2.0.0"
- data-urls "^2.0.0"
- decimal.js "^10.2.0"
- domexception "^2.0.1"
- escodegen "^1.12.1"
- html-encoding-sniffer "^2.0.0"
- nwsapi "^2.2.0"
- parse5 "5.1.1"
- request "^2.88.0"
- request-promise-native "^1.0.8"
- saxes "^4.0.2"
- symbol-tree "^3.2.2"
- tough-cookie "^3.0.1"
- w3c-hr-time "^1.0.1"
- w3c-xmlserializer "^2.0.0"
- webidl-conversions "^5.0.0"
- whatwg-encoding "^1.0.5"
- whatwg-mimetype "^2.3.0"
- whatwg-url "^8.0.0"
- ws "^7.2.1"
- xml-name-validator "^3.0.0"
-
jsesc@^2.5.1:
version "2.5.2"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2"
integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==
-parse5@5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178"
- integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==
-
parse5@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
dependencies:
lodash "^4.17.15"
-request-promise-native@^1.0.7, request-promise-native@^1.0.8:
+request-promise-native@^1.0.7:
version "1.0.8"
resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36"
integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==
dependencies:
xmlchars "^2.1.1"
-saxes@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/saxes/-/saxes-4.0.2.tgz#76f8e762efc96ec4af5f885d8151c50426103165"
- integrity sha512-EZOTeQ4bgkOaGCDaTKux+LaRNcLNbdbvMH7R3/yjEEULPEmqvkFbFub6DJhJTub2iGMT93CfpZ5LTdKZmAbVeQ==
- dependencies:
- xmlchars "^2.2.0"
-
schema-utils@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
dependencies:
punycode "^2.1.0"
-tr46@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.0.tgz#a85da3f8511231357b347caa686abb3dfb150634"
- integrity sha512-LrErSqfhdUw73AC/eXV2fEmNkvgSYxfm5lvxnLvuVgoVDknvD28Pa5FeDGc8RuVouDxUD3GnHHFv7xnBp7As5w==
- dependencies:
- punycode "^2.1.1"
-
ts-jest@^25.0.0:
version "25.0.0"
resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-25.0.0.tgz#d83b266e6ffda0c458a129951b3fe3567f8ce8df"
webidl-conversions "^4.0.2"
xml-name-validator "^3.0.0"
-w3c-xmlserializer@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a"
- integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==
- dependencies:
- xml-name-validator "^3.0.0"
-
walker@^1.0.7, walker@~1.0.5:
version "1.0.7"
resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
-webidl-conversions@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff"
- integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==
-
webpack-cli@^3.3.10:
version "3.3.10"
resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.10.tgz#17b279267e9b4fb549023fae170da8e6e766da13"
tr46 "^1.0.1"
webidl-conversions "^4.0.2"
-whatwg-url@^8.0.0:
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.0.0.tgz#37f256cb746398e19b107bd6ef820b4ae2d15871"
- integrity sha512-41ou2Dugpij8/LPO5Pq64K5q++MnRCBpEHvQr26/mArEKTkCV5aoXIqyhuYtE0pkqScXwhf2JP57rkRTYM29lQ==
- dependencies:
- lodash.sortby "^4.7.0"
- tr46 "^2.0.0"
- webidl-conversions "^5.0.0"
-
which-module@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
dependencies:
async-limiter "~1.0.0"
-ws@^7.0.0, ws@^7.2.1:
+ws@^7.0.0:
version "7.2.1"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.1.tgz#03ed52423cd744084b2cf42ed197c8b65a936b8e"
integrity sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
-xmlchars@^2.1.1, xmlchars@^2.2.0:
+xmlchars@^2.1.1:
version "2.2.0"
resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==