after audit
This commit is contained in:
parent
e8e20637e6
commit
a5165dc3ba
80 changed files with 8489 additions and 7302 deletions
51
frontend/src/composables/useRequestState.test.ts
Normal file
51
frontend/src/composables/useRequestState.test.ts
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
import { describe, expect, it } from "vitest";
|
||||
import { ApiRequestError } from "@/lib/api/errors";
|
||||
import { useRequestState } from "@/composables/useRequestState";
|
||||
|
||||
describe("useRequestState", () => {
|
||||
it("initializes with all values null", () => {
|
||||
const { errorMessage, errorRequestId, successMessage } = useRequestState();
|
||||
expect(errorMessage.value).toBeNull();
|
||||
expect(errorRequestId.value).toBeNull();
|
||||
expect(successMessage.value).toBeNull();
|
||||
});
|
||||
|
||||
it("assignError extracts message and requestId from ApiRequestError", () => {
|
||||
const { errorMessage, errorRequestId, assignError } = useRequestState();
|
||||
assignError(
|
||||
new ApiRequestError({ status: 409, code: "conflict", message: "Conflict occurred", requestId: "req-42" }),
|
||||
"fallback",
|
||||
);
|
||||
expect(errorMessage.value).toBe("Conflict occurred");
|
||||
expect(errorRequestId.value).toBe("req-42");
|
||||
});
|
||||
|
||||
it("assignError uses Error.message for generic errors", () => {
|
||||
const { errorMessage, errorRequestId, assignError } = useRequestState();
|
||||
assignError(new Error("something broke"), "fallback");
|
||||
expect(errorMessage.value).toBe("something broke");
|
||||
expect(errorRequestId.value).toBeNull();
|
||||
});
|
||||
|
||||
it("assignError uses fallback for non-Error values", () => {
|
||||
const { errorMessage, assignError } = useRequestState();
|
||||
assignError("not an error object", "fallback text");
|
||||
expect(errorMessage.value).toBe("fallback text");
|
||||
});
|
||||
|
||||
it("setSuccess sets the success message", () => {
|
||||
const { successMessage, setSuccess } = useRequestState();
|
||||
setSuccess("Operation completed");
|
||||
expect(successMessage.value).toBe("Operation completed");
|
||||
});
|
||||
|
||||
it("clearAlerts resets all messages", () => {
|
||||
const { errorMessage, errorRequestId, successMessage, assignError, setSuccess, clearAlerts } = useRequestState();
|
||||
assignError(new ApiRequestError({ status: 500, code: "err", message: "fail", requestId: "r1" }), "fb");
|
||||
setSuccess("ok");
|
||||
clearAlerts();
|
||||
expect(errorMessage.value).toBeNull();
|
||||
expect(errorRequestId.value).toBeNull();
|
||||
expect(successMessage.value).toBeNull();
|
||||
});
|
||||
});
|
||||
40
frontend/src/composables/useRequestState.ts
Normal file
40
frontend/src/composables/useRequestState.ts
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
import { ref } from "vue";
|
||||
import { ApiRequestError } from "@/lib/api/errors";
|
||||
|
||||
export function useRequestState() {
|
||||
const errorMessage = ref<string | null>(null);
|
||||
const errorRequestId = ref<string | null>(null);
|
||||
const successMessage = ref<string | null>(null);
|
||||
|
||||
function clearAlerts(): void {
|
||||
errorMessage.value = null;
|
||||
errorRequestId.value = null;
|
||||
successMessage.value = null;
|
||||
}
|
||||
|
||||
function assignError(error: unknown, fallback: string): void {
|
||||
if (error instanceof ApiRequestError) {
|
||||
errorMessage.value = error.message;
|
||||
errorRequestId.value = error.requestId;
|
||||
return;
|
||||
}
|
||||
if (error instanceof Error && error.message) {
|
||||
errorMessage.value = error.message;
|
||||
return;
|
||||
}
|
||||
errorMessage.value = fallback;
|
||||
}
|
||||
|
||||
function setSuccess(message: string): void {
|
||||
successMessage.value = message;
|
||||
}
|
||||
|
||||
return {
|
||||
errorMessage,
|
||||
errorRequestId,
|
||||
successMessage,
|
||||
clearAlerts,
|
||||
assignError,
|
||||
setSuccess,
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue