UNPKG

@appello/services

Version:

Services package with api / graphql

212 lines (211 loc) 8.85 kB
"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', }); }); }); });