102905b962
Co-authored-by: Claude <noreply@anthropic.com>
108 lines
2.8 KiB
TypeScript
108 lines
2.8 KiB
TypeScript
import {
|
|
buildStateObject,
|
|
getCurrentRoute,
|
|
isStateAtTabRoot,
|
|
} from '#/lib/routes/helpers'
|
|
import {type State} from '#/lib/routes/types'
|
|
|
|
describe('getCurrentRoute', () => {
|
|
it('returns Home when there is no state', () => {
|
|
expect(getCurrentRoute(undefined).name).toBe('Home')
|
|
})
|
|
|
|
it('descends into nested state using the index', () => {
|
|
const state = {
|
|
index: 0,
|
|
routes: [
|
|
{
|
|
name: 'HomeTab',
|
|
state: {
|
|
index: 1,
|
|
routes: [{name: 'Home'}, {name: 'PostThread'}],
|
|
},
|
|
},
|
|
],
|
|
} as unknown as State
|
|
|
|
expect(getCurrentRoute(state).name).toBe('PostThread')
|
|
})
|
|
|
|
/*
|
|
* Right after a cold start from a deep link, nested navigator states are
|
|
* still partial and have no `index`. React Navigation focuses the last
|
|
* route when rehydrating such a state, so getCurrentRoute must do the
|
|
* same (previously it stopped at the tab route, which re-enabled the
|
|
* drawer swipe gesture on top of the deep-linked screen).
|
|
*/
|
|
it('descends into partial nested state without an index', () => {
|
|
const state = {
|
|
routes: [
|
|
{
|
|
name: 'HomeTab',
|
|
state: {
|
|
routes: [{name: 'Home'}, {name: 'PostThread'}],
|
|
},
|
|
},
|
|
],
|
|
} as unknown as State
|
|
|
|
expect(getCurrentRoute(state).name).toBe('PostThread')
|
|
})
|
|
})
|
|
|
|
describe('isStateAtTabRoot', () => {
|
|
it('returns true for the initial deep link state of a tab root', () => {
|
|
const state = buildStateObject('HomeTab', 'Home', {}) as unknown as State
|
|
expect(isStateAtTabRoot(state)).toBe(true)
|
|
})
|
|
|
|
it('returns false for the initial deep link state of a nested screen', () => {
|
|
const state = buildStateObject(
|
|
'HomeTab',
|
|
'PostThread',
|
|
{name: 'alice.test', rkey: '123'},
|
|
[{name: 'Home', params: {}}],
|
|
) as unknown as State
|
|
expect(isStateAtTabRoot(state)).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('buildStateObject', () => {
|
|
it('focuses the deep-linked route in the nested state', () => {
|
|
const state = buildStateObject(
|
|
'HomeTab',
|
|
'PostThread',
|
|
{name: 'alice.test', rkey: '123'},
|
|
[{name: 'Home', params: {}}],
|
|
)
|
|
|
|
expect(state).toEqual({
|
|
index: 0,
|
|
routes: [
|
|
{
|
|
name: 'HomeTab',
|
|
state: {
|
|
index: 1,
|
|
routes: [
|
|
{name: 'Home', params: {}},
|
|
{name: 'PostThread', params: {name: 'alice.test', rkey: '123'}},
|
|
],
|
|
},
|
|
},
|
|
],
|
|
})
|
|
})
|
|
|
|
it('builds a single-route state for the Flat navigator', () => {
|
|
const state = buildStateObject('Flat', 'PostThread', {
|
|
name: 'alice.test',
|
|
rkey: '123',
|
|
})
|
|
|
|
expect(state).toEqual({
|
|
index: 0,
|
|
routes: [{name: 'PostThread', params: {name: 'alice.test', rkey: '123'}}],
|
|
})
|
|
})
|
|
})
|