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 (
+
+
+
+ {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}