Skip to content
Open
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
10 changes: 5 additions & 5 deletions src/gitops/Statuses/HealthStatus.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,33 @@ import HealthStatus, { HealthStatusIcon } from './HealthStatus';
describe('HealthStatus', () => {
it('renders Healthy', () => {
expect(renderToStaticMarkup(<HealthStatus status="Healthy" />)).toMatchInlineSnapshot(
`"<div><div><svg data-icon="HeartIcon" style="color:var(--pf-v5-global--success-color--100)"></svg> Healthy</div></div>"`,
`"<div><div><svg data-icon="HeartIcon" style="color:var(--pf-t--global--icon--color--status--success--default)"></svg> Healthy</div></div>"`,
);
});

it('renders Degraded', () => {
expect(renderToStaticMarkup(<HealthStatus status="Degraded" />)).toMatchInlineSnapshot(
`"<div><div><svg data-icon="HeartBrokenIcon" style="color:var(--pf-v5-global--danger-color--100)"></svg> Degraded</div></div>"`,
`"<div><div><svg data-icon="HeartBrokenIcon" style="color:var(--pf-t--global--icon--color--status--danger--default)"></svg> Degraded</div></div>"`,
);
});

it('renders Progressing', () => {
expect(renderToStaticMarkup(<HealthStatus status="Progressing" />)).toMatchInlineSnapshot(
`"<div><div><svg data-icon="CircleNotchIcon" class="undefined fa-spin" style="color:var(--pf-v5-global--primary-color--200)"></svg> Progressing</div></div>"`,
`"<div><div><svg data-icon="CircleNotchIcon" class="undefined fa-spin" style="color:var(--pf-t--global--icon--color--brand--default)"></svg> Progressing</div></div>"`,
);
});

it('renders Unknown for unrecognized status', () => {
expect(renderToStaticMarkup(<HealthStatus status="SomethingElse" />)).toMatchInlineSnapshot(
`"<div><div><svg data-icon="UnknownIcon" style="color:var(--pf-v5-global--disabled-color--100)"></svg> SomethingElse</div></div>"`,
`"<div><div><svg data-icon="UnknownIcon" style="color:var(--pf-t--global--icon--color--disabled)"></svg> SomethingElse</div></div>"`,
);
});

it('renders popover when message is provided', () => {
expect(
renderToStaticMarkup(<HealthStatus status="Degraded" message="Something broke" />),
).toMatchInlineSnapshot(
`"<div><div><div data-testid="popover"><div data-testid="popover-header"><div>Degraded</div></div><div data-testid="popover-body"><div>Something broke</div></div><button data-variant="link"><svg data-icon="HeartBrokenIcon" style="color:var(--pf-v5-global--danger-color--100)"></svg> Degraded</button></div></div></div>"`,
`"<div><div><div data-testid="popover"><div data-testid="popover-header"><div>Degraded</div></div><div data-testid="popover-body"><div>Something broke</div></div><button data-variant="link"><svg data-icon="HeartBrokenIcon" style="color:var(--pf-t--global--icon--color--status--danger--default)"></svg> Degraded</button></div></div></div>"`,
Comment on lines 11 to +33

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '## file\n'
git ls-files 'src/gitops/Statuses/HealthStatus.test.tsx' 'src/gitops/Statuses/HealthStatus.tsx' '.eslintrc*' 'eslint.config.*' 'package.json' | sed 's#^`#-` #'

printf '\n## file excerpts\n'
for f in src/gitops/Statuses/HealthStatus.test.tsx src/gitops/Statuses/HealthStatus.tsx; do
  if [ -f "$f" ]; then
    echo "--- $f"
    nl -ba "$f" | sed -n '1,120p'
  fi
done

printf '\n## eslint/react config references\n'
rg -n --hidden --glob '!node_modules' --glob '!dist' --glob '!build' \
  'react/react-in-jsx-scope|react/jsx-runtime|jsx-runtime|jsxImportSource|`@typescript-eslint`|eslint-plugin-react|react' \
  .eslintrc* eslint.config.* package.json . 2>/dev/null | sed -n '1,220p'

Repository: redhat-developer/gitops-console-plugin

Length of output: 404


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '## nearby test files with JSX imports\n'
rg -n --glob 'src/**/*.test.tsx' --glob 'src/**/*.tsx' \
  'import React from '\''react'\''|react/react-in-jsx-scope|jsx-runtime' src | sed -n '1,240p'

Repository: redhat-developer/gitops-console-plugin

Length of output: 372


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "## src/gitops/Statuses/HealthStatus.test.tsx"
sed -n '1,120p' src/gitops/Statuses/HealthStatus.test.tsx

echo
echo "## .eslintrc.json"
sed -n '1,220p' .eslintrc.json

echo
echo "## package.json relevant bits"
sed -n '1,220p' package.json | sed -n '/"eslint"/,/}/p'

echo
echo "## React imports in nearby tsx files"
rg -n --glob 'src/**/*.tsx' "import React from 'react';|react/react-in-jsx-scope|jsx-runtime" src | sed -n '1,240p'

Repository: redhat-developer/gitops-console-plugin

Length of output: 7008


Fix the JSX-in-scope lint failure in this test file.
src/gitops/Statuses/HealthStatus.test.tsx uses JSX but doesn't import React, so react/react-in-jsx-scope fails under the current ESLint config.

Suggested fix
+import React from 'react';
 import { renderToStaticMarkup } from 'react-dom/server';
 import HealthStatus, { HealthStatusIcon } from './HealthStatus';
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
it('renders Degraded', () => {
expect(renderToStaticMarkup(<HealthStatus status="Degraded" />)).toMatchInlineSnapshot(
`"<div><div><svg data-icon="HeartBrokenIcon" style="color:var(--pf-v5-global--danger-color--100)"></svg> Degraded</div></div>"`,
`"<div><div><svg data-icon="HeartBrokenIcon" style="color:var(--pf-t--global--icon--color--status--danger--default)"></svg> Degraded</div></div>"`,
);
});
it('renders Progressing', () => {
expect(renderToStaticMarkup(<HealthStatus status="Progressing" />)).toMatchInlineSnapshot(
`"<div><div><svg data-icon="CircleNotchIcon" class="undefined fa-spin" style="color:var(--pf-v5-global--primary-color--200)"></svg> Progressing</div></div>"`,
`"<div><div><svg data-icon="CircleNotchIcon" class="undefined fa-spin" style="color:var(--pf-t--global--icon--color--brand--default)"></svg> Progressing</div></div>"`,
);
});
it('renders Unknown for unrecognized status', () => {
expect(renderToStaticMarkup(<HealthStatus status="SomethingElse" />)).toMatchInlineSnapshot(
`"<div><div><svg data-icon="UnknownIcon" style="color:var(--pf-v5-global--disabled-color--100)"></svg> SomethingElse</div></div>"`,
`"<div><div><svg data-icon="UnknownIcon" style="color:var(--pf-t--global--icon--color--disabled)"></svg> SomethingElse</div></div>"`,
);
});
it('renders popover when message is provided', () => {
expect(
renderToStaticMarkup(<HealthStatus status="Degraded" message="Something broke" />),
).toMatchInlineSnapshot(
`"<div><div><div data-testid="popover"><div data-testid="popover-header"><div>Degraded</div></div><div data-testid="popover-body"><div>Something broke</div></div><button data-variant="link"><svg data-icon="HeartBrokenIcon" style="color:var(--pf-v5-global--danger-color--100)"></svg> Degraded</button></div></div></div>"`,
`"<div><div><div data-testid="popover"><div data-testid="popover-header"><div>Degraded</div></div><div data-testid="popover-body"><div>Something broke</div></div><button data-variant="link"><svg data-icon="HeartBrokenIcon" style="color:var(--pf-t--global--icon--color--status--danger--default)"></svg> Degraded</button></div></div></div>"`,
import React from 'react';
import { renderToStaticMarkup } from 'react-dom/server';
import HealthStatus, { HealthStatusIcon } from './HealthStatus';
🧰 Tools
🪛 ESLint

[error] 12-12: 'React' must be in scope when using JSX

(react/react-in-jsx-scope)


[error] 18-18: 'React' must be in scope when using JSX

(react/react-in-jsx-scope)


[error] 24-24: 'React' must be in scope when using JSX

(react/react-in-jsx-scope)


[error] 31-31: 'React' must be in scope when using JSX

(react/react-in-jsx-scope)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/gitops/Statuses/HealthStatus.test.tsx` around lines 11 - 33, The
HealthStatus test file uses JSX in the snapshots and render calls but is missing
the React import required by the current react/react-in-jsx-scope lint rule. Add
the React import at the top of HealthStatus.test.tsx so the JSX in the
HealthStatus test cases compiles and lints correctly.

Source: Linters/SAST tools

);
});
});
Expand Down
12 changes: 6 additions & 6 deletions src/gitops/Statuses/OperationState.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,39 +27,39 @@ describe('OperationState', () => {
expect(
renderToStaticMarkup(<OperationState app={makeApp('Running', 'Sync') as any} />),
).toMatchInlineSnapshot(
`"<svg data-icon="CircleNotchIcon" class="undefined fa-spin" style="color:var(--pf-v5-global--primary-color--200)"></svg> Syncing"`,
`"<svg data-icon="CircleNotchIcon" class="undefined fa-spin" style="color:var(--pf-t--global--icon--color--brand--default)"></svg> Syncing"`,
);
});

it('renders Sync failed for Failed phase', () => {
expect(
renderToStaticMarkup(<OperationState app={makeApp('Failed', 'Sync') as any} />),
).toMatchInlineSnapshot(
`"<svg data-icon="ExclamationCircleIcon" style="color:var(--pf-v5-global--danger-color--100)"></svg> Sync failed"`,
`"<svg data-icon="ExclamationCircleIcon" style="color:var(--pf-t--global--icon--color--status--danger--default)"></svg> Sync failed"`,
);
});

it('renders Sync error for Error phase', () => {
expect(
renderToStaticMarkup(<OperationState app={makeApp('Error', 'Sync') as any} />),
).toMatchInlineSnapshot(
`"<svg data-icon="ExclamationCircleIcon" style="color:var(--pf-v5-global--danger-color--100)"></svg> Sync error"`,
`"<svg data-icon="ExclamationCircleIcon" style="color:var(--pf-t--global--icon--color--status--danger--default)"></svg> Sync error"`,
);
});

it('renders Sync OK for Succeeded phase', () => {
expect(
renderToStaticMarkup(<OperationState app={makeApp('Succeeded', 'Sync') as any} />),
).toMatchInlineSnapshot(
`"<svg data-icon="HeartIcon" style="color:var(--pf-v5-global--success-color--100)"></svg> Sync OK"`,
`"<svg data-icon="HeartIcon" style="color:var(--pf-t--global--icon--color--status--success--default)"></svg> Sync OK"`,
);
});

it('renders Terminated for Terminating phase', () => {
expect(
renderToStaticMarkup(<OperationState app={makeApp('Terminating', 'Sync') as any} />),
).toMatchInlineSnapshot(
`"<svg data-icon="BanIcon" style="color:var(--pf-v5-global--disabled-color--100)"></svg> Terminated"`,
`"<svg data-icon="BanIcon" style="color:var(--pf-t--global--icon--color--disabled)"></svg> Terminated"`,
);
});

Expand All @@ -73,7 +73,7 @@ describe('OperationState', () => {
expect(
renderToStaticMarkup(<OperationState app={makeApp('Running', 'Sync') as any} quiet />),
).toMatchInlineSnapshot(
`"<svg data-icon="CircleNotchIcon" class="undefined fa-spin" style="color:var(--pf-v5-global--primary-color--200)"></svg> Syncing"`,
`"<svg data-icon="CircleNotchIcon" class="undefined fa-spin" style="color:var(--pf-t--global--icon--color--brand--default)"></svg> Syncing"`,
);
});
});
4 changes: 2 additions & 2 deletions src/gitops/Statuses/SyncStatus.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ describe('SyncStatus', () => {

it('renders OutOfSync', () => {
expect(renderToStaticMarkup(<SyncStatus status="OutOfSync" />)).toMatchInlineSnapshot(
`"<span><svg data-icon="ArrowCircleUpIcon" style="color:var(--pf-v5-global--warning-color--100)"></svg> OutOfSync</span>"`,
`"<span><svg data-icon="ArrowCircleUpIcon" style="color:var(--pf-t--global--icon--color--status--warning--default)"></svg> OutOfSync</span>"`,
);
});

it('renders Unknown', () => {
expect(renderToStaticMarkup(<SyncStatus status="Unknown" />)).toMatchInlineSnapshot(
`"<span><svg data-icon="UnknownIcon" style="color:var(--pf-v5-global--disabled-color--100)"></svg> Unknown</span>"`,
`"<span><svg data-icon="UnknownIcon" style="color:var(--pf-t--global--icon--color--disabled)"></svg> Unknown</span>"`,
);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,10 @@

.step-edge {
&.step-edge-healthy {
stroke: var(--pf-v5-global--success-color--100);
stroke: var(--pf-t--global--icon--color--status--success--default);
}
&.step-edge-warning {
stroke: var(--pf-v5-global--warning-color--100);
stroke: var(--pf-t--global--icon--color--status--warning--default);
}
&.step-edge-progressing {
stroke: lightblue;
Expand All @@ -93,12 +93,12 @@

.step-edge-terminal.pf-topology-connector-arrow {
&.step-edge-terminal-healthy {
stroke: var(--pf-v5-global--success-color--100);
fill: var(--pf-v5-global--success-color--100);
stroke: var(--pf-t--global--icon--color--status--success--default);
fill: var(--pf-t--global--icon--color--status--success--default);
}
&.step-edge-terminal-warning {
stroke: var(--pf-v5-global--warning-color--100);
fill: var(--pf-v5-global--warning-color--100);
stroke: var(--pf-t--global--icon--color--status--warning--default);
fill: var(--pf-t--global--icon--color--status--warning--default);
}
&.step-edge-terminal-progressing {
stroke: lightblue;
Expand Down
14 changes: 7 additions & 7 deletions src/gitops/utils/components/Icons/Icons.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,13 @@ import {
// import { global_warning_color_100 as warningColor } from '@patternfly/react-tokens/dist/js/global_warning_color_100';
// import { global_success_color_100 as successColor } from '@patternfly/react-tokens/dist/js/global_success_color_100';

// Modern PatternFly v5 CSS variables approach
export const dangerColor = 'var(--pf-v5-global--danger-color--100)';
export const blueDefaultColor = 'var(--pf-v5-global--primary-color--200)';
export const disabledColor = 'var(--pf-v5-global--disabled-color--100)';
export const blueInfoColor = 'var(--pf-v5-global--palette--blue-300)';
export const warningColor = 'var(--pf-v5-global--warning-color--100)';
export const successColor = 'var(--pf-v5-global--success-color--100)';
// PatternFly 6 design tokens
export const dangerColor = 'var(--pf-t--global--icon--color--status--danger--default)';
export const blueDefaultColor = 'var(--pf-t--global--icon--color--brand--default)';
export const disabledColor = 'var(--pf-t--global--icon--color--disabled)';
export const blueInfoColor = 'var(--pf-t--global--icon--color--status--info--default)';
export const warningColor = 'var(--pf-t--global--icon--color--status--warning--default)';
export const successColor = 'var(--pf-t--global--icon--color--status--success--default)';

export {
BlueInfoCircleIcon,
Expand Down
Loading
Loading