diff --git a/packages/renderer/src/lib/container/ContainerActions.spec.ts b/packages/renderer/src/lib/container/ContainerActions.spec.ts index fe8e0cd66d80d..70ac07235711e 100644 --- a/packages/renderer/src/lib/container/ContainerActions.spec.ts +++ b/packages/renderer/src/lib/container/ContainerActions.spec.ts @@ -22,6 +22,10 @@ import { fireEvent, render, screen, waitFor } from '@testing-library/svelte'; import { router } from 'tinro'; import { afterEach, beforeEach, expect, test, vi } from 'vitest'; +import ContributionActions from '/@/lib/actions/ContributionActions.svelte'; +import { context } from '/@/stores/context'; + +import { ContextUI } from '../context/context'; import ContainerActions from './ContainerActions.svelte'; import type { ContainerInfoUI } from './ContainerInfoUI'; @@ -48,6 +52,8 @@ const getContributedMenusMock = vi.fn(); const updateMock = vi.fn(); const showMessageBoxMock = vi.fn(); +vi.mock('/@/lib/actions/ContributionActions.svelte'); + beforeEach(() => { (window as any).showMessageBox = showMessageBoxMock; (window as any).startContainer = vi.fn(); @@ -146,3 +152,29 @@ test('Expect Generate Kube to redirect to expected page', async () => { expect(goToMock).toBeCalledWith(`/containers/container-id/kube`); }); + +test('Expect ContributionsAction component is created with a contextUI containing containerImageName', async () => { + const contributionActionsMock = vi.mocked(ContributionActions); + const containerWithImageName = new ContainerInfoUIImpl( + 'container-id', + 'container-engine-id', + ) as unknown as ContainerInfoUI; + containerWithImageName.image = 'quay.io/user/my-image'; + const ctx = new ContextUI(); + ctx.setValue('key1', 'value1'); + context.set(ctx); + render(ContainerActions, { container: containerWithImageName }); + await vi.waitFor(() => { + expect(contributionActionsMock).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + contextUI: { + _value: { + containerImageName: 'quay.io/user/my-image', + key1: 'value1', + }, + }, + }), + ); + }); +}); diff --git a/packages/renderer/src/lib/container/ContainerActions.svelte b/packages/renderer/src/lib/container/ContainerActions.svelte index f7a7d70b5b814..b134ac83368df 100644 --- a/packages/renderer/src/lib/container/ContainerActions.svelte +++ b/packages/renderer/src/lib/container/ContainerActions.svelte @@ -12,15 +12,18 @@ import { faTrash, } from '@fortawesome/free-solid-svg-icons'; import { DropdownMenu } from '@podman-desktop/ui-svelte'; -import { createEventDispatcher, onMount } from 'svelte'; +import { createEventDispatcher, onDestroy, onMount } from 'svelte'; +import type { Unsubscriber } from 'svelte/store'; import ContributionActions from '/@/lib/actions/ContributionActions.svelte'; import { withConfirmation } from '/@/lib/dialogs/messagebox-utils'; import { handleNavigation } from '/@/navigation'; +import { context } from '/@/stores/context'; import { NavigationPage } from '/@api/navigation-page'; import type { Menu } from '../../../../main/src/plugin/menu-registry'; import { MenuContext } from '../../../../main/src/plugin/menu-registry'; +import { ContextUI } from '../context/context'; import FlatMenu from '../ui/FlatMenu.svelte'; import ListItemButtonIcon from '../ui/ListItemButtonIcon.svelte'; import { ContainerGroupInfoTypeUI, type ContainerInfoUI } from './ContainerInfoUI'; @@ -29,6 +32,9 @@ export let container: ContainerInfoUI; export let dropdownMenu = false; export let detailed = false; +let globalContext: ContextUI; +let contextsUnsubscribe: Unsubscriber; + const dispatch = createEventDispatcher<{ update: ContainerInfoUI }>(); export let onUpdate: (update: ContainerInfoUI) => void = update => { dispatch('update', update); @@ -36,6 +42,20 @@ export let onUpdate: (update: ContainerInfoUI) => void = update => { let contributions: Menu[] = []; onMount(async () => { contributions = await window.getContributedMenus(MenuContext.DASHBOARD_CONTAINER); + contextsUnsubscribe = context.subscribe(value => { + // Copy context, do not use reference + globalContext = new ContextUI(); + const allValues = value.collectAllValues(); + for (const k in allValues) { + globalContext.setValue(k, allValues[k]); + } + globalContext.setValue('containerImageName', container.image); + }); +}); + +onDestroy(() => { + // unsubscribe from the store + contextsUnsubscribe?.(); }); function inProgress(inProgress: boolean, state?: string): void { @@ -249,5 +269,6 @@ if (dropdownMenu) { dropdownMenu={dropdownMenu} contributions={contributions} detailed={detailed} - onError={handleError} /> + onError={handleError} + contextUI={globalContext} />