From 0a10843af197b68937e49d63686a4ecebe05c21b Mon Sep 17 00:00:00 2001 From: Jade Carino Date: Tue, 23 Jun 2026 11:32:12 +0100 Subject: [PATCH] feat/test: Remove the 'Test Runs' page from experimental features, update unit tests to reflect it should always be visible/clickable Signed-off-by: Jade Carino --- galasa-ui/messages/de.json | 1 - galasa-ui/messages/en.json | 1 - .../components/headers/GalasaMenuItems.tsx | 7 +-- .../ExperimentalFeaturesSection.tsx | 4 -- .../ResultsTablePageSizeSetting.tsx | 37 ++++++------- .../tests/__snapshots__/layout.test.tsx.snap | 52 +++++++++++++++++++ .../components/headers/PageHeader.test.tsx | 28 +++++----- .../ExperimentalFeaturesSection.test.tsx | 18 +++---- .../ResultsTablePageSizingSetting.test.tsx | 14 ----- .../contexts/feature-flag-context.test.tsx | 21 ++++---- galasa-ui/src/tests/mysettings.test.tsx | 2 +- galasa-ui/src/utils/featureFlags.ts | 2 - 12 files changed, 103 insertions(+), 84 deletions(-) diff --git a/galasa-ui/messages/de.json b/galasa-ui/messages/de.json index 74da8072..1b5d5572 100644 --- a/galasa-ui/messages/de.json +++ b/galasa-ui/messages/de.json @@ -30,7 +30,6 @@ "title": "Experimentelle Funktionen", "description": "Früher Zugriff auf neue Funktionen. Diese Funktionen sind experimentell und können sich ändern oder entfernt werden.", "features": { - "testRunSearch": "Testlauf-Suche und Anzeige", "graph": "Testlauf-Diagramm" } }, diff --git a/galasa-ui/messages/en.json b/galasa-ui/messages/en.json index d9098208..2717a8e7 100644 --- a/galasa-ui/messages/en.json +++ b/galasa-ui/messages/en.json @@ -30,7 +30,6 @@ "title": "Experimental Features", "description": "Early access to new features. These are experimental and subject to change or removal.", "features": { - "testRunSearch": "Test Run searching and viewing", "graph": "Test Run Graphs" } }, diff --git a/galasa-ui/src/components/headers/GalasaMenuItems.tsx b/galasa-ui/src/components/headers/GalasaMenuItems.tsx index a916b023..4f901b4d 100644 --- a/galasa-ui/src/components/headers/GalasaMenuItems.tsx +++ b/galasa-ui/src/components/headers/GalasaMenuItems.tsx @@ -6,20 +6,15 @@ 'use client'; import { HeaderMenuItem } from '@carbon/react'; -import { useFeatureFlags } from '@/contexts/FeatureFlagContext'; -import { FEATURE_FLAGS } from '@/utils/featureFlags'; import { useTranslations } from 'next-intl'; export default function GalasaMenuItems() { - const { isFeatureEnabled } = useFeatureFlags(); const translations = useTranslations('PageHeader'); return ( <> {translations('users')} - {isFeatureEnabled(FEATURE_FLAGS.TEST_RUNS) && ( - {translations('testRuns')} - )} + {translations('testRuns')} ); } diff --git a/galasa-ui/src/components/mysettings/ExperimentalFeaturesSection.tsx b/galasa-ui/src/components/mysettings/ExperimentalFeaturesSection.tsx index fa087319..5fe0c460 100644 --- a/galasa-ui/src/components/mysettings/ExperimentalFeaturesSection.tsx +++ b/galasa-ui/src/components/mysettings/ExperimentalFeaturesSection.tsx @@ -16,10 +16,6 @@ export default function ExperimentalFeaturesSection() { // Feature configuration for easier management and display const featureConfig = [ - { - key: FEATURE_FLAGS.TEST_RUNS, - label: translations(`features.testRunSearch`), - }, { key: FEATURE_FLAGS.GRAPH, label: translations('features.graph'), diff --git a/galasa-ui/src/components/mysettings/ResultsTablePageSizeSetting.tsx b/galasa-ui/src/components/mysettings/ResultsTablePageSizeSetting.tsx index 2086a0d1..6b2b06e6 100644 --- a/galasa-ui/src/components/mysettings/ResultsTablePageSizeSetting.tsx +++ b/galasa-ui/src/components/mysettings/ResultsTablePageSizeSetting.tsx @@ -10,35 +10,30 @@ import { Dropdown } from '@carbon/react'; import { useTranslations } from 'next-intl'; import styles from '@/styles/mysettings/ResultsTablePageSizingSetting.module.css'; import useResultsTablePageSize from '@/hooks/useResultsTablePageSize'; -import { useFeatureFlags } from '@/contexts/FeatureFlagContext'; -import { FEATURE_FLAGS } from '@/utils/featureFlags'; export default function ResultsTablePageSizingSetting() { const translations = useTranslations('ResultsTablePageSizingSetting'); - const { isFeatureEnabled } = useFeatureFlags(); const { defaultPageSize, setDefaultPageSize } = useResultsTablePageSize(); return ( <> - {isFeatureEnabled(FEATURE_FLAGS.TEST_RUNS) && ( -
-

{translations('title')}

-
-

{translations('description')}

-
-

{translations('defaultTestRunsLabel')}

- item.toString()} - selectedItem={defaultPageSize} - onChange={(e: { selectedItem: number }) => setDefaultPageSize(e.selectedItem)} - size="md" - /> -
+
+

{translations('title')}

+
+

{translations('description')}

+
+

{translations('defaultTestRunsLabel')}

+ item.toString()} + selectedItem={defaultPageSize} + onChange={(e: { selectedItem: number }) => setDefaultPageSize(e.selectedItem)} + size="md" + />
-
- )} +
+
); } diff --git a/galasa-ui/src/tests/__snapshots__/layout.test.tsx.snap b/galasa-ui/src/tests/__snapshots__/layout.test.tsx.snap index c781c08f..5ede2948 100644 --- a/galasa-ui/src/tests/__snapshots__/layout.test.tsx.snap +++ b/galasa-ui/src/tests/__snapshots__/layout.test.tsx.snap @@ -94,6 +94,19 @@ exports[`Layout renders the web UI layout 1`] = ` +
  • + + + Test runs + + +
  • +
  • + + + Test runs + + +
  • @@ -411,6 +437,19 @@ exports[`Layout renders the web UI layout 1`] = ` +
  • + + + Test runs + + +
  • +
  • + + + Test runs + + +
  • diff --git a/galasa-ui/src/tests/components/headers/PageHeader.test.tsx b/galasa-ui/src/tests/components/headers/PageHeader.test.tsx index 4baf67e4..a3bdbacb 100644 --- a/galasa-ui/src/tests/components/headers/PageHeader.test.tsx +++ b/galasa-ui/src/tests/components/headers/PageHeader.test.tsx @@ -7,7 +7,6 @@ import { render, screen } from '@testing-library/react'; import PageHeader from '@/components/headers/PageHeader'; import { FeatureFlagProvider } from '@/contexts/FeatureFlagContext'; import { useRouter } from 'next/navigation'; -import { FEATURE_FLAGS } from '@/utils/featureFlags'; const mockRouter = { push: jest.fn(() => useRouter().push), @@ -51,26 +50,27 @@ test('renders the header containing the header menu', () => { expect(headerMenu).toBeInTheDocument(); }); -test('does NOT render the "Test runs" link by default', () => { +test('renders the "Test runs" link by default', () => { render( ); - const testRunsLink = screen.queryByText('Test runs'); - expect(testRunsLink).not.toBeInTheDocument(); -}); + // Verify "Test runs" link appears in both desktop header nav and mobile side nav + const testRunsLinks = screen.getAllByRole('link', { name: 'Test runs' }); + expect(testRunsLinks).toHaveLength(2); -test('renders the "Test runs" link when the feature flag is enabled via prop', () => { - const initialFlags = JSON.stringify({ [FEATURE_FLAGS.TEST_RUNS]: true }); + // Both links should point to the correct href + testRunsLinks.forEach((link) => { + expect(link).toHaveAttribute('href', '/test-runs'); + }); - render( - - - - ); + // Verify one is in the header navigation (desktop) + const headerNav = screen.getByRole('navigation', { name: 'Galasa menu bar navigation' }); + expect(headerNav).toContainElement(testRunsLinks[0]); - const testRunsLinks = screen.getAllByText('Test runs'); - expect(testRunsLinks.length).toBe(2); + // Verify one is in the side navigation (mobile) + const sideNav = screen.getByRole('navigation', { name: 'Side navigation' }); + expect(sideNav).toContainElement(testRunsLinks[1]); }); diff --git a/galasa-ui/src/tests/components/mysettings/ExperimentalFeaturesSection.test.tsx b/galasa-ui/src/tests/components/mysettings/ExperimentalFeaturesSection.test.tsx index 202e9424..af6da285 100644 --- a/galasa-ui/src/tests/components/mysettings/ExperimentalFeaturesSection.test.tsx +++ b/galasa-ui/src/tests/components/mysettings/ExperimentalFeaturesSection.test.tsx @@ -14,15 +14,15 @@ jest.mock('next-intl', () => ({ title: 'Experimental Features', description: 'Early access to new features. These are experimental and subject to change or removal.', - 'features.testRunSearch': 'Test Run searching and viewing', + 'features.graph': 'Test Run Graphs', }; return translations[key] || key; }, })); describe('ExperimentalFeaturesSection', () => { - test('Renders correctly when "testRuns" flag is disabled: Checkbox is unchecked', () => { - const mockIsFeatureEnabled = (key: string) => key !== FEATURE_FLAGS.TEST_RUNS; + test('Renders correctly when "graph" flag is disabled: Checkbox is unchecked', () => { + const mockIsFeatureEnabled = (key: string) => key !== FEATURE_FLAGS.GRAPH; render( { ); - const checkbox = screen.getByLabelText(/Test Run/i); + const checkbox = screen.getByLabelText(/Test Run Graphs/i); expect(checkbox).not.toBeChecked(); }); - test('Renders correctly when a "testRuns" enabled: Checkbox is checked', () => { + test('Renders correctly when a "graph" enabled: Checkbox is checked', () => { const mockIsFeatureEnabled = (key: string) => { - return key === FEATURE_FLAGS.TEST_RUNS; + return key === FEATURE_FLAGS.GRAPH; }; render( @@ -48,7 +48,7 @@ describe('ExperimentalFeaturesSection', () => { ); - const checkbox = screen.getByLabelText(/Test Run/i); + const checkbox = screen.getByLabelText(/Test Run Graphs/i); expect(checkbox).toBeChecked(); }); @@ -63,10 +63,10 @@ describe('ExperimentalFeaturesSection', () => { ); - const checkbox = screen.getByRole('checkbox', { name: /Test Run/i }); + const checkbox = screen.getByRole('checkbox', { name: /Test Run Graphs/i }); fireEvent.click(checkbox); expect(mockToggle).toHaveBeenCalledTimes(1); - expect(mockToggle).toHaveBeenCalledWith(FEATURE_FLAGS.TEST_RUNS); + expect(mockToggle).toHaveBeenCalledWith(FEATURE_FLAGS.GRAPH); }); }); diff --git a/galasa-ui/src/tests/components/mysettings/ResultsTablePageSizingSetting.test.tsx b/galasa-ui/src/tests/components/mysettings/ResultsTablePageSizingSetting.test.tsx index fa797a0c..cd387cf1 100644 --- a/galasa-ui/src/tests/components/mysettings/ResultsTablePageSizingSetting.test.tsx +++ b/galasa-ui/src/tests/components/mysettings/ResultsTablePageSizingSetting.test.tsx @@ -78,18 +78,4 @@ describe('ResultsTablePageSizingSetting', () => { expect(mockSetDefaultPageSize).toHaveBeenCalledWith(50); }); }); - - describe('when feature flag is disabled', () => { - beforeEach(() => { - mockIsFeatureEnabled.mockReturnValue(false); - }); - - test('does not render the component', () => { - render(); - - expect(screen.queryByText('Test Run Query Results')).toBeNull(); - expect(screen.queryByText('Configure the number of results displayed per page.')).toBeNull(); - expect(screen.queryByTestId('custom-items-per-page-dropdown-test')).toBeNull(); - }); - }); }); diff --git a/galasa-ui/src/tests/contexts/feature-flag-context.test.tsx b/galasa-ui/src/tests/contexts/feature-flag-context.test.tsx index 3bdba463..91c5287c 100644 --- a/galasa-ui/src/tests/contexts/feature-flag-context.test.tsx +++ b/galasa-ui/src/tests/contexts/feature-flag-context.test.tsx @@ -15,8 +15,8 @@ const TestComponent = () => { return (
    -

    Test Runs Enabled: {isFeatureEnabled(FEATURE_FLAGS.TEST_RUNS).toString()}

    - +

    Test Run Graphs Enabled: {isFeatureEnabled(FEATURE_FLAGS.GRAPH).toString()}

    +
    ); }; @@ -39,42 +39,41 @@ describe('Feature Flags Provider and useFeatureFlags Hook', () => { ); - expect(screen.getByText('Test Runs Enabled: false')).toBeInTheDocument(); + expect(screen.getByText('Test Run Graphs Enabled: false')).toBeInTheDocument(); }); test('initializes with provided props from the server', () => { - const initialFlags = JSON.stringify({ [FEATURE_FLAGS.TEST_RUNS]: true }); + const initialFlags = JSON.stringify({ [FEATURE_FLAGS.GRAPH]: true }); render( ); - expect(screen.getByText('Test Runs Enabled: true')).toBeInTheDocument(); + expect(screen.getByText('Test Run Graphs Enabled: true')).toBeInTheDocument(); }); test('verifies feature flag toggling and updates cookie correctly', () => { - const initialFlags = JSON.stringify({ [FEATURE_FLAGS.TEST_RUNS]: false }); + const initialFlags = JSON.stringify({ [FEATURE_FLAGS.GRAPH]: false }); render( ); - expect(screen.getByText('Test Runs Enabled: false')).toBeInTheDocument(); + expect(screen.getByText('Test Run Graphs Enabled: false')).toBeInTheDocument(); // Due to React's strict mode cookieSpy.mockClear(); - const toggleButton = screen.getByText('Toggle Test Runs'); + const toggleButton = screen.getByText('Toggle Test Run Graphs'); fireEvent.click(toggleButton); - expect(screen.getByText('Test Runs Enabled: true')).toBeInTheDocument(); + expect(screen.getByText('Test Run Graphs Enabled: true')).toBeInTheDocument(); const expectedCookieVal = JSON.stringify({ - [FEATURE_FLAGS.TEST_RUNS]: true, - [FEATURE_FLAGS.GRAPH]: false, + [FEATURE_FLAGS.GRAPH]: true, }); expect(cookieSpy).toHaveBeenCalledTimes(1); diff --git a/galasa-ui/src/tests/mysettings.test.tsx b/galasa-ui/src/tests/mysettings.test.tsx index e03df45b..cb62d853 100644 --- a/galasa-ui/src/tests/mysettings.test.tsx +++ b/galasa-ui/src/tests/mysettings.test.tsx @@ -46,7 +46,7 @@ jest.mock('next-intl', () => ({ title: 'Experimental Features', description: 'Early access to new features. These are experimental and subject to change or removal.', - 'features.testRunSearch': 'Test Run searching and viewing', + 'features.graph': 'Test Run Graphs', errorTitle: 'Something went wrong!', errorDescription: 'Please report the problem to your Galasa Ecosystem administrator.', }; diff --git a/galasa-ui/src/utils/featureFlags.ts b/galasa-ui/src/utils/featureFlags.ts index 3b803e4d..395faf81 100644 --- a/galasa-ui/src/utils/featureFlags.ts +++ b/galasa-ui/src/utils/featureFlags.ts @@ -6,13 +6,11 @@ // Centralized feature flags export const FEATURE_FLAGS = { - TEST_RUNS: 'testRuns', GRAPH: 'graph', // Add other feature flags here } as const; export const DEFAULT_FEATURE_FLAGS = { - testRuns: false, graph: false, // Add other feature flags here } as const;