diff --git a/web-report/src/AppContent.tsx b/web-report/src/AppContent.tsx index 831cd8e..0121444 100644 --- a/web-report/src/AppContent.tsx +++ b/web-report/src/AppContent.tsx @@ -1,10 +1,23 @@ import {useAppContext} from "@/AppProvider.tsx"; import {LoadingScreen} from "@/components/LoadingScreen.tsx"; import {Dashboard} from "@/components/Dashboard.tsx"; +import {ErrorDisplay} from "@/components/ErrorDisplay.tsx"; export const AppContent: React.FC = () => { - const {data, loading, error} = useAppContext(); + const {data, loading, error, invalidReportErrors} = useAppContext(); + if(invalidReportErrors) + { + return( +
+ +
+ ) + } if (error){ return (
@@ -14,6 +27,7 @@ export const AppContent: React.FC = () => {

{error}

+
) } diff --git a/web-report/src/AppProvider.tsx b/web-report/src/AppProvider.tsx index 68c9bfc..7da18a1 100644 --- a/web-report/src/AppProvider.tsx +++ b/web-report/src/AppProvider.tsx @@ -3,6 +3,7 @@ import {WebFuzzingCommonsReport} from "@/types/GeneratedTypes.tsx"; import {ITestFiles} from "@/types/General.tsx"; import {fetchFileContent, ITransformedReport, transformWebFuzzingReport} from "@/lib/utils.tsx"; import {webFuzzingCommonsReportSchema} from "@/types/GeneratedTypesZod.ts"; +import {ZodIssue} from "zod"; type AppContextType = { data: WebFuzzingCommonsReport | null; @@ -12,6 +13,7 @@ type AppContextType = { transformedReport: ITransformedReport[]; filterEndpoints: (activeFilters: Record) => ITransformedReport[]; filteredEndpoints: ITransformedReport[]; + invalidReportErrors: ZodIssue[] | null; }; const AppContext = createContext(undefined); @@ -25,6 +27,7 @@ export const AppProvider = ({ children }: AppProviderProps) => { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); + const [invalidReportErrors, setInvalidReportErrors] = useState(null); const [testFiles, setTestFiles] = useState([]); const transformedReport = transformWebFuzzingReport(data); @@ -35,8 +38,10 @@ export const AppProvider = ({ children }: AppProviderProps) => { // Validate the JSON data against the schema const report = webFuzzingCommonsReportSchema.safeParse(jsonData); + console.log(report) if (!report.success) { setError("Invalid report format. Please ensure the report is generated correctly."); + setInvalidReportErrors(report.error.issues); return; } setData(jsonData); @@ -143,7 +148,7 @@ export const AppProvider = ({ children }: AppProviderProps) => { return filtered; } - const value: AppContextType = { data, loading, error, testFiles, transformedReport, filterEndpoints, filteredEndpoints }; + const value: AppContextType = { data, loading, error, testFiles, transformedReport, filterEndpoints, filteredEndpoints, invalidReportErrors }; return ( diff --git a/web-report/src/components/ErrorDisplay.tsx b/web-report/src/components/ErrorDisplay.tsx new file mode 100644 index 0000000..4efdfa1 --- /dev/null +++ b/web-report/src/components/ErrorDisplay.tsx @@ -0,0 +1,105 @@ +import {AlertTriangle, Code, ArrowRight} from "lucide-react" +import {ZodIssue} from "zod"; + +interface ErrorDisplayProps { + title?: string + description?: string + issues?: ZodIssue[] +} + +export function ErrorDisplay({ + title = "Error", + description = "Invalid report format. Please ensure the report is generated correctly.", + issues = [], + }: ErrorDisplayProps) { + + const getIssueTypeColor = (code: string) => { + switch (code) { + case "invalid_type": + return "bg-red-50 border-red-200 text-red-800" + default: + return "bg-gray-50 border-gray-200 text-gray-800" + } + } + + const getPathString = (path: (string | number)[]) => { + return path.length > 0 ? path.join(".") : "root" + } + + return ( +
+
+
+ +

{title}

+
+

{description}

+
+ + {issues.length > 0 && ( +
+
+
+ + {issues.length} Validation Issue{issues.length !== 1 ? "s" : ""} + +
+
+ + {issues.map((issue, index) => ( +
+
+
+
+ + + {issue.code.replace("_", " ")} + +
+
{getPathString(issue.path)}
+
+
+ +
+ {issue.code === "invalid_type" && +
+
{issue.message}
+
+
+ Expected: + + {issue.expected} + +
+
+ Received: + + {issue.received} + +
+
+
+ } +
+
+ ))} +
+ )} + + {issues.length === 0 && ( +
+
+ +
+

No detailed validation issues available.

+
+ )} +
+ ) +} \ No newline at end of file diff --git a/web-report/src/components/GeneratedTests.tsx b/web-report/src/components/GeneratedTests.tsx index 6f45e9c..8a4db65 100644 --- a/web-report/src/components/GeneratedTests.tsx +++ b/web-report/src/components/GeneratedTests.tsx @@ -21,13 +21,13 @@ export const GeneratedTests: React.FC = ({totalTests, testFiles
- Generated Test Files: + # Generated Test Files: {testFiles.length}
- Generated Tests Cases: + # Generated Tests Cases: {totalTests}