From 869e2d15a8b7dd2f27cf10185b0b1183b7c5834b Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Wed, 26 Apr 2023 20:30:56 +0200 Subject: [PATCH] test: add private url sign api test --- .../private-file-signing.test.api.js | 203 ++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 api-tests/core/upload/content-api/private-file-signing.test.api.js diff --git a/api-tests/core/upload/content-api/private-file-signing.test.api.js b/api-tests/core/upload/content-api/private-file-signing.test.api.js new file mode 100644 index 0000000000..e5c1578ebd --- /dev/null +++ b/api-tests/core/upload/content-api/private-file-signing.test.api.js @@ -0,0 +1,203 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const { createTestBuilder } = require('api-tests/builder'); +const { createStrapiInstance } = require('api-tests/strapi'); +const { createContentAPIRequest } = require('api-tests/request'); + +const builder = createTestBuilder(); +let strapi; +let rq; + +const modelUID = 'api::model.model'; +const componentUID = 'default.component'; + +const models = { + [modelUID]: { + displayName: 'Model', + singularName: 'model', + pluralName: 'models', + kind: 'collectionType', + attributes: { + name: { + type: 'text', + }, + media: { + type: 'media', + }, + media_repeatable: { + type: 'media', + multiple: true, + }, + compo_media: { + type: 'component', + component: componentUID, + }, + compo_media_repeatable: { + type: 'component', + repeatable: true, + component: componentUID, + }, + dynamicZone: { + type: 'dynamiczone', + components: [componentUID], + }, + }, + }, + [componentUID]: { + displayName: 'component', + attributes: { + media_repeatable: { + type: 'media', + multiple: true, + }, + media: { + type: 'media', + multiple: false, + }, + }, + }, +}; + +const populate = { + media: true, + media_repeatable: true, + compo_media: { + populate: { + media: true, + media_repeatable: true, + }, + }, + compo_media_repeatable: { + populate: { + media: true, + media_repeatable: true, + }, + }, + dynamicZone: { + populate: { + media: true, + media_repeatable: true, + }, + }, +}; + +const mockProvider = (signUrl = true) => ({ + init() { + return { + isPrivate() { + return signUrl; + }, + getSignedUrl() { + return { url: 'signedUrl' }; + }, + uploadStream() {}, + upload() {}, + delete() {}, + checkFileSize() {}, + }; + }, +}); + +const uploadImg = (fileName) => { + return rq({ + method: 'POST', + url: '/upload', + formData: { + files: fs.createReadStream(path.join(__dirname, `../utils/${fileName}`)), + }, + }); +}; + +let repeatable; +let singleMedia; +let mediaEntry = {}; + +describe('Upload Plugin url signing', () => { + const responseExpectations = (result) => { + expect(result.media.url).toEqual('signedUrl'); + + for (const media of result.media_repeatable) { + expect(media.url).toEqual('signedUrl'); + } + + expect(result.compo_media.media.url).toEqual('signedUrl'); + for (const media of result.compo_media.media_repeatable) { + expect(media.url).toEqual('signedUrl'); + } + + for (const component of result.compo_media_repeatable) { + expect(component.media.url).toEqual('signedUrl'); + for (const media of component.media_repeatable) { + expect(media.url).toEqual('signedUrl'); + } + } + + for (const component of result.dynamicZone) { + expect(component.media.url).toEqual('signedUrl'); + for (const media of component.media_repeatable) { + expect(media.url).toEqual('signedUrl'); + } + } + }; + + let entity; + + beforeAll(async () => { + const localProviderPath = require.resolve('@strapi/provider-upload-local'); + jest.mock(localProviderPath, () => mockProvider(true)); + + // Create builder + await builder.addComponent(models[componentUID]).addContentType(models[modelUID]).build(); + + // Create api instance + strapi = await createStrapiInstance(); + + rq = await createContentAPIRequest({ strapi }); + + const imgRes = [await uploadImg('rec.jpg'), await uploadImg('strapi.jpg')]; + + repeatable = imgRes.map((img) => img.body[0].id); + singleMedia = imgRes[0].body[0].id; + mediaEntry = { + media: singleMedia, + media_repeatable: repeatable, + }; + }); + + afterAll(async () => { + await strapi.destroy(); + await builder.cleanup(); + }); + + test('returns signed media URLs on content creation', async () => { + entity = await strapi.entityService.create(modelUID, { + data: { + name: 'name', + media: singleMedia, + media_repeatable: repeatable, + compo_media: mediaEntry, + compo_media_repeatable: [mediaEntry, mediaEntry], + dynamicZone: [ + { + __component: componentUID, + ...mediaEntry, + }, + ], + }, + populate, + }); + + responseExpectations(entity); + }); + + test('returns signed media URLs when we GET content', async () => { + const en = await strapi.entityService.findOne(modelUID, entity.id, { + populate, + }); + + responseExpectations(en); + }); +});