diff --git a/packages/core/upload/server/services/__tests__/upload.test.js b/packages/core/upload/server/services/__tests__/upload/formatFileInfo.test.js similarity index 98% rename from packages/core/upload/server/services/__tests__/upload.test.js rename to packages/core/upload/server/services/__tests__/upload/formatFileInfo.test.js index 0ebab147b5..884ae3bbf7 100644 --- a/packages/core/upload/server/services/__tests__/upload.test.js +++ b/packages/core/upload/server/services/__tests__/upload/formatFileInfo.test.js @@ -1,6 +1,6 @@ 'use strict'; -const uploadService = require('../upload')({}); +const uploadService = require('../../upload')({}); describe('Upload service', () => { beforeAll(() => { diff --git a/packages/core/upload/server/services/__tests__/upload/image.png b/packages/core/upload/server/services/__tests__/upload/image.png new file mode 100644 index 0000000000..3ec3f1189a Binary files /dev/null and b/packages/core/upload/server/services/__tests__/upload/image.png differ diff --git a/packages/core/upload/server/services/__tests__/upload/uploadImage.test.js b/packages/core/upload/server/services/__tests__/upload/uploadImage.test.js new file mode 100644 index 0000000000..b0317919f8 --- /dev/null +++ b/packages/core/upload/server/services/__tests__/upload/uploadImage.test.js @@ -0,0 +1,88 @@ +'use strict'; + +const path = require('path'); +const fs = require('fs'); +const fse = require('fs-extra'); +const _ = require('lodash'); +const uploadService = require('../../upload')({}); + +const testFilePath = path.join(__dirname, './image.png'); +const tmpWorkingDirectory = path.join(__dirname, './tmp'); + +function mockUploadProvider(uploadFunc, props) { + const { responsiveDimensions = false } = props || {}; + + const default_config = { + plugin: { + upload: { + breakpoints: { + large: 1000, + medium: 750, + }, + }, + }, + }; + + global.strapi = { + config: { + get: (path, defaultValue) => _.get(default_config, path, defaultValue), + }, + plugins: { + upload: { + services: { + provider: { + upload: uploadFunc, + }, + upload: { + getSettings: () => ({ responsiveDimensions }), + }, + 'image-manipulation': require('../../image-manipulation')(), + }, + }, + }, + }; +} + +const getFileData = () => ({ + alternativeText: 'image.png', + caption: 'image.png', + ext: '.png', + folder: null, + folderPath: '/', + getStream: () => fs.createReadStream(testFilePath), + hash: 'image_d9b4f84424', + height: 1000, + size: 4, + width: 1500, + tmpWorkingDirectory, +}); + +describe('Upload image', () => { + beforeAll(async () => { + // Create tmp directory if it does not exist + await fse.mkdir(tmpWorkingDirectory); + }); + + afterAll(async () => { + // Remove tmp directory + await fse.remove(tmpWorkingDirectory); + }); + test('Upload with thubmnail', async () => { + let fileData = getFileData(); + const upload = jest.fn(); + mockUploadProvider(upload); + + await uploadService.uploadImage(fileData); + expect(upload).toHaveBeenCalledTimes(2); + }); + + test('Upload with responsive formats', async () => { + let fileData = getFileData(); + const upload = jest.fn(); + mockUploadProvider(upload, { responsiveDimensions: true }); + + await uploadService.uploadImage(fileData); + // 1 for the original image, 1 for thubnhail, 2 for the responsive formats + expect(upload).toHaveBeenCalledTimes(4); + }); +}); diff --git a/packages/core/upload/server/services/upload.js b/packages/core/upload/server/services/upload.js index 469cee1ef1..7c4b3b858c 100644 --- a/packages/core/upload/server/services/upload.js +++ b/packages/core/upload/server/services/upload.js @@ -176,6 +176,8 @@ module.exports = ({ strapi }) => ({ // Store width and height of the original image const { width, height } = await getDimensions(fileData); + // Make sure this is assigned before calling upload + // That way it can mutate the width and height _.assign(fileData, { width, height,