![]() Server : LiteSpeed System : Linux premium84.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64 User : claqxcrl ( 523) PHP Version : 8.1.32 Disable Function : NONE Directory : /home/claqxcrl/www/wp-content/plugins/extendify/src/Launch/lib/__tests__/ |
import { uploadMedia } from '@wordpress/media-utils'; import { getOption, updateOption } from '@launch/api/WPApi'; import { uploadLogo } from '@launch/lib/logo'; // Mock the dependencies jest.mock('@wordpress/media-utils', () => ({ uploadMedia: jest.fn(), })); jest.mock('@launch/api/WPApi', () => ({ getOption: jest.fn(), updateOption: jest.fn(), })); describe('uploadLogo', () => { // Setup and teardown beforeEach(() => { // Clear all mocks before each test jest.clearAllMocks(); // Mock the fetch function global.fetch = jest.fn(); global.File = class File { constructor(bits, name, options) { this.bits = bits; this.name = name; this.type = options?.type || ''; } }; }); afterEach(() => { // Restore fetch after each test global.fetch.mockRestore(); delete global.File; }); it('should not upload logo if one already exists', async () => { // Mock existing logo getOption.mockResolvedValue('123'); await uploadLogo('https://example.com/logo.png'); // Verify getOption was called expect(getOption).toHaveBeenCalledWith('site_logo'); // Verify no other operations were performed expect(global.fetch).not.toHaveBeenCalled(); expect(uploadMedia).not.toHaveBeenCalled(); expect(updateOption).not.toHaveBeenCalled(); }); it('should handle fetch errors gracefully', async () => { // Mock no existing logo getOption.mockResolvedValue('0'); // Mock fetch failure global.fetch.mockResolvedValue({ ok: false, text: () => Promise.resolve('Not found'), }); console.error = jest.fn(); await uploadLogo('https://example.com/logo.png'); // Verify error was logged expect(console.error).toHaveBeenCalled(); expect(uploadMedia).not.toHaveBeenCalled(); }); it('should successfully upload a logo when none exists', async () => { // Mock no existing logo getOption.mockResolvedValue('0'); // Mock successful fetch const mockBlob = new Blob(['test'], { type: 'image/png' }); global.fetch.mockResolvedValue({ ok: true, blob: () => Promise.resolve(mockBlob), }); // Mock successful media upload uploadMedia.mockImplementation(({ onFileChange }) => { onFileChange([{ id: '456' }]); return Promise.resolve(); }); await uploadLogo('https://example.com/logo.png'); // Verify the workflow expect(getOption).toHaveBeenCalledWith('site_logo'); expect(global.fetch).toHaveBeenCalledWith('https://example.com/logo.png'); expect(uploadMedia).toHaveBeenCalled(); expect(updateOption).toHaveBeenCalledWith('site_logo', '456'); }); it('should handle upload errors gracefully', async () => { // Mock no existing logo getOption.mockResolvedValue('0'); // Mock successful fetch const mockBlob = new Blob(['test'], { type: 'image/png' }); global.fetch.mockResolvedValue({ ok: true, blob: () => Promise.resolve(mockBlob), }); // Mock error in upload console.error = jest.fn(); uploadMedia.mockImplementation(({ onError }) => { onError(new Error('Upload failed')); return Promise.resolve(); }); await uploadLogo('https://example.com/logo.png'); // Verify error was handled expect(console.error).toHaveBeenCalled(); }); it('should force upload even if logo already exists when forceReplace is true', async () => { getOption.mockResolvedValue('123'); const mockBlob = new Blob(['test'], { type: 'image/png' }); global.fetch.mockResolvedValue({ ok: true, blob: () => Promise.resolve(mockBlob), }); uploadMedia.mockImplementation(({ onFileChange }) => { onFileChange([{ id: '789' }]); return Promise.resolve(); }); await uploadLogo('https://example.com/logo.png', { forceReplace: true }); expect(getOption).toHaveBeenCalledWith('site_logo'); expect(global.fetch).toHaveBeenCalledWith('https://example.com/logo.png'); expect(uploadMedia).toHaveBeenCalled(); expect(updateOption).toHaveBeenCalledWith('site_logo', '789'); }); it('should upload logo with webp format correctly', async () => { getOption.mockResolvedValue('0'); const mockBlob = new Blob(['test'], { type: 'image/webp' }); global.fetch.mockResolvedValue({ ok: true, blob: () => Promise.resolve(mockBlob), }); const FileSpy = jest.fn(function (bits, name, options) { this.name = name; this.type = options?.type; return this; }); global.File = FileSpy; uploadMedia.mockImplementation(({ onFileChange }) => { onFileChange([{ id: '100' }]); return Promise.resolve(); }); await uploadLogo('https://example.com/logo.webp'); expect(FileSpy).toHaveBeenCalledWith( expect.anything(), expect.stringMatching(/^ext-custom-logo-\d+\.webp$/), expect.objectContaining({ type: 'image/webp' }), ); }); it('should log error for unsupported MIME types like jpeg', async () => { getOption.mockResolvedValue('0'); const mockBlob = new Blob(['test'], { type: 'image/jpeg' }); global.fetch.mockResolvedValue({ ok: true, blob: () => Promise.resolve(mockBlob), }); const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); await uploadLogo('https://example.com/logo.jpg'); expect(errorSpy).toHaveBeenCalledWith( 'Error uploading logo: ', expect.any(Error), ); expect(errorSpy.mock.calls[0][1].message).toMatch(/Unsupported image type/); expect(uploadMedia).not.toHaveBeenCalled(); errorSpy.mockRestore(); }); it('should generate dynamic filename with correct extension', async () => { getOption.mockResolvedValue('0'); const mockBlob = new Blob(['test'], { type: 'image/avif' }); global.fetch.mockResolvedValue({ ok: true, blob: () => Promise.resolve(mockBlob), }); const FileSpy = jest.fn(function (bits, name, options) { this.name = name; this.type = options?.type; return this; }); global.File = FileSpy; uploadMedia.mockImplementation(({ onFileChange }) => { onFileChange([{ id: '200' }]); return Promise.resolve(); }); await uploadLogo('https://example.com/blob-url', { mimeType: 'image/avif', }); expect(FileSpy).toHaveBeenCalledWith( expect.anything(), expect.stringMatching(/^ext-custom-logo-\d+\.avif$/), expect.objectContaining({ type: 'image/avif' }), ); }); it('should not call updateOption if fileObj.id is falsy', async () => { getOption.mockResolvedValue('0'); const mockBlob = new Blob(['test'], { type: 'image/png' }); global.fetch.mockResolvedValue({ ok: true, blob: () => Promise.resolve(mockBlob), }); uploadMedia.mockImplementation(({ onFileChange }) => { onFileChange([{}]); return Promise.resolve(); }); await uploadLogo('https://example.com/logo.png'); expect(updateOption).not.toHaveBeenCalled(); }); });