Skip to content

Commit d9154b5

Browse files
committed
changing hard-coded to enum
1 parent 65c66ba commit d9154b5

7 files changed

Lines changed: 49 additions & 35 deletions

File tree

web-report/src/AppProvider.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
parseReviewFile,
99
REVIEW_FILE_NAME,
1010
REVIEW_SCHEMA_VERSION,
11+
REVIEW_STATE,
1112
ReviewFile,
1213
ReviewState,
1314
reviewsEqual,
@@ -233,7 +234,7 @@ export const AppProvider = ({ children }: AppProviderProps) => {
233234
};
234235
for (const [id, r] of Object.entries(source)) {
235236
const comment = (r.comment ?? "").trim();
236-
if (r.state !== "NOT-REVIEWED" || comment !== "") {
237+
if (r.state !== REVIEW_STATE.NOT_REVIEWED || comment !== "") {
237238
file.reviews[id] = {state: r.state, comment: r.comment ?? ""};
238239
}
239240
}

web-report/src/components/Dashboard.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {Tests} from "@/pages/Tests.tsx";
1010

1111
import {ScrollArea, ScrollBar} from "@/components/ui/scroll-area.tsx";
1212
import {useAppContext} from "@/AppProvider.tsx";
13+
import {REVIEW_STATE} from "@/types/Review.ts";
1314

1415

1516
export interface ITestTabs {
@@ -26,8 +27,8 @@ export const Dashboard: React.FC = () => {
2627
let reviewed = 0;
2728
for (const tc of data.testCases) {
2829
if (!tc.id) continue;
29-
const state = reviews[tc.id]?.state ?? "NOT-REVIEWED";
30-
if (state !== "NOT-REVIEWED") reviewed++;
30+
const state = reviews[tc.id]?.state ?? REVIEW_STATE.NOT_REVIEWED;
31+
if (state !== REVIEW_STATE.NOT_REVIEWED) reviewed++;
3132
}
3233
return {reviewed, total};
3334
}, [data, reviews]);

web-report/src/components/TestReviewRow.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, {useEffect, useState} from "react";
22
import {Code, ChevronRight} from "lucide-react";
33
import {useAppContext} from "@/AppProvider.tsx";
4-
import {ReviewState, SELECTABLE_REVIEW_STATES} from "@/types/Review.ts";
4+
import {REVIEW_STATE, ReviewState, SELECTABLE_REVIEW_STATES} from "@/types/Review.ts";
55

66
interface IProps {
77
testId: string;
@@ -11,15 +11,15 @@ interface IProps {
1111

1212
const stateBadgeClass = (state: ReviewState): string => {
1313
switch (state) {
14-
case "ACCEPTED":
14+
case REVIEW_STATE.ACCEPTED:
1515
return "bg-green-100 border-green-500 text-green-800";
16-
case "REJECTED":
16+
case REVIEW_STATE.REJECTED:
1717
return "bg-red-100 border-red-500 text-red-800";
18-
case "PREVIOUSLY-ACCEPTED":
18+
case REVIEW_STATE.PREVIOUSLY_ACCEPTED:
1919
return "bg-green-50 border-green-300 text-green-700";
20-
case "PREVIOUSLY-REJECTED":
20+
case REVIEW_STATE.PREVIOUSLY_REJECTED:
2121
return "bg-red-50 border-red-300 text-red-700";
22-
case "NOT-REVIEWED":
22+
case REVIEW_STATE.NOT_REVIEWED:
2323
default:
2424
return "bg-gray-100 border-gray-400 text-gray-700";
2525
}

web-report/src/pages/Tests.tsx

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {Accordion, AccordionContent, AccordionItem, AccordionTrigger} from "@/co
33
import {Button} from "@/components/ui/button.tsx";
44
import {Progress} from "@/components/ui/progress.tsx";
55
import {useAppContext} from "@/AppProvider.tsx";
6-
import {REVIEW_STATES, ReviewState} from "@/types/Review.ts";
6+
import {REVIEW_STATE, REVIEW_STATES, ReviewState, SELECTABLE_REVIEW_STATES} from "@/types/Review.ts";
77
import {TestReviewRow} from "@/components/TestReviewRow.tsx";
88
import {TestDetailDialog} from "@/components/TestDetailDialog.tsx";
99
import {Download, Upload, X} from "lucide-react";
@@ -39,16 +39,10 @@ export const Tests: React.FC = () => {
3939
const testFilePaths = useMemo(() => data?.testFilePaths ?? [], [data]);
4040

4141
const counts = useMemo(() => {
42-
const c: Record<ReviewState, number> = {
43-
"NOT-REVIEWED": 0,
44-
"ACCEPTED": 0,
45-
"REJECTED": 0,
46-
"PREVIOUSLY-ACCEPTED": 0,
47-
"PREVIOUSLY-REJECTED": 0,
48-
};
42+
const c = Object.fromEntries(REVIEW_STATES.map(s => [s, 0])) as Record<ReviewState, number>;
4943
for (const tc of testCases) {
5044
if (!tc.id) continue;
51-
c[(reviews[tc.id] ?? {state: "NOT-REVIEWED"}).state]++;
45+
c[(reviews[tc.id] ?? {state: REVIEW_STATE.NOT_REVIEWED}).state]++;
5246
}
5347
return c;
5448
}, [testCases, reviews]);
@@ -59,7 +53,7 @@ export const Tests: React.FC = () => {
5953
for (const tc of testCases) {
6054
if (!tc.id || !tc.filePath) continue;
6155
if (filter !== "ALL") {
62-
const state = (reviews[tc.id] ?? {state: "NOT-REVIEWED"}).state;
56+
const state = (reviews[tc.id] ?? {state: REVIEW_STATE.NOT_REVIEWED}).state;
6357
if (state !== filter) continue;
6458
}
6559
const arr = map.get(tc.filePath) ?? [];
@@ -125,7 +119,7 @@ export const Tests: React.FC = () => {
125119

126120
{testCases.length > 0 && (() => {
127121
const total = testCases.length;
128-
const reviewed = total - counts["NOT-REVIEWED"];
122+
const reviewed = total - counts[REVIEW_STATE.NOT_REVIEWED];
129123
const pct = total === 0 ? 0 : Math.round((reviewed / total) * 100);
130124
return (
131125
<div className="mb-4" data-testid="reviews-progress">
@@ -147,7 +141,7 @@ export const Tests: React.FC = () => {
147141
>
148142
ALL ({testCases.length})
149143
</button>
150-
{REVIEW_STATES.filter(s => s !== "PREVIOUSLY-ACCEPTED" && s !== "PREVIOUSLY-REJECTED").map(s => (
144+
{SELECTABLE_REVIEW_STATES.map(s => (
151145
<button
152146
key={s}
153147
className={filterButtonClass(filter === s)}

web-report/src/types/Review.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,35 @@
1-
export const REVIEW_STATES = [
2-
"NOT-REVIEWED",
3-
"ACCEPTED",
4-
"REJECTED",
5-
"PREVIOUSLY-ACCEPTED",
6-
"PREVIOUSLY-REJECTED",
7-
] as const;
1+
export const REVIEW_STATE = {
2+
NOT_REVIEWED: "NOT-REVIEWED",
3+
ACCEPTED: "ACCEPTED",
4+
REJECTED: "REJECTED",
5+
PREVIOUSLY_ACCEPTED: "PREVIOUSLY-ACCEPTED",
6+
PREVIOUSLY_REJECTED: "PREVIOUSLY-REJECTED",
7+
} as const;
88

9-
export type ReviewState = typeof REVIEW_STATES[number];
9+
export type ReviewState = typeof REVIEW_STATE[keyof typeof REVIEW_STATE];
10+
11+
export const REVIEW_STATES: readonly ReviewState[] = Object.values(REVIEW_STATE);
1012

1113
export const SELECTABLE_REVIEW_STATES: readonly ReviewState[] = [
12-
"NOT-REVIEWED",
13-
"ACCEPTED",
14-
"REJECTED",
14+
REVIEW_STATE.NOT_REVIEWED,
15+
REVIEW_STATE.ACCEPTED,
16+
REVIEW_STATE.REJECTED,
1517
];
1618

1719
export interface TestReview {
1820
state: ReviewState;
1921
comment: string;
2022
}
2123

22-
export const DEFAULT_REVIEW: TestReview = {state: "NOT-REVIEWED", comment: ""};
24+
export const DEFAULT_REVIEW: TestReview = {state: REVIEW_STATE.NOT_REVIEWED, comment: ""};
2325

2426
export interface ReviewFile {
2527
schemaVersion: string;
2628
reviews: Record<string, TestReview>;
2729
}
2830

2931
export const REVIEW_FILE_NAME = "report-review.json";
30-
export const REVIEW_SCHEMA_VERSION = "1.0";
32+
export const REVIEW_SCHEMA_VERSION = __WFC_VERSION__;
3133

3234
export const isReviewState = (v: unknown): v is ReviewState =>
3335
typeof v === "string" && (REVIEW_STATES as readonly string[]).includes(v);
@@ -38,7 +40,7 @@ export const normalizeReviews = (
3840
const out: Record<string, TestReview> = {};
3941
for (const [id, r] of Object.entries(reviews)) {
4042
const comment = (r.comment ?? "").trim();
41-
if (r.state !== "NOT-REVIEWED" || comment !== "") {
43+
if (r.state !== REVIEW_STATE.NOT_REVIEWED || comment !== "") {
4244
out[id] = {state: r.state, comment: r.comment ?? ""};
4345
}
4446
}

web-report/src/vite-env.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
/// <reference types="vite/client" />
2+
3+
declare const __WFC_VERSION__: string;

web-report/vite.config.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,26 @@
11
import path from "path"
2+
import fs from "fs"
23
import { defineConfig, UserConfig } from 'vite'
34
import react from '@vitejs/plugin-react'
45

56
import tailwindcss from "@tailwindcss/vite"
67

8+
const readWfcVersion = (): string => {
9+
const pomPath = path.resolve(__dirname, "../pom.xml");
10+
const pom = fs.readFileSync(pomPath, "utf8");
11+
const match = pom.match(/<artifactId>commons<\/artifactId>\s*<version>([^<]+)<\/version>/);
12+
if (!match) throw new Error(`Could not find project <version> in ${pomPath}`);
13+
return match[1];
14+
};
15+
16+
const WFC_VERSION = readWfcVersion();
17+
718
// https://vite.dev/config/
819
export default defineConfig({
920
plugins: [react(), tailwindcss()],
21+
define: {
22+
__WFC_VERSION__: JSON.stringify(WFC_VERSION),
23+
},
1024
test: {
1125
globals: true,
1226
environment: 'happy-dom',

0 commit comments

Comments
 (0)