fix: comprehensive code quality, theming, and test coverage improvements

- Fix ExemptionManager apiVersion bug (apps/batch resources used wrong API path)
- Replace resource: any with proper KubeResource interface (strict TypeScript)
- Replace all var(--mui-palette-*) CSS variables with useTheme() + theme.palette.*
- Replace custom drawer with MUI Drawer component (proper a11y and theming)
- Replace alert() calls with StatusLabel-based inline feedback
- Add PolarisErrorBoundary wrapping all registered plugin components
- Export getPolarisApiPath/isFullUrl from polaris.ts, deduplicate in PolarisSettings
- Fix PolarisDataContext test mock missing triggerRefresh
- Fix DashboardView test SimpleTable mock using any
- Remove dead NamespaceDetailView (replaced by drawer), unused MockPolarisProvider,
  unused getSeverityColor export
- Add tests for InlineAuditSection, AppBarScoreBadge, topIssues, checkMapping (32 new)
- Update CLAUDE.md, CHANGELOG.md, README.md for v0.6.0

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
DevContainer User
2026-03-04 16:59:50 +00:00
parent 6dd64e87ce
commit 514de78ba7
23 changed files with 1087 additions and 729 deletions
+14 -12
View File
@@ -4,12 +4,15 @@ import {
SectionBox,
StatusLabel,
} from '@kinvolk/headlamp-plugin/lib/CommonComponents';
import { useTheme } from '@mui/material/styles';
import React from 'react';
import {
AuditData,
getDashboardUrl,
getPolarisApiPath,
getRefreshInterval,
INTERVAL_OPTIONS,
isFullUrl,
setDashboardUrl,
setRefreshInterval,
} from '../api/polaris';
@@ -20,6 +23,7 @@ interface PluginSettingsProps {
}
export default function PolarisSettings(props: PluginSettingsProps) {
const theme = useTheme();
const { data, onDataChange } = props;
const currentInterval = (data?.refreshInterval as number) ?? getRefreshInterval();
const currentUrl = (data?.dashboardUrl as string) ?? getDashboardUrl();
@@ -45,13 +49,11 @@ export default function PolarisSettings(props: PluginSettingsProps) {
setTestResult(null);
try {
const baseUrl = currentUrl;
const apiPath = baseUrl.endsWith('/') ? `${baseUrl}results.json` : `${baseUrl}/results.json`;
const isFullUrl = apiPath.startsWith('http://') || apiPath.startsWith('https://');
const apiPath = getPolarisApiPath();
let result: AuditData;
if (isFullUrl) {
if (isFullUrl(apiPath)) {
const response = await fetch(apiPath);
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
@@ -107,17 +109,17 @@ export default function PolarisSettings(props: PluginSettingsProps) {
style={{
width: '100%',
padding: '4px 8px',
border: '1px solid var(--mui-palette-divider, #e0e0e0)',
border: `1px solid ${theme.palette.divider}`,
borderRadius: '4px',
fontSize: '14px',
backgroundColor: 'var(--mui-palette-background-paper, #fff)',
color: 'var(--mui-palette-text-primary, #000)',
backgroundColor: theme.palette.background.paper,
color: theme.palette.text.primary,
}}
/>
<div
style={{
fontSize: '12px',
color: 'var(--mui-palette-text-secondary, #666)',
color: theme.palette.text.secondary,
marginTop: '4px',
}}
>
@@ -139,11 +141,11 @@ export default function PolarisSettings(props: PluginSettingsProps) {
style={{
padding: '6px 16px',
backgroundColor: testing
? 'var(--mui-palette-action-disabledBackground, #e0e0e0)'
: 'var(--mui-palette-primary-main, #1976d2)',
? theme.palette.action.disabledBackground
: theme.palette.primary.main,
color: testing
? 'var(--mui-palette-action-disabled, #9e9e9e)'
: 'var(--mui-palette-primary-contrastText, #fff)',
? theme.palette.action.disabled
: theme.palette.primary.contrastText,
border: 'none',
borderRadius: '4px',
cursor: testing ? 'not-allowed' : 'pointer',