@appello/services
Version:
Services package with api / graphql
212 lines (211 loc) • 8.85 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const handleRtkQueryError_1 = require("./handleRtkQueryError");
describe('handleRtkQueryError', () => {
describe('Basic error handling', () => {
it('should extract data from RTK Query error object', () => {
const mockErrorData = {
username: 'Username is required',
email: 'Invalid email format',
};
const rtkQueryError = {
data: mockErrorData,
status: 400,
};
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(rtkQueryError);
expect(result).toEqual(mockErrorData);
expect(result.username).toBe('Username is required');
expect(result.email).toBe('Invalid email format');
});
it('should handle global errors', () => {
const mockErrorData = {
globalError: 'Server error occurred',
};
const rtkQueryError = {
data: mockErrorData,
status: 500,
};
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(rtkQueryError);
expect(result).toEqual(mockErrorData);
expect(result.globalError).toBe('Server error occurred');
});
it('should handle nested field errors', () => {
const mockErrorData = {
'user.name': 'Name is required',
'user.email': 'Email is invalid',
'address.street': 'Street is required',
};
const rtkQueryError = {
data: mockErrorData,
status: 422,
};
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(rtkQueryError);
expect(result).toEqual(mockErrorData);
expect(result['user.name']).toBe('Name is required');
expect(result['user.email']).toBe('Email is invalid');
expect(result['address.street']).toBe('Street is required');
});
});
describe('Edge cases', () => {
it('should handle empty error data', () => {
const rtkQueryError = {
data: {},
status: 400,
};
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(rtkQueryError);
expect(result).toEqual({});
});
it('should handle null data', () => {
const rtkQueryError = {
data: null,
status: 400,
};
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(rtkQueryError);
expect(result).toBeNull();
});
it('should handle undefined data', () => {
const rtkQueryError = {
data: undefined,
status: 400,
};
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(rtkQueryError);
expect(result).toBeUndefined();
});
it('should handle error without data property', () => {
const rtkQueryError = {
status: 500,
message: 'Internal server error',
};
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(rtkQueryError);
expect(result).toBeUndefined();
});
});
describe('RTK Query specific scenarios', () => {
it('should handle mutation error from useXXXMutation', () => {
const mutationError = {
data: {
username: 'Username already exists',
email: 'Email is already taken',
},
status: 409,
};
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(mutationError);
expect(result).toEqual({
username: 'Username already exists',
email: 'Email is already taken',
});
});
it('should handle query error from useXXXQuery', () => {
const queryError = {
data: {
globalError: 'Unauthorized access',
},
status: 401,
};
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(queryError);
expect(result).toEqual({
globalError: 'Unauthorized access',
});
});
it('should handle network error from RTK Query', () => {
const networkError = {
data: {
globalError: 'Network error',
},
status: 0,
};
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(networkError);
expect(result).toEqual({
globalError: 'Network error',
});
});
it('should handle validation errors from API', () => {
const validationError = {
data: {
name: 'Name must be at least 2 characters',
email: 'Email format is invalid',
password: 'Password must contain at least 8 characters',
confirmPassword: 'Passwords do not match',
},
status: 422,
};
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(validationError);
expect(result).toEqual({
name: 'Name must be at least 2 characters',
email: 'Email format is invalid',
password: 'Password must contain at least 8 characters',
confirmPassword: 'Passwords do not match',
});
});
});
describe('Type safety', () => {
it('should handle unknown error type safely', () => {
const unknownError = 'string error';
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(unknownError);
expect(result).toBeUndefined();
});
it('should handle array as error', () => {
const arrayError = ['error1', 'error2'];
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(arrayError);
expect(result).toBeUndefined();
});
it('should handle number as error', () => {
const numberError = 404;
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(numberError);
expect(result).toBeUndefined();
});
it('should handle boolean as error', () => {
const booleanError = true;
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(booleanError);
expect(result).toBeUndefined();
});
});
describe('Integration patterns', () => {
it('should work with createProcessApiErrorResponse pattern', () => {
const apiValidationError = {
data: {
firstName: 'First name is required',
lastName: 'Last name is required',
email: 'Email is required',
},
status: 400,
};
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(apiValidationError);
expect(result).toEqual({
firstName: 'First name is required',
lastName: 'Last name is required',
email: 'Email is required',
});
expect(result.firstName).toBe('First name is required');
expect(result.lastName).toBe('Last name is required');
expect(result.email).toBe('Email is required');
});
it('should preserve complex error structures', () => {
const complexError = {
data: {
globalError: 'Operation failed',
fieldErrors: {
'user.profile.avatar': 'Invalid file format',
'settings.notifications.email': 'Invalid email preference',
},
metadata: {
timestamp: '2023-01-01T00:00:00Z',
requestId: 'req-123',
},
},
status: 400,
};
const result = (0, handleRtkQueryError_1.handleRtkQueryError)(complexError);
expect(result).toEqual(complexError.data);
expect(result.globalError).toBe('Operation failed');
expect(result.fieldErrors).toEqual({
'user.profile.avatar': 'Invalid file format',
'settings.notifications.email': 'Invalid email preference',
});
expect(result.metadata).toEqual({
timestamp: '2023-01-01T00:00:00Z',
requestId: 'req-123',
});
});
});
});