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); }); });