diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeFooter.test.ts b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeFooter.test.ts index c31fca7e5e..3244e7edff 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeFooter.test.ts +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeFooter.test.ts @@ -1,13 +1,22 @@ -import { fireEvent } from '@testing-library/vue'; +import { fireEvent, waitFor } from '@testing-library/vue'; import { VIEWS } from '@/constants'; import { createTestingPinia } from '@pinia/testing'; import { setActivePinia } from 'pinia'; import CommunityNodeFooter from './CommunityNodeFooter.vue'; import { createComponentRenderer } from '@/__tests__/render'; import { vi } from 'vitest'; +import type { PublicInstalledPackage } from 'n8n-workflow'; + +const getInstalledPackage = vi.fn(); const push = vi.fn(); +const communityNodesStore: { + getInstalledPackage: (packageName: string) => Promise; +} = { + getInstalledPackage, +}; + vi.mock('vue-router', async (importOriginal) => { const actual = await importOriginal(); return { @@ -18,6 +27,10 @@ vi.mock('vue-router', async (importOriginal) => { }; }); +vi.mock('@/stores/communityNodes.store', () => ({ + useCommunityNodesStore: vi.fn(() => communityNodesStore), +})); + describe('CommunityNodeInfo - links & bugs URL', () => { beforeEach(() => { setActivePinia(createTestingPinia()); @@ -55,4 +68,36 @@ describe('CommunityNodeInfo - links & bugs URL', () => { expect(queryByText('Manage')).not.toBeInTheDocument(); }); + + it('displays "Legacy" when updateAvailable', async () => { + getInstalledPackage.mockResolvedValue({ + installedVersion: '1.0.0', + updateAvailable: '1.0.1', + } as PublicInstalledPackage); + const { getByText } = createComponentRenderer(CommunityNodeFooter)({ + props: { + packageName: 'n8n-nodes-test', + showManage: false, + }, + }); + await waitFor(() => expect(getInstalledPackage).toHaveBeenCalled()); + + expect(getByText('Package version 1.0.0 (Legacy)')).toBeInTheDocument(); + }); + + it('displays "Latest" when not updateAvailable', async () => { + getInstalledPackage.mockResolvedValue({ + installedVersion: '1.0.0', + } as PublicInstalledPackage); + const { getByText } = createComponentRenderer(CommunityNodeFooter)({ + props: { + packageName: 'n8n-nodes-test', + showManage: false, + }, + }); + + await waitFor(() => expect(getInstalledPackage).toHaveBeenCalled()); + + expect(getByText('Package version 1.0.0 (Latest)')).toBeInTheDocument(); + }); }); diff --git a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeFooter.vue b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeFooter.vue index ee7928517f..2a3d95091e 100644 --- a/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeFooter.vue +++ b/packages/frontend/editor-ui/src/components/Node/NodeCreator/Panel/CommunityNodeFooter.vue @@ -3,6 +3,8 @@ import { VIEWS } from '@/constants'; import { onMounted, ref } from 'vue'; import { useRouter } from 'vue-router'; import { captureException } from '@sentry/vue'; +import { useCommunityNodesStore } from '@/stores/communityNodes.store'; +import type { PublicInstalledPackage } from 'n8n-workflow'; import { N8nText, N8nLink } from '@n8n/design-system'; @@ -15,6 +17,7 @@ const props = defineProps(); const router = useRouter(); const bugsUrl = ref(`https://registry.npmjs.org/${props.packageName}`); +const installedPackage = ref(undefined); async function openSettingsPage() { await router.push({ name: VIEWS.COMMUNITY_NODES }); @@ -49,30 +52,45 @@ async function getBugsUrl(packageName: string) { onMounted(async () => { if (props.packageName) { await getBugsUrl(props.packageName); + installedPackage.value = await useCommunityNodesStore().getInstalledPackage(props.packageName); } }); diff --git a/packages/frontend/editor-ui/src/components/NodeSettings.vue b/packages/frontend/editor-ui/src/components/NodeSettings.vue index 53d6cd0b43..613dc06c13 100644 --- a/packages/frontend/editor-ui/src/components/NodeSettings.vue +++ b/packages/frontend/editor-ui/src/components/NodeSettings.vue @@ -1039,6 +1039,11 @@ function handleWheelEvent(event: WheelEvent) { @open-connection-node-creator="onOpenConnectionNodeCreator" /> +