Skip to content

Commit

Permalink
fix(html5): correctly preserve current history.state
Browse files Browse the repository at this point in the history
Fix #180
  • Loading branch information
posva committed Apr 20, 2020
1 parent e9ec3d3 commit 0586394
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 1 deletion.
91 changes: 91 additions & 0 deletions __tests__/initialNavigation.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import { JSDOM } from 'jsdom'
import { createRouter, createWebHistory, Router } from '../src'
import { createDom, components } from './utils'
import { RouteRecordRaw } from '../src/types'

// override the value of isBrowser because the variable is created before JSDOM
// is created
jest.mock('../src/utils/env', () => ({
isBrowser: true,
}))

// generic component because we are not displaying anything so it doesn't matter
const component = components.Home

const routes: RouteRecordRaw[] = [
{ path: '/home', redirect: '/' },
{ path: '/', component },
{
path: '/home-before',
component,
beforeEnter: (to, from, next) => {
next('/')
},
},
{ path: '/bar', component },
{ path: '/foo', component, name: 'Foo' },
{ path: '/to-foo', redirect: '/foo' },
]

describe('Initial Navigation', () => {
let dom: JSDOM
function newRouter(
url: string,
options: Partial<Parameters<typeof createRouter>[0]> = {}
) {
dom.reconfigure({ url: 'https://example.com' + url })
const history = options.history || createWebHistory()
const router = createRouter({ history, routes, ...options })

return { history, router }
}

function nextNavigation(router: Router) {
return new Promise((resolve, reject) => {
let removeAfter = router.afterEach((_to, _from, failure) => {
removeAfter()
removeError()
resolve(failure)
})
let removeError = router.onError(err => {
removeAfter()
removeError()
reject(err)
})
})
}

beforeAll(() => {
dom = createDom()
})

afterAll(() => {
dom.window.close()
})

it('handles initial navigation with redirect', async () => {
const { history, router } = newRouter('/home')
expect(history.location.fullPath).toBe('/home')
// this is done automatically on mount but there is no mount here
await router.push(history.location.fullPath)
expect(router.currentRoute.value).toMatchObject({ path: '/' })
await router.push('/foo')
expect(router.currentRoute.value).toMatchObject({ path: '/foo' })
history.go(-1)
await nextNavigation(router)
expect(router.currentRoute.value).toMatchObject({ path: '/' })
})

it('handles initial navigation with beforEnter', async () => {
const { history, router } = newRouter('/home-before')
expect(history.location.fullPath).toBe('/home-before')
// this is done automatically on mount but there is no mount here
await router.push(history.location.fullPath)
expect(router.currentRoute.value).toMatchObject({ path: '/' })
await router.push('/foo')
expect(router.currentRoute.value).toMatchObject({ path: '/foo' })
history.go(-1)
await nextNavigation(router)
expect(router.currentRoute.value).toMatchObject({ path: '/' })
})
})
2 changes: 2 additions & 0 deletions __tests__/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ declare global {
interface Global {
window: JSDOM['window']
location: JSDOM['window']['location']
history: JSDOM['window']['history']
document: JSDOM['window']['document']
before?: Function
}
Expand All @@ -81,6 +82,7 @@ export function createDom(options?: ConstructorOptions) {

global.window = dom.window
global.location = dom.window.location
global.history = dom.window.history
global.document = dom.window.document

return dom
Expand Down
2 changes: 1 addition & 1 deletion src/history/html5.ts
Original file line number Diff line number Diff line change
Expand Up @@ -215,14 +215,14 @@ function useHistoryStateNavigation(base: string) {
const normalized = normalizeHistoryLocation(to)

const state: StateEntry = {
...history.state,
...buildState(
historyState.value.back,
// keep back and forward entries but override current position
normalized,
historyState.value.forward,
true
),
...history.state,
...data,
position: historyState.value.position,
}
Expand Down

0 comments on commit 0586394

Please sign in to comment.