test: update error types tests
This commit is contained in:
@@ -1,109 +0,0 @@
|
||||
import { AppError } from "$lib/error.types";
|
||||
import { createError, formatError, logError } from "$lib/utils/errorUtils";
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
describe("errorHandler", () => {
|
||||
let consoleErrorSpy: any;
|
||||
|
||||
beforeEach(() => {
|
||||
consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
consoleErrorSpy.mockClear();
|
||||
vi.restoreAllMocks();
|
||||
});
|
||||
|
||||
describe("formatError", () => {
|
||||
it("should handle AppError", () => {
|
||||
const error = new AppError("Test error", "TEST_ERROR", true);
|
||||
const result = formatError(error);
|
||||
|
||||
expect(result).toBe("Произошла ошибка: Test error");
|
||||
});
|
||||
|
||||
it("should handle standard Error objects", () => {
|
||||
const error = new Error("Standard error message");
|
||||
const result = formatError(error, "Custom prefix");
|
||||
|
||||
expect(result).toBe("Custom prefix: Standard error message");
|
||||
});
|
||||
|
||||
it("should handle string errors", () => {
|
||||
const result = formatError("String error", "Custom prefix");
|
||||
|
||||
expect(result).toBe("Custom prefix: String error");
|
||||
});
|
||||
|
||||
it("should handle unknown error types", () => {
|
||||
const result = formatError({ some: "object" }, "Custom prefix");
|
||||
|
||||
expect(result).toBe("Custom prefix: Произошла неизвестная ошибка");
|
||||
});
|
||||
|
||||
it("should use default message when none provided", () => {
|
||||
const result = formatError({ some: "object" });
|
||||
|
||||
expect(result).toBe("Произошла ошибка: Произошла неизвестная ошибка");
|
||||
});
|
||||
});
|
||||
|
||||
describe("createError", () => {
|
||||
it("should create AppError with default recoverable flag", () => {
|
||||
const error = createError("Test message", "TEST_CODE");
|
||||
|
||||
expect(error).toBeInstanceOf(AppError);
|
||||
expect(error.message).toBe("Test message");
|
||||
expect(error.code).toBe("TEST_CODE");
|
||||
});
|
||||
|
||||
it("should create AppError with details", () => {
|
||||
const details = { some: "additional info" };
|
||||
const error = createError("Test message", "TEST_CODE", details);
|
||||
|
||||
expect(error.details).toBe(details);
|
||||
});
|
||||
});
|
||||
|
||||
describe("logError", () => {
|
||||
it("should log error with context", () => {
|
||||
const error = new Error("Test error");
|
||||
const context = "Test context";
|
||||
|
||||
logError(error, context);
|
||||
|
||||
expect(consoleErrorSpy).toHaveBeenCalledWith("Error occurred:", {
|
||||
error,
|
||||
context,
|
||||
timestamp: expect.any(String),
|
||||
stack: error.stack,
|
||||
});
|
||||
});
|
||||
|
||||
it("should log error without context", () => {
|
||||
const error = new Error("Test error");
|
||||
|
||||
logError(error);
|
||||
|
||||
expect(consoleErrorSpy).toHaveBeenCalledWith("Error occurred:", {
|
||||
error,
|
||||
context: undefined,
|
||||
timestamp: expect.any(String),
|
||||
stack: error.stack,
|
||||
});
|
||||
});
|
||||
|
||||
it("should handle non-Error objects", () => {
|
||||
const error = "String error";
|
||||
|
||||
logError(error, "Test context");
|
||||
|
||||
expect(consoleErrorSpy).toHaveBeenCalledWith("Error occurred:", {
|
||||
error,
|
||||
context: "Test context",
|
||||
timestamp: expect.any(String),
|
||||
stack: undefined,
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,207 @@
|
||||
import { AppError, ImageError, TextError, CanvasError, StorageError } from "$lib/error.types";
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
describe("error.types", () => {
|
||||
describe("AppError", () => {
|
||||
it("should create AppError with message and code", () => {
|
||||
const error = new AppError("Test error message", "TEST_CODE");
|
||||
|
||||
expect(error).toBeInstanceOf(Error);
|
||||
expect(error).toBeInstanceOf(AppError);
|
||||
expect(error.name).toBe("AppError");
|
||||
expect(error.message).toBe("Test error message");
|
||||
expect(error.code).toBe("TEST_CODE");
|
||||
expect(error.details).toBeUndefined();
|
||||
});
|
||||
|
||||
it("should create AppError with message, code and details", () => {
|
||||
const details = { userId: 123, action: "test" };
|
||||
const error = new AppError("Test error message", "TEST_CODE", details);
|
||||
|
||||
expect(error.details).toEqual(details);
|
||||
expect(error.message).toBe("Test error message");
|
||||
expect(error.code).toBe("TEST_CODE");
|
||||
});
|
||||
|
||||
it("should have stack trace", () => {
|
||||
const error = new AppError("Test error", "TEST_CODE");
|
||||
|
||||
expect(error.stack).toBeDefined();
|
||||
expect(typeof error.stack).toBe("string");
|
||||
});
|
||||
|
||||
it("should be throwable and catchable", () => {
|
||||
expect(() => {
|
||||
throw new AppError("Test error", "TEST_CODE");
|
||||
}).toThrow(AppError);
|
||||
});
|
||||
|
||||
it("should be catchable as Error", () => {
|
||||
expect(() => {
|
||||
throw new AppError("Test error", "TEST_CODE");
|
||||
}).toThrow(Error);
|
||||
});
|
||||
});
|
||||
|
||||
describe("ImageError", () => {
|
||||
it("should create ImageError with message", () => {
|
||||
const error = new ImageError("Image loading failed");
|
||||
|
||||
expect(error).toBeInstanceOf(Error);
|
||||
expect(error).toBeInstanceOf(AppError);
|
||||
expect(error).toBeInstanceOf(ImageError);
|
||||
expect(error.name).toBe("AppError");
|
||||
expect(error.message).toBe("Image loading failed");
|
||||
expect(error.code).toBe("IMAGE_ERROR");
|
||||
});
|
||||
|
||||
it("should have correct error code", () => {
|
||||
const error = new ImageError("Test");
|
||||
|
||||
expect(error.code).toBe("IMAGE_ERROR");
|
||||
});
|
||||
|
||||
it("should be identifiable as ImageError", () => {
|
||||
const error = new ImageError("Test");
|
||||
|
||||
expect(error instanceof ImageError).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("TextError", () => {
|
||||
it("should create TextError with message", () => {
|
||||
const error = new TextError("Text validation failed");
|
||||
|
||||
expect(error).toBeInstanceOf(Error);
|
||||
expect(error).toBeInstanceOf(AppError);
|
||||
expect(error).toBeInstanceOf(TextError);
|
||||
expect(error.name).toBe("AppError");
|
||||
expect(error.message).toBe("Text validation failed");
|
||||
expect(error.code).toBe("TEXT_ERROR");
|
||||
});
|
||||
|
||||
it("should have correct error code", () => {
|
||||
const error = new TextError("Test");
|
||||
|
||||
expect(error.code).toBe("TEXT_ERROR");
|
||||
});
|
||||
|
||||
it("should be identifiable as TextError", () => {
|
||||
const error = new TextError("Test");
|
||||
|
||||
expect(error instanceof TextError).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("CanvasError", () => {
|
||||
it("should create CanvasError with message", () => {
|
||||
const error = new CanvasError("Canvas rendering failed");
|
||||
|
||||
expect(error).toBeInstanceOf(Error);
|
||||
expect(error).toBeInstanceOf(AppError);
|
||||
expect(error).toBeInstanceOf(CanvasError);
|
||||
expect(error.name).toBe("AppError");
|
||||
expect(error.message).toBe("Canvas rendering failed");
|
||||
expect(error.code).toBe("CANVAS_ERROR");
|
||||
});
|
||||
|
||||
it("should have correct error code", () => {
|
||||
const error = new CanvasError("Test");
|
||||
|
||||
expect(error.code).toBe("CANVAS_ERROR");
|
||||
});
|
||||
|
||||
it("should be identifiable as CanvasError", () => {
|
||||
const error = new CanvasError("Test");
|
||||
|
||||
expect(error instanceof CanvasError).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("StorageError", () => {
|
||||
it("should create StorageError with message", () => {
|
||||
const error = new StorageError("Storage operation failed");
|
||||
|
||||
expect(error).toBeInstanceOf(Error);
|
||||
expect(error).toBeInstanceOf(AppError);
|
||||
expect(error).toBeInstanceOf(StorageError);
|
||||
expect(error.name).toBe("AppError");
|
||||
expect(error.message).toBe("Storage operation failed");
|
||||
expect(error.code).toBe("STORAGE_ERROR");
|
||||
});
|
||||
|
||||
it("should have correct error code", () => {
|
||||
const error = new StorageError("Test");
|
||||
|
||||
expect(error.code).toBe("STORAGE_ERROR");
|
||||
});
|
||||
|
||||
it("should be identifiable as StorageError", () => {
|
||||
const error = new StorageError("Test");
|
||||
|
||||
expect(error instanceof StorageError).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("ErrorType union", () => {
|
||||
it("should accept all error types", () => {
|
||||
const errors: Array<AppError | ImageError | TextError | CanvasError | StorageError> = [
|
||||
new AppError("Test", "TEST"),
|
||||
new ImageError("Test"),
|
||||
new TextError("Test"),
|
||||
new CanvasError("Test"),
|
||||
new StorageError("Test"),
|
||||
];
|
||||
|
||||
errors.forEach(error => {
|
||||
expect(error).toBeInstanceOf(AppError);
|
||||
expect(error).toBeInstanceOf(Error);
|
||||
});
|
||||
});
|
||||
|
||||
it("should allow type narrowing with instanceof", () => {
|
||||
const errors: Array<AppError | ImageError | TextError | CanvasError | StorageError> = [
|
||||
new ImageError("Test"),
|
||||
new TextError("Test"),
|
||||
];
|
||||
|
||||
const imageErrors = errors.filter(e => e instanceof ImageError);
|
||||
const textErrors = errors.filter(e => e instanceof TextError);
|
||||
|
||||
expect(imageErrors).toHaveLength(1);
|
||||
expect(textErrors).toHaveLength(1);
|
||||
});
|
||||
});
|
||||
|
||||
describe("Error handling patterns", () => {
|
||||
it("should handle errors in try-catch blocks", () => {
|
||||
let caughtError: AppError | null = null;
|
||||
|
||||
try {
|
||||
throw new ImageError("Image failed to load");
|
||||
} catch (error) {
|
||||
if (error instanceof AppError) {
|
||||
caughtError = error;
|
||||
}
|
||||
}
|
||||
|
||||
expect(caughtError).not.toBeNull();
|
||||
expect(caughtError?.code).toBe("IMAGE_ERROR");
|
||||
});
|
||||
|
||||
it("should preserve error details through error handling", () => {
|
||||
const originalError = new AppError("Test", "TEST", { id: 123 });
|
||||
let caughtError: AppError | null = null;
|
||||
|
||||
try {
|
||||
throw originalError;
|
||||
} catch (error) {
|
||||
if (error instanceof AppError) {
|
||||
caughtError = error;
|
||||
}
|
||||
}
|
||||
|
||||
expect(caughtError?.details).toEqual({ id: 123 });
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user