diff --git a/lib/util/util.js b/lib/util/util.js index 80d9ffcb5..78585f1b1 100644 --- a/lib/util/util.js +++ b/lib/util/util.js @@ -805,9 +805,9 @@ export const Util = { // \s* whitespace characters, zero or more times // [^>]*? any character that is not a >, zero or more times, un-greedily // (.*) capture any character, zero or more times - // /ms multiline and dotall flags + // /s dotall flag // ideally the code looks like - const scriptRegex = /^<\s*script [^>]*?>(.*)<\/\s*script\s*>$/ms; + const scriptRegex = /^<\s*script [^>]*?>(.*)<\/\s*script\s*>$/s; code = code.trim(); const regexMatches = scriptRegex.exec(code); if (regexMatches?.length > 1) { diff --git a/test/resourceFactory.js b/test/resourceFactory.js index 7ef2fec66..30407d340 100644 --- a/test/resourceFactory.js +++ b/test/resourceFactory.js @@ -236,7 +236,9 @@ export const soapUrl = export const handleRESTRequest = async (config) => { try { // check if filtered - const urlObj = new URL(config.baseURL + config.url.slice(1)); + const urlObj = new URL( + config.baseURL + (config.url.startsWith('/') ? config.url.slice(1) : config.url) + ); let filterName; if (urlObj.searchParams.get('$filter')) { filterName = urlObj.searchParams.get('$filter').split(' eq ')[1]; diff --git a/test/resources/9999999/asset/block-1157-retrieve-expected.html b/test/resources/9999999/asset/block-1157-retrieve-expected.html new file mode 100644 index 000000000..eec6813cd --- /dev/null +++ b/test/resources/9999999/asset/block-1157-retrieve-expected.html @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/test/resources/9999999/asset/block-1157-retrieve-expected.json b/test/resources/9999999/asset/block-1157-retrieve-expected.json new file mode 100644 index 000000000..7ce3e8ee4 --- /dev/null +++ b/test/resources/9999999/asset/block-1157-retrieve-expected.json @@ -0,0 +1,41 @@ +{ + "customerKey": "mcdev-issue-1157", + "assetType": { + "name": "htmlblock", + "displayName": "HTML Block" + }, + "fileProperties": { + "fileName": "mcdev-issue-1157-Mcdev-strips-content" + }, + "name": "mcdev-issue-1157-Mcdev-strips-content", + "owner": { + "email": "joern.berkefeld@accenture.com", + "name": "Jörn Berkefeld (ASGR)" + }, + "createdDate": "2024-01-08T08:26:58.277-06:00", + "createdBy": { + "email": "joern.berkefeld@accenture.com", + "name": "Jörn Berkefeld (ASGR)" + }, + "modifiedDate": "2024-01-08T08:28:01.6-06:00", + "modifiedBy": { + "email": "joern.berkefeld@accenture.com", + "name": "Jörn Berkefeld (ASGR)" + }, + "memberId": 9999999, + "status": { + "name": "Draft" + }, + "design": "", + "meta": { + "wrapperStyles": { + "mobile": { + "visible": true + }, + "styling": {} + } + }, + "availableViews": [], + "modelVersion": 2, + "r__folder_Path": "Content Builder" +} diff --git a/test/resources/9999999/asset/v1/content/assets/1209971/get-response.json b/test/resources/9999999/asset/v1/content/assets/1209971/get-response.json new file mode 100644 index 000000000..7b01d7328 --- /dev/null +++ b/test/resources/9999999/asset/v1/content/assets/1209971/get-response.json @@ -0,0 +1,61 @@ +{ + "customerKey": "mobileMessage_test", + "assetType": { + "name": "jsonmessage", + "displayName": "JSON Message" + }, + "name": "Mobile Message November 22, 2021(4:20:55 PM)", + "owner": { + "email": "joern.berkefeld@accenture.com", + "name": "Jörn Berkefeld" + }, + "createdDate": "2021-11-22T09:21:11.933-06:00", + "createdBy": { + "email": "joern.berkefeld@accenture.com", + "name": "Jörn Berkefeld" + }, + "modifiedDate": "2021-12-16T02:56:24.29-06:00", + "modifiedBy": { + "name": "SFMC DEVOPS app user" + }, + "memberId": 9999999, + "status": { + "name": "Draft" + }, + "views": { + "push": { + "thumbnail": {}, + "content": "\n\n\t\n\t\t\n\t\t\n\t\t \n\t\n\t\n\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
12:00 AM
\n\t\t\t\t\t
January 1, 2020
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
App Name
\n\t\t\t\t\t\t
now
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
test
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
asdfasf
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t\n", + "meta": { + "options": { + "customBlockData": { + "display:title": "test", + "channel": "push", + "showTemplatePicker": false, + "display:title:display": "test", + "stack": "S7", + "openBehavior:actionType": { + "label": "Open the App", + "value": "openApp", + "id": "openApp_0", + "localizedLabel": "Open the App" + }, + "display:message": "asdfasf ", + "currentColumn": 0, + "display:message:display": "asdfasf ", + "template": "push", + "uncheckedPanels": ["pushmedia", "subtitle"] + } + } + }, + "modelVersion": 2 + } + }, + "availableViews": ["push"], + "modelVersion": 2, + "category": { + "id": 89397, + "name": "Content Builder", + "parentId": 0 + } +} diff --git a/test/resources/9999999/asset/v1/content/assets/1295064/get-response.json b/test/resources/9999999/asset/v1/content/assets/1295064/get-response.json new file mode 100644 index 000000000..ffa82c774 --- /dev/null +++ b/test/resources/9999999/asset/v1/content/assets/1295064/get-response.json @@ -0,0 +1,60 @@ +{ + "id": 1295064, + "customerKey": "mcdev-issue-1157", + "objectID": "972974ed-dc44-4df2-ab6e-53bae9070339", + "assetType": { + "id": 197, + "name": "htmlblock", + "displayName": "HTML Block" + }, + "fileProperties": { + "fileName": "mcdev-issue-1157-Mcdev-strips-content" + }, + "name": "mcdev-issue-1157-Mcdev-strips-content", + "owner": { + "id": 700301950, + "email": "joern.berkefeld@accenture.com", + "name": "Jörn Berkefeld (ASGR)", + "userId": "700301950" + }, + "createdDate": "2024-01-08T08:26:58.277-06:00", + "createdBy": { + "id": 700301950, + "email": "joern.berkefeld@accenture.com", + "name": "Jörn Berkefeld (ASGR)", + "userId": "700301950" + }, + "modifiedDate": "2024-01-08T08:28:01.6-06:00", + "modifiedBy": { + "id": 700301950, + "email": "joern.berkefeld@accenture.com", + "name": "Jörn Berkefeld (ASGR)", + "userId": "700301950" + }, + "enterpriseId": 9999999, + "memberId": 9999999, + "status": { + "id": 1, + "name": "Draft" + }, + "thumbnail": { + "thumbnailUrl": "/v1/assets/1295064/thumbnail" + }, + "category": { + "id": 89397, + "name": "Content Builder", + "parentId": 0 + }, + "content": "
\n my 1st html\n
\n\n%%[ /* my ampscript */ ]%%\n\n\n\n
\n my 2nd html\n
", + "design": "", + "meta": { + "wrapperStyles": { + "mobile": { + "visible": true + }, + "styling": {} + } + }, + "availableViews": [], + "modelVersion": 2 +} diff --git a/test/resources/9999999/asset/v1/content/assets/808714/get-response.json b/test/resources/9999999/asset/v1/content/assets/808714/get-response.json new file mode 100644 index 000000000..a93eeb69c --- /dev/null +++ b/test/resources/9999999/asset/v1/content/assets/808714/get-response.json @@ -0,0 +1,184 @@ +{ + "id": 808714, + "customerKey": "testExisting_asset_message", + "objectID": "01f883be-c5c3-4eb1-b6e1-d7036f8153d4", + "contentType": "application/vnd.etmc.email.Message; kind=paste", + "assetType": { + "id": 208, + "name": "htmlemail", + "displayName": "HTML Email" + }, + "name": "testExisting_asset_message", + "owner": { + "id": 717129834, + "email": "joern.berkefeld@accenture.com", + "name": "Jörn Berkefeld", + "userId": "717129834" + }, + "createdDate": "2020-03-06T02:35:15.677-06:00", + "createdBy": { + "id": 717129834, + "email": "joern.berkefeld@accenture.com", + "name": "Jörn Berkefeld", + "userId": "717129834" + }, + "modifiedDate": "2023-08-02T07:08:00.86-06:00", + "modifiedBy": { + "id": 700304523, + "name": "SFMC DEVOPS app user", + "userId": "700304523" + }, + "enterpriseId": 7281698, + "memberId": 7281698, + "status": { + "id": 1, + "name": "Draft" + }, + "thumbnail": { + "thumbnailUrl": "/v1/assets/808714/thumbnail" + }, + "category": { + "id": 89397, + "name": "Content Builder", + "parentId": 0 + }, + "views": { + "subjectline": { + "contentType": "application/vnd.etmc.email.View; kind=subjectline", + "thumbnail": {}, + "content": "TEST", + "availableViews": [], + "data": { + "email": { + "options": { + "generateFrom": null + } + } + }, + "modelVersion": 2 + }, + "preheader": { + "thumbnail": {}, + "availableViews": [], + "data": { + "email": { + "options": { + "generateFrom": null + } + } + }, + "modelVersion": 2 + }, + "html": { + "thumbnail": {}, + "content": "Update Profile\n\n \n \n \n
\n This email was sent by: %%Member_Busname%%
%%Member_Addr%%\n %%Member_City%%, %%Member_State%%, %%Member_PostalCode%%, %%Member_Country%%
\n
\nManage Subscriptions\n", + "availableViews": [], + "data": { + "email": { + "options": { + "generateFrom": null + } + } + }, + "modelVersion": 2 + }, + "text": { + "thumbnail": {}, + "availableViews": [], + "data": { + "email": { + "options": { + "generateFrom": "html" + } + } + }, + "generateFrom": "html", + "modelVersion": 2 + }, + "viewAsAWebPage": { + "thumbnail": {}, + "availableViews": [], + "data": { + "email": { + "options": { + "generateFrom": null + } + } + }, + "modelVersion": 2 + }, + "subscriptioncenter": { + "thumbnail": {}, + "availableViews": [], + "data": { + "email": { + "options": { + "generateFrom": null + } + } + }, + "modelVersion": 2 + }, + "forwardHTML": { + "thumbnail": {}, + "availableViews": [], + "data": { + "email": { + "options": { + "generateFrom": null + } + } + }, + "modelVersion": 2 + }, + "forwardText": { + "thumbnail": {}, + "availableViews": [], + "data": { + "email": { + "options": { + "generateFrom": null + } + } + }, + "modelVersion": 2 + } + }, + "availableViews": [ + "subjectline", + "preheader", + "html", + "text", + "viewAsAWebPage", + "subscriptioncenter", + "forwardHTML", + "forwardText" + ], + "data": { + "email": { + "options": { + "characterEncoding": "utf-8" + }, + "legacy": { + "legacyId": 429827, + "legacyKey": "c7308370-bb2c-4bd4-83dd-0ea422e2009d", + "legacyType": "email", + "legacyCategoryId": 90890 + } + }, + "approvals": { + "approvalStatus": { + "id": 4, + "name": "Approved", + "displayName": "Approved" + } + } + }, + "legacyData": { + "legacyId": 429827, + "legacyKey": "c7308370-bb2c-4bd4-83dd-0ea422e2009d", + "legacyType": "email", + "legacyCategoryId": 90890 + }, + "modelVersion": 2 +} diff --git a/test/resources/9999999/asset/v1/content/assets/query/post-response.json b/test/resources/9999999/asset/v1/content/assets/query/post-response.json index 7bb8d6ea8..864d9b969 100644 --- a/test/resources/9999999/asset/v1/content/assets/query/post-response.json +++ b/test/resources/9999999/asset/v1/content/assets/query/post-response.json @@ -23,7 +23,7 @@ "userId": "700304523" }, "status": { "id": 1, "name": "Draft" }, - "category": { "id": 290833, "name": "Content Builder", "parentId": 0 }, + "category": { "id": 89397, "name": "Content Builder", "parentId": 0 }, "availableViews": ["html", "text", "subjectline", "preheader"], "data": { "email": { @@ -64,9 +64,47 @@ "userId": "700301950" }, "status": { "id": 1, "name": "Draft" }, - "category": { "id": 283608, "name": "Content Builder", "parentId": 0 }, + "category": { "id": 89397, "name": "Content Builder", "parentId": 0 }, "availableViews": ["push"], "modelVersion": 2 + }, + { + "id": 1295064, + "customerKey": "mcdev-issue-1157", + "assetType": { + "id": 197, + "name": "htmlblock", + "displayName": "HTML Block" + }, + "fileProperties": { + "fileName": "dont strip non ssjs content" + }, + "name": "dont strip non ssjs content", + "createdDate": "2024-01-08T08:26:58.277-06:00", + "createdBy": { + "id": 700301950, + "email": "joern.berkefeld@accenture.com", + "name": "Jörn Berkefeld (ASGR)", + "userId": "700301950" + }, + "modifiedDate": "2024-01-08T08:28:01.6-06:00", + "modifiedBy": { + "id": 700301950, + "email": "joern.berkefeld@accenture.com", + "name": "Jörn Berkefeld (ASGR)", + "userId": "700301950" + }, + "status": { + "id": 1, + "name": "Draft" + }, + "category": { + "id": 89397, + "name": "Content Builder", + "parentId": 0 + }, + "availableViews": [], + "modelVersion": 2 } ] } diff --git a/test/resources/9999999/dataFolder/retrieve-ContentType=asset-sharedORContentType=asset-response.xml b/test/resources/9999999/dataFolder/retrieve-ContentType=asset-sharedORContentType=asset-response.xml new file mode 100644 index 000000000..4898884ba --- /dev/null +++ b/test/resources/9999999/dataFolder/retrieve-ContentType=asset-sharedORContentType=asset-response.xml @@ -0,0 +1,70 @@ + + + + RetrieveResponse + urn:uuid:00106553-ac00-4e72-b387-42325fe6f93d + urn:uuid:a1dd2a9d-b696-480e-9a1b-265f262a8997 + http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous + + + 2024-01-08T14:30:39Z + 2024-01-08T14:35:39Z + + + + + + OK + 6596087d-d12f-4c9d-9353-783fe01775a3 + + + 9999999 + + + 2016-07-22T11:52:35.687 + 2016-07-22T11:52:35.687 + 89397 + + + + + 0 + + + Content Builder + The root folder for assets + asset + true + false + true + + + + 9999999 + + + 2016-07-29T12:13:07.7 + 2021-12-16T02:56:14.68 + 90888 + + + + + 89397 + + + Test Folder + + asset + true + true + true + + + + diff --git a/test/type.asset.test.js b/test/type.asset.test.js new file mode 100644 index 000000000..df709ace5 --- /dev/null +++ b/test/type.asset.test.js @@ -0,0 +1,84 @@ +import File from '../lib/util/file.js'; + +import chai, { assert, expect } from 'chai'; +import chaiFiles from 'chai-files'; +import cache from '../lib/util/cache.js'; +import * as testUtils from './utils.js'; +import handler from '../lib/index.js'; +chai.use(chaiFiles); +const file = chaiFiles.file; + +/** + * gets file from Retrieve folder + * + * @param {string} customerKey of metadata + * @param {string} type of metadata + * @param {string} subtype of metadata + * @param {string} [buName] used when we need to test on ParentBU + * @returns {Promise.} file in string form + */ +function getActualJson(customerKey, type, subtype, buName = 'testBU') { + return File.readJSON( + `./retrieve/testInstance/${buName}/${type}/${subtype}/${customerKey}.${type}-${subtype}-meta.json` + ); +} +/** + * gets file from Retrieve folder + * + * @param {string} customerKey of metadata + * @param {string} type of metadata + * @param {string} subtype of metadata + * @param {string} ext file extension + * @returns {string} file path + */ +function getActualFile(customerKey, type, subtype, ext) { + return `./retrieve/testInstance/testBU/${type}/${subtype}/${customerKey}.${type}-${subtype}-meta.${ext}`; +} + +describe('type: asset', () => { + beforeEach(() => { + testUtils.mockSetup(); + }); + afterEach(() => { + testUtils.mockReset(); + }); + describe('Retrieve ================', () => { + it('Should retrieve a asset & ensure non-ssjs code is not removed', async () => { + // WHEN + const retrieve = await handler.retrieve('testInstance/testBU', ['asset']); + + // THEN + assert.equal(process.exitCode, false, 'retrieve should not have thrown an error'); + assert.equal( + retrieve['testInstance/testBU'].asset + ? Object.keys(retrieve['testInstance/testBU'].asset).length + : 0, + 3, + 'only 3 assets expected in retrieve response' + ); + // get results from cache + const result = cache.getCache(); + assert.equal( + result.asset ? Object.keys(result.asset).length : 0, + 3, + 'only 3 assets expected in cache' + ); + + assert.deepEqual( + await getActualJson('mcdev-issue-1157', 'asset', 'block'), + await testUtils.getExpectedJson('9999999', 'asset', 'block-1157-retrieve'), + 'returned metadata was not equal expected' + ); + expect(file(getActualFile('mcdev-issue-1157', 'asset', 'block', 'html'))).to.equal( + file(testUtils.getExpectedFile('9999999', 'asset', 'block-1157-retrieve', 'html')) + ); + + assert.equal( + testUtils.getAPIHistoryLength(), + 30, + 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests' + ); + return; + }); + }); +});