113 lines
3.1 KiB
TypeScript
113 lines
3.1 KiB
TypeScript
/* @vitest-environment happy-dom */
|
|
|
|
/* eslint-disable vue/one-component-per-file */
|
|
|
|
import type { SystemNetworkApi } from '#/api/system/network';
|
|
|
|
import { mount } from '@vue/test-utils';
|
|
import { defineComponent, h } from 'vue';
|
|
|
|
import NetworkEndpointHistoryDrawer from '@test-source/apps/web-antdv-next/src/views/system/network/components/NetworkEndpointHistoryDrawer';
|
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
|
|
const mocks = vi.hoisted(() => ({
|
|
drawerApi: { open: vi.fn() },
|
|
drawerOptions: undefined as any,
|
|
getHistory: vi.fn(),
|
|
tableApi: { reload: vi.fn() },
|
|
tableOptions: undefined as any,
|
|
}));
|
|
|
|
vi.mock('@vben/common-ui', () => ({
|
|
useVbenDrawer: vi.fn((options) => {
|
|
mocks.drawerOptions = options;
|
|
const Drawer = defineComponent({
|
|
name: 'MockDrawer',
|
|
setup(_, { slots }) {
|
|
return () => h('aside', slots.default?.());
|
|
},
|
|
});
|
|
return [Drawer, mocks.drawerApi];
|
|
}),
|
|
}));
|
|
|
|
vi.mock('antdv-next', () => ({
|
|
Tag: defineComponent({
|
|
name: 'MockTag',
|
|
setup(_, { slots }) {
|
|
return () => h('span', slots.default?.());
|
|
},
|
|
}),
|
|
}));
|
|
|
|
vi.mock('#/components/ktTable', () => ({
|
|
KtTable: defineComponent({
|
|
name: 'MockKtTable',
|
|
setup() {
|
|
return () => h('section');
|
|
},
|
|
}),
|
|
useKtTable: vi.fn((options) => {
|
|
mocks.tableOptions = options;
|
|
return [vi.fn(), mocks.tableApi];
|
|
}),
|
|
}));
|
|
|
|
vi.mock('#/api/system/network', () => ({
|
|
getNetworkPortForwardEndpointHistory: mocks.getHistory,
|
|
}));
|
|
|
|
vi.mock('#/locales', () => ({
|
|
$t: (key: string) => key,
|
|
}));
|
|
|
|
function createRow(id: string): SystemNetworkApi.PortForward {
|
|
return {
|
|
desiredPresence: 'present',
|
|
desiredRevision: '1',
|
|
externalPort: 40_000,
|
|
id,
|
|
internalPort: 40_000,
|
|
isDeleted: false,
|
|
keeperDesiredEnabled: true,
|
|
keeperStatus: 'active',
|
|
name: `mapping-${id}`,
|
|
protocol: 'udp',
|
|
syncStatus: 'synced',
|
|
targetIpv4: '192.168.31.224',
|
|
};
|
|
}
|
|
|
|
describe('network endpoint history drawer', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
mocks.getHistory.mockResolvedValue({ items: [], total: 0 });
|
|
});
|
|
|
|
it('stays lazy until opened and uses a disposable Vben drawer', () => {
|
|
mount(NetworkEndpointHistoryDrawer);
|
|
expect(mocks.tableOptions.immediate).toBe(false);
|
|
expect(mocks.drawerOptions.destroyOnClose).toBe(true);
|
|
expect(mocks.getHistory).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('loads the selected record ID and does not reuse a prior selection', async () => {
|
|
const wrapper = mount(NetworkEndpointHistoryDrawer);
|
|
(wrapper.vm as any).open(createRow('mapping-1'));
|
|
mocks.drawerOptions.onOpened();
|
|
expect(mocks.tableApi.reload).toHaveBeenCalledOnce();
|
|
await mocks.tableOptions.api.list({ pageNo: 2, pageSize: 10 });
|
|
expect(mocks.getHistory).toHaveBeenLastCalledWith('mapping-1', {
|
|
pageNo: 2,
|
|
pageSize: 10,
|
|
});
|
|
|
|
(wrapper.vm as any).open(createRow('mapping-2'));
|
|
await mocks.tableOptions.api.list({ pageNo: 1, pageSize: 20 });
|
|
expect(mocks.getHistory).toHaveBeenLastCalledWith('mapping-2', {
|
|
pageNo: 1,
|
|
pageSize: 20,
|
|
});
|
|
});
|
|
});
|