import { mount } from '@vue/test-utils';
import { describe, expect, it } from 'vitest';
import { createRouter, createWebHistory } from '@ionic/vue-router';
import { IonicVue, IonRouterOutlet, IonPage, IonTabs, IonTabBar, IonTabButton, IonLabel } from '@ionic/vue';
import { waitForRouter } from './utils';
const Tabs = {
components: { IonPage, IonTabs, IonTabBar, IonTabButton, IonLabel, IonRouterOutlet },
template: `
Tab 1
Tab 2
`,
}
const Tab1 = {
components: { IonPage },
template: `Tab 1`
}
const Tab2 = {
components: { IonPage },
template: `Tab 2`
}
describe('ion-tabs', () => {
it('should emit will change and did change events when changing tab', async () => {
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes: [
{
path: '/',
component: Tabs,
children: [
{
path: '',
redirect: 'tab1'
},
{
path: 'tab1',
component: Tab1,
},
{
path: 'tab2',
component: Tab2
}
]
}
]
});
router.push('/');
await router.isReady();
const wrapper = mount(IonRouterOutlet, {
global: {
plugins: [router, IonicVue]
}
});
const tabs = wrapper.findComponent(IonTabs);
expect(tabs.emitted().ionTabsWillChange.length).toEqual(1);
expect(tabs.emitted().ionTabsWillChange[0]).toEqual([{ tab: 'tab1' }]);
expect(tabs.emitted().ionTabsDidChange.length).toEqual(1);
expect(tabs.emitted().ionTabsDidChange[0]).toEqual([{ tab: 'tab1' }]);
router.push('/tab2')
await waitForRouter()
expect(tabs.emitted().ionTabsWillChange.length).toEqual(2);
expect(tabs.emitted().ionTabsWillChange[1]).toEqual([{ tab: 'tab2' }]);
expect(tabs.emitted().ionTabsDidChange.length).toEqual(2);
expect(tabs.emitted().ionTabsDidChange[1]).toEqual([{ tab: 'tab2' }]);
});
it('should not emit will change and did change events when going to same tab again', async () => {
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes: [
{
path: '/',
component: Tabs,
children: [
{
path: '',
redirect: 'tab1'
},
{
path: 'tab1',
component: Tab1,
},
{
path: 'tab2',
component: Tab2
}
]
}
]
});
router.push('/');
await router.isReady();
const wrapper = mount(IonRouterOutlet, {
global: {
plugins: [router, IonicVue]
}
});
const tabs = wrapper.findComponent(IonTabs);
expect(tabs.emitted().ionTabsWillChange.length).toEqual(1);
expect(tabs.emitted().ionTabsWillChange[0]).toEqual([{ tab: 'tab1' }]);
expect(tabs.emitted().ionTabsDidChange.length).toEqual(1);
expect(tabs.emitted().ionTabsDidChange[0]).toEqual([{ tab: 'tab1' }]);
router.push('/tab1')
await waitForRouter()
expect(tabs.emitted().ionTabsWillChange.length).toEqual(1);
expect(tabs.emitted().ionTabsDidChange.length).toEqual(1);
});
it('should not emit will change and did change events when going to a non tabs page', async () => {
const Sibling = {
components: { IonPage },
template: `Sibling Page`
}
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes: [
{
path: '/',
component: Tabs,
children: [
{
path: '',
redirect: 'tab1'
},
{
path: 'tab1',
component: Tab1
},
{
path: 'tab2',
component: Tab2
}
]
},
{
path: '/sibling',
component: Sibling
}
]
});
router.push('/');
await router.isReady();
const wrapper = mount(IonRouterOutlet, {
global: {
plugins: [router, IonicVue]
}
});
const tabs = wrapper.findComponent(IonTabs);
expect(tabs.emitted().ionTabsWillChange.length).toEqual(1);
expect(tabs.emitted().ionTabsWillChange[0]).toEqual([{ tab: 'tab1' }]);
expect(tabs.emitted().ionTabsDidChange.length).toEqual(1);
expect(tabs.emitted().ionTabsDidChange[0]).toEqual([{ tab: 'tab1' }]);
router.push('/sibling');
await waitForRouter()
expect(tabs.emitted().ionTabsWillChange.length).toEqual(1);
expect(tabs.emitted().ionTabsDidChange.length).toEqual(1);
});
it('should not emit will change and did change events when going to child tab page', async () => {
const Child = {
components: { IonPage },
template: `Child Page`
}
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes: [
{
path: '/',
component: Tabs,
children: [
{
path: '',
redirect: 'tab1'
},
{
path: 'tab1',
component: Tab1,
children: [
{
path: 'child',
component: Child
}
]
},
{
path: 'tab2',
component: Tab2
}
]
}
]
});
router.push('/');
await router.isReady();
const wrapper = mount(IonRouterOutlet, {
global: {
plugins: [router, IonicVue]
}
});
const tabs = wrapper.findComponent(IonTabs);
expect(tabs.emitted().ionTabsWillChange.length).toEqual(1);
expect(tabs.emitted().ionTabsWillChange[0]).toEqual([{ tab: 'tab1' }]);
expect(tabs.emitted().ionTabsDidChange.length).toEqual(1);
expect(tabs.emitted().ionTabsDidChange[0]).toEqual([{ tab: 'tab1' }]);
router.push('/tab1/child');
await waitForRouter()
expect(tabs.emitted().ionTabsWillChange.length).toEqual(1);
expect(tabs.emitted().ionTabsDidChange.length).toEqual(1);
});
});