Files
n8n-enterprise-unlocked/packages/frontend/editor-ui/src/components/RunDataPinButton.test.ts

151 lines
4.4 KiB
TypeScript

import { createTestingPinia } from '@pinia/testing';
import { cleanup, waitFor } from '@testing-library/vue';
import userEvent from '@testing-library/user-event';
import { createComponentRenderer } from '@/__tests__/render';
import RunDataPinButton from '@/components/RunDataPinButton.vue';
import { STORES } from '@n8n/stores';
const renderComponent = createComponentRenderer(RunDataPinButton, {
global: {
stubs: ['font-awesome-icon'],
plugins: [
createTestingPinia({
initialState: {
[STORES.SETTINGS]: {
settings: {
templates: {
enabled: true,
host: 'https://api.n8n.io/api/',
},
},
},
},
}),
],
},
props: {
tooltipContentsVisibility: {
binaryDataTooltipContent: false,
pinDataDiscoveryTooltipContent: false,
},
dataPinningDocsUrl: '',
pinnedData: {
hasData: { value: false },
},
disabled: false,
},
});
describe('RunDataPinButton.vue', () => {
beforeEach(cleanup);
it('shows default tooltip content only on button hover', async () => {
const { getByRole, queryByRole, emitted } = renderComponent();
expect(queryByRole('tooltip')).not.toBeInTheDocument();
expect(getByRole('button')).toBeEnabled();
await userEvent.hover(getByRole('button'));
expect(getByRole('tooltip')).toBeVisible();
expect(getByRole('tooltip')).toHaveTextContent('More info');
await userEvent.click(getByRole('button'));
expect(emitted().togglePinData).toBeDefined();
});
it('shows binary data tooltip content only on disabled button hover', async () => {
const { getByRole, queryByRole, emitted } = renderComponent({
props: {
tooltipContentsVisibility: {
binaryDataTooltipContent: true,
pinDataDiscoveryTooltipContent: false,
},
disabled: true,
},
});
expect(queryByRole('tooltip')).not.toBeInTheDocument();
expect(getByRole('button')).toBeDisabled();
await userEvent.hover(getByRole('button'));
expect(getByRole('tooltip')).toBeVisible();
expect(getByRole('tooltip')).toHaveTextContent('disabled');
await userEvent.click(getByRole('button'));
expect(emitted().togglePinData).not.toBeDefined();
});
it('shows pin data discoverability tooltip immediately (not on hover)', async () => {
const { getByRole } = renderComponent({
props: {
tooltipContentsVisibility: {
binaryDataTooltipContent: false,
pinDataDiscoveryTooltipContent: true,
},
},
});
await waitFor(() => {
expect(getByRole('tooltip')).toBeVisible();
expect(getByRole('tooltip')).toHaveTextContent('instead of waiting');
});
expect(getByRole('button')).toBeEnabled();
await userEvent.hover(getByRole('button'));
expect(getByRole('tooltip')).toBeVisible();
expect(getByRole('tooltip')).toHaveTextContent('instead of waiting');
});
it('shows binary data tooltip content even if discoverability tooltip enabled', async () => {
const { getByRole } = renderComponent({
props: {
tooltipContentsVisibility: {
binaryDataTooltipContent: true,
pinDataDiscoveryTooltipContent: true,
},
disabled: true,
},
});
await waitFor(() => {
expect(getByRole('tooltip')).toBeVisible();
expect(getByRole('tooltip')).toHaveTextContent('disabled');
});
expect(getByRole('button')).toBeDisabled();
await userEvent.hover(getByRole('button'));
expect(getByRole('tooltip')).toBeVisible();
expect(getByRole('tooltip')).toHaveTextContent('disabled');
});
it('pins data on button click', async () => {
const { getByTestId, getByRole, emitted } = renderComponent({});
// Should show 'Pin data' tooltip and emit togglePinData event
await userEvent.hover(getByTestId('ndv-pin-data'));
expect(getByRole('tooltip')).toBeVisible();
expect(getByRole('tooltip').textContent).toContain('Pin data');
await userEvent.click(getByTestId('ndv-pin-data'));
expect(emitted().togglePinData).toBeDefined();
});
it('should show correct tooltip and unpin data on button click', async () => {
const { getByTestId, getByRole, emitted } = renderComponent({
props: {
pinnedData: {
hasData: { value: true },
},
},
});
// Should show 'Unpin data' tooltip and emit togglePinData event
await userEvent.hover(getByTestId('ndv-pin-data'));
expect(getByRole('tooltip')).toBeVisible();
expect(getByRole('tooltip').textContent).toContain('Unpin data');
await userEvent.click(getByTestId('ndv-pin-data'));
expect(emitted().togglePinData).toBeDefined();
});
});