Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,10 @@ const SuggestionModal: FC = () => {
</li>
))}
</ul>
<p>{t('suggestion_modal_description_sub')}</p>
<p>{t('suggestion_modal_description_sub', {
confirmLabel: t('suggestion_modal_action_confirm'),
modifyLabel: t('suggestion_modal_action_modify')
})}</p>
</OsdsText>

<OsdsButton
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
import React from 'react';
import { BrowserRouter } from 'react-router-dom';
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { render, screen, waitFor } from '@testing-library/react';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import useMfaEnrollment from '@/container/mfa-enrollment';
import LegacyContainer from '.';

vi.mock('@/context', () => ({
useApplication: () => ({
shell: {
getPlugin: vi.fn((name: string) => {
if (name === 'environment') {
return { getEnvironment: () => ({ getApplications: () => [] as any, getRegion: () => 'EU' }) };
}
if (name === 'tracking') {
return {
waitForConfig: () => Promise.resolve(),
trackMVTest: vi.fn(),
};
}
return {};
}),
setMessageBus: vi.fn(),
},
}),
}));

vi.mock('@/context/progress', () => ({
useProgress: vi.fn(() => ({ isStarted: false })),
}));

vi.mock('../common/Preloader/usePreloader', () => ({
default: vi.fn(() => false),
}));

vi.mock('../common/Preloader', () => ({
default: ({ visible, children }: any) => (
<div data-testid="preloader">{visible ? 'visible' : 'hidden'}{children}</div>
),
}));

vi.mock('@/container/mfa-enrollment', () => ({
default: vi.fn(() => ({
isMfaEnrollmentVisible: true,
isMfaEnrollmentForced: true,
hideMfaEnrollment: vi.fn(),
})),
}));

vi.mock('@/container/mfa-enrollment/MfaEnrollment', () => ({
default: () => <div data-testid="mfa-enrollment">MFA Enrollment Component</div>,
}));

vi.mock('@/components/modal-container/ModalContainer.component', () => ({
default: () => <div data-testid="modal-container">ModalContainer</div>,
}));

vi.mock('./Header', () => ({
default: () => <div data-testid="legacy-header">Header</div>,
}));

vi.mock('./server-sidebar', () => ({
default: () => <div data-testid="server-sidebar">Server Sidebar</div>,
}));

vi.mock('./server-sidebar/SidebarOverlay', () => ({
default: () => <div data-testid="sidebar-overlay">Overlay</div>,
}));

vi.mock('@/core/routing', () => ({
IFrameAppRouter: () => <div data-testid="iframe-router">IFrame Router</div>,
}));

vi.mock('@/core/container', () => ({
default: () => ({ betaVersion: true }),
}));

vi.mock('@/container/common/pnr-beta-modal', () => ({
default: () => <div data-testid="beta-modal">Beta Modal</div>,
}));

function renderWithProviders(ui: React.ReactNode) {
const queryClient = new QueryClient();
return render(
<BrowserRouter>
<QueryClientProvider client={queryClient}>{ui}</QueryClientProvider>
</BrowserRouter>,
);
}

describe('LegacyContainer', () => {
const mockedUseMfaEnrollment = vi.mocked(useMfaEnrollment);

beforeEach(() => {
vi.clearAllMocks();
});

afterEach(() => {
vi.restoreAllMocks();
});

it('should render MFA Enrollment when visible', async () => {
mockedUseMfaEnrollment.mockImplementation(() => ({
isMfaEnrollmentVisible: true,
isMfaEnrollmentForced: true,
hideMfaEnrollment: vi.fn(),
}));

renderWithProviders(<LegacyContainer isCookiePolicyModalClosed />);

await screen.findByTestId('mfa-enrollment');
expect(screen.getByTestId('mfa-enrollment')).toBeInTheDocument();
});

it('should NOT render MFA Enrollment when not visible', async () => {
mockedUseMfaEnrollment.mockImplementation(() => ({
isMfaEnrollmentVisible: false,
isMfaEnrollmentForced: false,
hideMfaEnrollment: vi.fn(),
}));

renderWithProviders(<LegacyContainer isCookiePolicyModalClosed />);

await waitFor(() => {
expect(screen.queryByTestId('mfa-enrollment')).not.toBeInTheDocument();
});
});

it('should render modal container when cookie policy closed', async () => {
renderWithProviders(<LegacyContainer isCookiePolicyModalClosed />);
await screen.findByTestId('modal-container');
expect(screen.getByTestId('modal-container')).toBeInTheDocument();
});

it('should render header, sidebar, overlay and beta modal', async () => {
renderWithProviders(<LegacyContainer isCookiePolicyModalClosed />);

expect(screen.getByTestId('legacy-header')).toBeInTheDocument();
expect(screen.getByTestId('server-sidebar')).toBeInTheDocument();
expect(screen.getByTestId('sidebar-overlay')).toBeInTheDocument();
await screen.findByTestId('beta-modal');
expect(screen.getByTestId('beta-modal')).toBeInTheDocument();
});

it('should render iframe router', () => {
renderWithProviders(<LegacyContainer isCookiePolicyModalClosed />);
expect(screen.getByTestId('iframe-router')).toBeInTheDocument();
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import MfaEnrollment from './MfaEnrollment';

const mockGetURL = vi.fn(() => 'https://www.mocked-mfa-url.com');
const mockTrackClick = vi.fn();
const mockGetPlugin = vi.fn((plugin: string) => {
if (plugin === 'navigation') {
return { getURL: mockGetURL };
}
if (plugin === 'tracking') {
return { trackClick: mockTrackClick };
}
return {};
});

vi.mock('react-i18next', () => ({
useTranslation: () => ({
t: (key: string) => key,
}),
}));

vi.mock('@/context', () => ({
useShell: () => ({
getPlugin: mockGetPlugin,
}),
}));

vi.mock('@ovhcloud/ods-components/react', () => ({
OsdsButton: (props: any) => (
<button {...props}>{props.children}</button>
),
OsdsText: (props: any) => <p {...props}>{props.children}</p>,
OsdsIcon: () => <span data-testid="icon" />,
}));

function setup(props?: Partial<React.ComponentProps<typeof MfaEnrollment>>) {
const onHide = vi.fn();
const utils = render(<MfaEnrollment onHide={onHide} {...props} />);
return { ...utils, onHide };
}

describe('MfaEnrollment', () => {
beforeEach(() => {
vi.clearAllMocks();
});

it('should render MFA enrollment text and buttons', () => {
setup();

expect(screen.getByText('mfa_enrollment_title')).toBeInTheDocument();
expect(screen.getByText('mfa_enrollment_info1')).toBeInTheDocument();
expect(screen.getByText('mfa_enrollment_info2')).toBeInTheDocument();
expect(screen.getByText('mfa_enrollment_cancel')).toBeInTheDocument();
expect(screen.getByText('mfa_enrollment_go')).toBeInTheDocument();
});

it('should hide cancel button when forced=true', () => {
setup({ forced: true });
expect(screen.queryByText('mfa_enrollment_cancel')).not.toBeInTheDocument();
expect(screen.getByText('mfa_enrollment_go')).toBeInTheDocument();
});

it('should call onHide when cancel button is clicked', () => {
const { onHide } = setup();

fireEvent.click(screen.getByText('mfa_enrollment_cancel'));

expect(onHide).toHaveBeenCalledTimes(1);
});

it('should redirect and track when clicking "go"', () => {
const { onHide } = setup();

fireEvent.click(screen.getByText('mfa_enrollment_go'));

expect(mockTrackClick).toHaveBeenCalledWith(
expect.objectContaining({
name: 'MFA_ENROLLMENT',
type: 'navigation',
}),
);

expect(mockGetURL).toHaveBeenCalledWith(
'dedicated',
expect.stringContaining('/useraccount/security/mfa?redirect_url='),
);

expect(onHide).toHaveBeenCalled();
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
import React from 'react';
import { BrowserRouter } from 'react-router-dom';
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { render, screen, waitFor } from '@testing-library/react';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import useMfaEnrollment from '@/container/mfa-enrollment';
import NavReshuffleContainer from '.';

vi.mock('@/context', () => ({
useShell: () => ({
getPlugin: vi.fn().mockReturnValue({
getEnvironment: vi.fn().mockReturnValue({
getApplications: vi.fn().mockReturnValue([]),
getRegion: vi.fn().mockReturnValue('EU'),
}),
getURL: vi.fn().mockReturnValue('https://www.mocked-mfa-url.com'),
getLocale: vi.fn().mockReturnValue('fr_FR'),
}),
setMessageBus: vi.fn(),
}),
}));

vi.mock('@/core/product-nav-reshuffle', () => ({
default: vi.fn(() => ({
isNavigationSidebarOpened: false,
openNavigationSidebar: vi.fn(),
closeNavigationSidebar: vi.fn(),
skipToTheMainContentSlot: vi.fn(),
})),
}));

vi.mock('@/context/progress', () => ({
useProgress: vi.fn(() => ({ isStarted: false })),
}));

vi.mock('../common/Preloader/usePreloader', () => ({
default: vi.fn(() => false),
}));

vi.mock('../common/Preloader', () => ({
default: ({ visible, children }: any) => (
<div data-testid="preloader">
{visible ? 'visible' : 'hidden'}
{children}
</div>
),
}));

vi.mock('@/container/mfa-enrollment', () => ({
default: vi.fn(() => ({
isMfaEnrollmentVisible: true,
isMfaEnrollmentForced: true,
hideMfaEnrollment: vi.fn(),
})),
}));

vi.mock('@/container/mfa-enrollment/MfaEnrollment', () => ({
default: () => <div data-testid="mfa-enrollment">MFA Enrollment Component</div>,
}));

vi.mock('./header', () => ({
default: () => <div data-testid="header" />,
}));

vi.mock('./sidebar', () => ({
default: () => <div data-testid="sidebar" />,
}));

vi.mock('./onboarding', () => ({
default: () => <div data-testid="onboarding" />,
}));

vi.mock('@/components/modal-container/ModalContainer.component', () => ({
default: () => <div data-testid="modal-container" />,
}));

vi.mock('@/core/routing', () => ({
IFrameAppRouter: () => <div data-testid="iframe-router" />,
}));

function renderWithProviders(ui: React.ReactNode) {
const queryClient = new QueryClient();
return render(
<BrowserRouter>
<QueryClientProvider client={queryClient}>{ui}</QueryClientProvider>
</BrowserRouter>,
);
}

describe('NavReshuffleContainer - MFA Enrollment behavior', () => {
const mockedUseMfaEnrollment = vi.mocked(useMfaEnrollment);

beforeEach(() => {
vi.clearAllMocks();
});

afterEach(() => {
vi.restoreAllMocks();
});

it('should display MfaEnrollment component when visible', async () => {
mockedUseMfaEnrollment.mockImplementation(() => ({
isMfaEnrollmentVisible: true,
isMfaEnrollmentForced: true,
hideMfaEnrollment: vi.fn(),
}));

renderWithProviders(<NavReshuffleContainer isCookiePolicyModalClosed />);

await screen.findByTestId('mfa-enrollment');

expect(screen.getByTestId('mfa-enrollment')).toBeInTheDocument();
});

it('should NOT display MfaEnrollment when not visible', async () => {
mockedUseMfaEnrollment.mockImplementation(() => ({
isMfaEnrollmentVisible: false,
isMfaEnrollmentForced: false,
hideMfaEnrollment: vi.fn(),
}));

renderWithProviders(<NavReshuffleContainer isCookiePolicyModalClosed />);

await waitFor(() => {
expect(screen.queryByTestId('mfa-enrollment')).not.toBeInTheDocument();
});
});

it('should pass correct props (forced & onHide) to MfaEnrollment', async () => {
const hideFn = vi.fn();
mockedUseMfaEnrollment.mockImplementation(() => ({
isMfaEnrollmentVisible: true,
isMfaEnrollmentForced: true,
hideMfaEnrollment: hideFn,
}));

renderWithProviders(<NavReshuffleContainer isCookiePolicyModalClosed />);

const mfaElement = await screen.findByTestId('mfa-enrollment');
expect(mfaElement).toBeInTheDocument();
expect(mockedUseMfaEnrollment).toHaveBeenCalled();
});
});
Loading
Loading