/** * API Service Tests * * Tests the API service module structure and exported functions. * API interceptor behavior is tested in integration with AuthContext. */ import { authAPI, userAPI, itemAPI, rentalAPI, messageAPI, mapsAPI, stripeAPI, addressAPI, conditionCheckAPI, forumAPI, feedbackAPI, fetchCSRFToken, resetCSRFToken, getMessageImageUrl, getForumImageUrl, } from '../../services/api'; import api from '../../services/api'; describe('API Service', () => { describe('Module Exports', () => { it('exports authAPI with correct methods', () => { expect(authAPI).toBeDefined(); expect(typeof authAPI.login).toBe('function'); expect(typeof authAPI.register).toBe('function'); expect(typeof authAPI.logout).toBe('function'); expect(typeof authAPI.googleLogin).toBe('function'); expect(typeof authAPI.getStatus).toBe('function'); expect(typeof authAPI.verifyEmail).toBe('function'); expect(typeof authAPI.forgotPassword).toBe('function'); expect(typeof authAPI.resetPassword).toBe('function'); }); it('exports userAPI with correct methods', () => { expect(userAPI).toBeDefined(); expect(typeof userAPI.getProfile).toBe('function'); expect(typeof userAPI.updateProfile).toBe('function'); expect(typeof userAPI.uploadProfileImage).toBe('function'); }); it('exports itemAPI with correct methods', () => { expect(itemAPI).toBeDefined(); expect(typeof itemAPI.getItems).toBe('function'); expect(typeof itemAPI.getItem).toBe('function'); expect(typeof itemAPI.createItem).toBe('function'); expect(typeof itemAPI.updateItem).toBe('function'); expect(typeof itemAPI.deleteItem).toBe('function'); }); it('exports rentalAPI with correct methods', () => { expect(rentalAPI).toBeDefined(); expect(typeof rentalAPI.createRental).toBe('function'); expect(typeof rentalAPI.getRentals).toBe('function'); expect(typeof rentalAPI.getListings).toBe('function'); expect(typeof rentalAPI.updateRentalStatus).toBe('function'); expect(typeof rentalAPI.cancelRental).toBe('function'); }); it('exports messageAPI with correct methods', () => { expect(messageAPI).toBeDefined(); expect(typeof messageAPI.getMessages).toBe('function'); expect(typeof messageAPI.getConversations).toBe('function'); expect(typeof messageAPI.sendMessage).toBe('function'); expect(typeof messageAPI.getUnreadCount).toBe('function'); }); it('exports mapsAPI with correct methods', () => { expect(mapsAPI).toBeDefined(); expect(typeof mapsAPI.placesAutocomplete).toBe('function'); expect(typeof mapsAPI.placeDetails).toBe('function'); expect(typeof mapsAPI.geocode).toBe('function'); }); it('exports stripeAPI with correct methods', () => { expect(stripeAPI).toBeDefined(); expect(typeof stripeAPI.getCheckoutSession).toBe('function'); expect(typeof stripeAPI.createConnectedAccount).toBe('function'); expect(typeof stripeAPI.createAccountLink).toBe('function'); expect(typeof stripeAPI.getAccountStatus).toBe('function'); }); it('exports CSRF token management functions', () => { expect(typeof fetchCSRFToken).toBe('function'); expect(typeof resetCSRFToken).toBe('function'); }); it('exports helper functions for image URLs', () => { expect(typeof getMessageImageUrl).toBe('function'); expect(typeof getForumImageUrl).toBe('function'); }); }); describe('Helper Functions', () => { it('getMessageImageUrl constructs correct URL', () => { const url = getMessageImageUrl('test-image.jpg'); expect(url).toContain('/messages/images/test-image.jpg'); }); it('getForumImageUrl constructs correct URL', () => { const url = getForumImageUrl('forum-image.jpg'); expect(url).toContain('/uploads/forum/forum-image.jpg'); }); }); describe('CSRF Token Management', () => { it('resetCSRFToken clears the token', () => { // Should not throw expect(() => resetCSRFToken()).not.toThrow(); }); }); describe('API Configuration', () => { it('creates axios instance with correct base URL', () => { expect(api).toBeDefined(); expect(api.defaults).toBeDefined(); }); }); }); describe('API Namespaces', () => { describe('authAPI', () => { it('has all authentication methods', () => { const expectedMethods = [ 'register', 'login', 'googleLogin', 'logout', 'refresh', 'getCSRFToken', 'getStatus', 'verifyEmail', 'resendVerification', 'forgotPassword', 'verifyResetToken', 'resetPassword', ]; expectedMethods.forEach((method) => { expect((authAPI as any)[method]).toBeDefined(); expect(typeof (authAPI as any)[method]).toBe('function'); }); }); }); describe('addressAPI', () => { it('has all address management methods', () => { const expectedMethods = [ 'getAddresses', 'createAddress', 'updateAddress', 'deleteAddress', ]; expectedMethods.forEach((method) => { expect((addressAPI as any)[method]).toBeDefined(); expect(typeof (addressAPI as any)[method]).toBe('function'); }); }); }); describe('conditionCheckAPI', () => { it('has all condition check methods', () => { const expectedMethods = [ 'submitConditionCheck', 'getConditionChecks', 'getConditionCheckTimeline', 'getAvailableChecks', ]; expectedMethods.forEach((method) => { expect((conditionCheckAPI as any)[method]).toBeDefined(); expect(typeof (conditionCheckAPI as any)[method]).toBe('function'); }); }); }); describe('forumAPI', () => { it('has all forum methods', () => { const expectedMethods = [ 'getPosts', 'getPost', 'createPost', 'updatePost', 'deletePost', 'createComment', 'updateComment', 'deleteComment', 'getTags', ]; expectedMethods.forEach((method) => { expect((forumAPI as any)[method]).toBeDefined(); expect(typeof (forumAPI as any)[method]).toBe('function'); }); }); }); describe('feedbackAPI', () => { it('has feedback submission method', () => { expect(feedbackAPI.submitFeedback).toBeDefined(); expect(typeof feedbackAPI.submitFeedback).toBe('function'); }); }); });