mcdev 4.3.4 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/.coverage-comment-template.md +20 -0
  2. package/.coverage-comment-template.svelte +178 -0
  3. package/.eslintrc.json +2 -0
  4. package/.github/ISSUE_TEMPLATE/bug.yml +1 -0
  5. package/.github/workflows/code-test.yml +36 -0
  6. package/.github/workflows/coverage-base-update.yml +57 -0
  7. package/.github/workflows/coverage-develop-branch.yml +41 -0
  8. package/.github/workflows/coverage-main-branch.yml +41 -0
  9. package/.github/workflows/coverage.yml +77 -0
  10. package/.husky/post-checkout +1 -1
  11. package/.prettierrc +1 -1
  12. package/.vscode/extensions.json +0 -4
  13. package/boilerplate/config.json +1 -1
  14. package/boilerplate/files/.prettierrc +1 -1
  15. package/boilerplate/files/.vscode/extensions.json +1 -1
  16. package/boilerplate/forcedUpdates.json +4 -0
  17. package/docs/dist/documentation.md +1196 -430
  18. package/lib/Builder.js +6 -1
  19. package/lib/Deployer.js +30 -5
  20. package/lib/MetadataTypeDefinitions.js +8 -6
  21. package/lib/MetadataTypeInfo.js +8 -6
  22. package/lib/cli.js +54 -42
  23. package/lib/index.js +82 -8
  24. package/lib/metadataTypes/Asset.js +73 -1
  25. package/lib/metadataTypes/AttributeGroup.js +0 -1
  26. package/lib/metadataTypes/Automation.js +48 -5
  27. package/lib/metadataTypes/Campaign.js +20 -7
  28. package/lib/metadataTypes/ContentArea.js +1 -1
  29. package/lib/metadataTypes/DataExtension.js +221 -184
  30. package/lib/metadataTypes/DataExtensionField.js +12 -19
  31. package/lib/metadataTypes/DataExtensionTemplate.js +1 -1
  32. package/lib/metadataTypes/DataExtract.js +1 -1
  33. package/lib/metadataTypes/DataExtractType.js +1 -1
  34. package/lib/metadataTypes/Email.js +1 -1
  35. package/lib/metadataTypes/{EmailSendDefinition.js → EmailSend.js} +5 -5
  36. package/lib/metadataTypes/{EventDefinition.js → Event.js} +17 -35
  37. package/lib/metadataTypes/{FtpLocation.js → FileLocation.js} +2 -2
  38. package/lib/metadataTypes/FileTransfer.js +8 -7
  39. package/lib/metadataTypes/Filter.js +1 -1
  40. package/lib/metadataTypes/Folder.js +8 -3
  41. package/lib/metadataTypes/ImportFile.js +6 -6
  42. package/lib/metadataTypes/{Interaction.js → Journey.js} +311 -147
  43. package/lib/metadataTypes/List.js +2 -2
  44. package/lib/metadataTypes/MetadataType.js +318 -90
  45. package/lib/metadataTypes/MobileCode.js +0 -1
  46. package/lib/metadataTypes/MobileKeyword.js +336 -40
  47. package/lib/metadataTypes/MobileMessage.js +473 -0
  48. package/lib/metadataTypes/Query.js +114 -32
  49. package/lib/metadataTypes/Role.js +60 -21
  50. package/lib/metadataTypes/Script.js +2 -3
  51. package/lib/metadataTypes/SendClassification.js +40 -0
  52. package/lib/metadataTypes/SetDefinition.js +1 -7
  53. package/lib/metadataTypes/TransactionalEmail.js +2 -3
  54. package/lib/metadataTypes/TransactionalMessage.js +1 -2
  55. package/lib/metadataTypes/TransactionalSMS.js +8 -15
  56. package/lib/metadataTypes/{TriggeredSendDefinition.js → TriggeredSend.js} +35 -27
  57. package/lib/metadataTypes/User.js +1177 -0
  58. package/lib/metadataTypes/definitions/Asset.definition.js +1 -0
  59. package/lib/metadataTypes/definitions/AttributeGroup.definition.js +1 -0
  60. package/lib/metadataTypes/definitions/Automation.definition.js +3 -2
  61. package/lib/metadataTypes/definitions/Campaign.definition.js +79 -4
  62. package/lib/metadataTypes/definitions/ContentArea.definition.js +1 -0
  63. package/lib/metadataTypes/definitions/DataExtension.definition.js +2 -1
  64. package/lib/metadataTypes/definitions/DataExtensionField.definition.js +1 -0
  65. package/lib/metadataTypes/definitions/DataExtensionTemplate.definition.js +1 -0
  66. package/lib/metadataTypes/definitions/DataExtract.definition.js +1 -0
  67. package/lib/metadataTypes/definitions/DataExtractType.definition.js +1 -0
  68. package/lib/metadataTypes/definitions/Discovery.definition.js +1 -0
  69. package/lib/metadataTypes/definitions/Email.definition.js +1 -0
  70. package/lib/metadataTypes/definitions/{EmailSendDefinition.definition.js → EmailSend.definition.js} +4 -2
  71. package/lib/metadataTypes/definitions/{EventDefinition.definition.js → Event.definition.js} +2 -1
  72. package/lib/metadataTypes/definitions/{FtpLocation.definition.js → FileLocation.definition.js} +4 -3
  73. package/lib/metadataTypes/definitions/FileTransfer.definition.js +3 -2
  74. package/lib/metadataTypes/definitions/Filter.definition.js +1 -0
  75. package/lib/metadataTypes/definitions/Folder.definition.js +2 -0
  76. package/lib/metadataTypes/definitions/ImportFile.definition.js +4 -3
  77. package/lib/metadataTypes/definitions/{Interaction.definition.js → Journey.definition.js} +11 -2
  78. package/lib/metadataTypes/definitions/List.definition.js +1 -0
  79. package/lib/metadataTypes/definitions/MobileCode.definition.js +3 -1
  80. package/lib/metadataTypes/definitions/MobileKeyword.definition.js +27 -17
  81. package/lib/metadataTypes/definitions/MobileMessage.definition.js +743 -0
  82. package/lib/metadataTypes/definitions/Query.definition.js +3 -2
  83. package/lib/metadataTypes/definitions/Role.definition.js +5 -0
  84. package/lib/metadataTypes/definitions/Script.definition.js +1 -0
  85. package/lib/metadataTypes/definitions/SendClassification.definition.js +114 -0
  86. package/lib/metadataTypes/definitions/SetDefinition.definition.js +1 -0
  87. package/lib/metadataTypes/definitions/TransactionalEmail.definition.js +2 -1
  88. package/lib/metadataTypes/definitions/TransactionalPush.definition.js +1 -0
  89. package/lib/metadataTypes/definitions/TransactionalSMS.definition.js +1 -0
  90. package/lib/metadataTypes/definitions/{TriggeredSendDefinition.definition.js → TriggeredSend.definition.js} +5 -3
  91. package/lib/metadataTypes/definitions/User.definition.js +365 -0
  92. package/lib/retrieveChangelog.js +1 -2
  93. package/lib/util/auth.js +29 -9
  94. package/lib/util/businessUnit.js +3 -3
  95. package/lib/util/cli.js +55 -7
  96. package/lib/util/devops.js +6 -4
  97. package/lib/util/file.js +55 -13
  98. package/lib/util/init.config.js +1 -2
  99. package/lib/util/init.npm.js +3 -3
  100. package/lib/util/util.js +23 -14
  101. package/package.json +16 -15
  102. package/test/general.test.js +62 -0
  103. package/test/mockRoot/.mcdevrc.json +7 -5
  104. package/test/mockRoot/deploy/testInstance/_ParentBU_/user/testBlocked_user.user-meta.json +23 -0
  105. package/test/mockRoot/deploy/testInstance/_ParentBU_/user/testExisting_user.user-meta.json +31 -0
  106. package/test/mockRoot/deploy/testInstance/_ParentBU_/user/testNew_user.user-meta.json +27 -0
  107. package/test/mockRoot/deploy/testInstance/testBU/dataExtension/{childBU_dataextension_test.dataExtension-meta.json → testExisting_dataExtension.dataExtension-meta.json} +2 -2
  108. package/test/mockRoot/deploy/testInstance/testBU/dataExtension/{testDataExtension.dataExtension-meta.json → testNew_dataExtension.dataExtension-meta.json} +2 -2
  109. package/test/mockRoot/deploy/testInstance/testBU/journey/testExisting_interaction.interaction-meta.json +576 -0
  110. package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.amp +2 -0
  111. package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword.mobileKeyword-meta.json +10 -0
  112. package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.amp +2 -0
  113. package/test/mockRoot/deploy/testInstance/testBU/mobileKeyword/testNew_keyword_blocked.mobileKeyword-meta.json +10 -0
  114. package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/NTIzOjc4OjA.mobileMessage-meta.amp +1 -0
  115. package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/NTIzOjc4OjA.mobileMessage-meta.json +61 -0
  116. package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/new.mobileMessage-meta.amp +1 -0
  117. package/test/mockRoot/deploy/testInstance/testBU/mobileMessage/new.mobileMessage-meta.json +60 -0
  118. package/test/mockRoot/deploy/testInstance/testBU/query/testExistingQuery.query-meta.json +1 -1
  119. package/test/mockRoot/deploy/testInstance/testBU/query/testNewQuery.query-meta.json +1 -1
  120. package/test/mockRoot/deploy/testInstance/testBU/query/testNewQuery.query-meta.sql +1 -1
  121. package/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testExisting_temail.transactionalEmail-meta.json +1 -1
  122. package/test/mockRoot/deploy/testInstance/testBU/transactionalEmail/testNew_temail.transactionalEmail-meta.json +1 -1
  123. package/test/resourceFactory.js +13 -0
  124. package/test/resources/1111111/accountUser/configure-response.xml +70 -0
  125. package/test/resources/1111111/accountUser/create-response.xml +97 -0
  126. package/test/resources/1111111/accountUser/retrieve-response.xml +156 -0
  127. package/test/resources/1111111/accountUser/update-response.xml +111 -0
  128. package/test/resources/1111111/accountUserAccount/retrieve-response.xml +77 -0
  129. package/test/resources/1111111/platform/v1/setup/quickflow/data/get-response.json +455 -0
  130. package/test/resources/1111111/role/retrieve-response.xml +76 -0
  131. package/test/resources/1111111/user/build-expected.json +16 -0
  132. package/test/resources/1111111/user/create-expected.json +21 -0
  133. package/test/resources/1111111/user/retrieve-expected.json +24 -0
  134. package/test/resources/1111111/user/template-expected.json +16 -0
  135. package/test/resources/1111111/user/update-expected.json +21 -0
  136. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/delete-response.json +1 -0
  137. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/get-response.json +17 -0
  138. package/test/resources/9999999/automation/v1/queries/549f0568-607c-4940-afef-437965094dat/patch-response.json +3 -3
  139. package/test/resources/9999999/automation/v1/queries/get-response.json +21 -4
  140. package/test/resources/9999999/automation/v1/queries/post-response.json +4 -4
  141. package/test/resources/9999999/data/v1/customobjectdata/key/{childBU_dataextension_test → testExisting_dataExtension}/rowset/get-response.json +1 -1
  142. package/test/resources/9999999/dataExtension/build-expected.json +3 -3
  143. package/test/resources/9999999/dataExtension/create-expected.json +2 -2
  144. package/test/resources/9999999/dataExtension/create-response.xml +8 -3
  145. package/test/resources/9999999/dataExtension/retrieve-expected.json +3 -3
  146. package/test/resources/9999999/dataExtension/retrieve-response.xml +9 -4
  147. package/test/resources/9999999/dataExtension/template-expected.json +3 -3
  148. package/test/resources/9999999/dataExtension/update-expected.json +3 -3
  149. package/test/resources/9999999/dataExtension/update-response.xml +9 -4
  150. package/test/resources/9999999/dataExtensionField/retrieve-response.xml +14 -9
  151. package/test/resources/9999999/interaction/v1/interactions/get-response.json +312 -0
  152. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_interaction/get-response.json +312 -0
  153. package/test/resources/9999999/interaction/v1/interactions/key_testExisting_interaction/put-response.json +592 -0
  154. package/test/resources/9999999/journey/build-expected.json +572 -0
  155. package/test/resources/9999999/journey/get-expected.json +576 -0
  156. package/test/resources/9999999/journey/put-expected.json +576 -0
  157. package/test/resources/9999999/journey/template-expected.json +572 -0
  158. package/test/resources/9999999/legacy/v1/beta/mobile/keyword/NXV4ZFMwTEFwRVczd3RaLUF5X3p5dzo4Njow/get-response.json +42 -0
  159. package/test/resources/9999999/legacy/v1/beta/mobile/keyword/cTVJaG5oSDJPVUNHcUh6Z3pQT2tVdzo4Njow/delete-response.json +0 -0
  160. package/test/resources/9999999/legacy/v1/beta/mobile/keyword/get-response.json +1 -0
  161. package/test/resources/9999999/legacy/v1/beta/mobile/keyword/post-response.json +3 -0
  162. package/test/resources/9999999/legacy/v1/beta/mobile/message/NTIzOjc4OjA/delete-response.json +0 -0
  163. package/test/resources/9999999/legacy/v1/beta/mobile/message/NTIzOjc4OjA/get-response.json +106 -0
  164. package/test/resources/9999999/legacy/v1/beta/mobile/message/NTIzOjc4OjA/post-response.json +0 -0
  165. package/test/resources/9999999/legacy/v1/beta/mobile/message/NTQ3Ojc4OjA/get-response.json +127 -0
  166. package/test/resources/9999999/legacy/v1/beta/mobile/message/get-response.json +129 -0
  167. package/test/resources/9999999/legacy/v1/beta/mobile/message/post-response.json +3 -0
  168. package/test/resources/9999999/legacy/v1/beta2/data/campaign/get-response.json +29 -0
  169. package/test/resources/9999999/messaging/v1/email/definitions/post-response.json +1 -1
  170. package/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/get-response.json +1 -1
  171. package/test/resources/9999999/messaging/v1/email/definitions/testExisting_temail/patch-response.json +1 -1
  172. package/test/resources/9999999/mobileKeyword/build-expected.amp +2 -0
  173. package/test/resources/9999999/mobileKeyword/build-expected.json +9 -0
  174. package/test/resources/9999999/mobileKeyword/get-expected.amp +2 -0
  175. package/test/resources/9999999/mobileKeyword/get-expected.json +15 -0
  176. package/test/resources/9999999/mobileKeyword/post-create-expected.amp +2 -0
  177. package/test/resources/9999999/mobileKeyword/post-create-expected.json +17 -0
  178. package/test/resources/9999999/mobileKeyword/template-expected.amp +2 -0
  179. package/test/resources/9999999/mobileKeyword/template-expected.json +9 -0
  180. package/test/resources/9999999/mobileMessage/build-expected.amp +1 -0
  181. package/test/resources/9999999/mobileMessage/build-expected.json +60 -0
  182. package/test/resources/9999999/mobileMessage/get-expected.amp +1 -0
  183. package/test/resources/9999999/mobileMessage/get-expected.json +61 -0
  184. package/test/resources/9999999/mobileMessage/post-create-expected.amp +1 -0
  185. package/test/resources/9999999/mobileMessage/post-create-expected.json +63 -0
  186. package/test/resources/9999999/mobileMessage/post-update-expected.amp +1 -0
  187. package/test/resources/9999999/mobileMessage/post-update-expected.json +61 -0
  188. package/test/resources/9999999/mobileMessage/template-expected.amp +1 -0
  189. package/test/resources/9999999/mobileMessage/template-expected.json +60 -0
  190. package/test/resources/9999999/query/build-expected.json +1 -1
  191. package/test/resources/9999999/query/get-expected.json +1 -1
  192. package/test/resources/9999999/query/get2-expected.json +11 -0
  193. package/test/resources/9999999/query/patch-expected.json +1 -1
  194. package/test/resources/9999999/query/post-expected.json +1 -1
  195. package/test/resources/9999999/query/template-expected.json +1 -1
  196. package/test/resources/9999999/queryDefinition/retrieve-response.xml +30 -0
  197. package/test/resources/9999999/transactionalEmail/build-expected.json +5 -5
  198. package/test/resources/9999999/transactionalEmail/get-expected.json +1 -1
  199. package/test/resources/9999999/transactionalEmail/patch-expected.json +1 -1
  200. package/test/resources/9999999/transactionalEmail/post-expected.json +1 -1
  201. package/test/resources/9999999/transactionalEmail/template-expected.json +5 -5
  202. package/test/resources/9999999/transactionalPush/build-expected.json +2 -2
  203. package/test/resources/9999999/transactionalPush/template-expected.json +2 -2
  204. package/test/resources/9999999/transactionalSMS/build-expected.json +3 -3
  205. package/test/resources/9999999/transactionalSMS/template-expected.json +3 -3
  206. package/test/{dataExtension.test.js → type.dataExtension.test.js} +78 -21
  207. package/test/{interaction.test.js → type.journey.test.js} +64 -30
  208. package/test/type.mobileKeyword.test.js +250 -0
  209. package/test/type.mobileMessage.test.js +205 -0
  210. package/test/{query.test.js → type.query.test.js} +102 -5
  211. package/test/{transactionalEmail.test.js → type.transactionalEmail.test.js} +40 -2
  212. package/test/{transactionalPush.test.js → type.transactionalPush.test.js} +41 -2
  213. package/test/{transactionalSMS.test.js → type.transactionalSMS.test.js} +73 -3
  214. package/test/type.user.test.js +160 -0
  215. package/test/utils.js +17 -5
  216. package/types/mcdev.d.js +48 -15
  217. package/.github/workflows/code-analysis.yml +0 -57
  218. package/lib/metadataTypes/AccountUser.js +0 -426
  219. package/lib/metadataTypes/definitions/AccountUser.definition.js +0 -227
  220. package/test/mockRoot/deploy/testInstance/testBU/interaction/testExisting_interaction.interaction-meta.json +0 -266
  221. package/test/resources/9999999/interaction/build-expected.json +0 -260
  222. package/test/resources/9999999/interaction/get-expected.json +0 -264
  223. package/test/resources/9999999/interaction/put-expected.json +0 -264
  224. package/test/resources/9999999/interaction/template-expected.json +0 -260
  225. package/test/resources/9999999/interaction/v1/interactions/put-response.json +0 -280
  226. /package/test/mockRoot/deploy/testInstance/testBU/{interaction → journey}/testNew_interaction.interaction-meta.json +0 -0
  227. /package/test/resources/9999999/{interaction → journey}/post-expected.json +0 -0
@@ -6,7 +6,7 @@ const cache = require('../lib/util/cache');
6
6
  const testUtils = require('./utils');
7
7
  const handler = require('../lib/index');
8
8
 
9
- describe('interaction', () => {
9
+ describe('type: journey', () => {
10
10
  beforeEach(() => {
11
11
  testUtils.mockSetup();
12
12
  });
@@ -15,25 +15,26 @@ describe('interaction', () => {
15
15
  });
16
16
 
17
17
  describe('Retrieve ================', () => {
18
- it('Should retrieve a interaction', async () => {
18
+ it('Should retrieve a journey', async () => {
19
19
  // WHEN
20
- await handler.retrieve('testInstance/testBU', ['interaction']);
20
+ await handler.retrieve('testInstance/testBU', ['journey']);
21
21
  // THEN
22
+ assert.equal(process.exitCode, false, 'retrieve should not have thrown an error');
22
23
  // get results from cache
23
24
  const result = cache.getCache();
24
25
  assert.equal(
25
- result.interaction ? Object.keys(result.interaction).length : 0,
26
+ result.journey ? Object.keys(result.journey).length : 0,
26
27
  2,
27
- 'only 2 interactions expected'
28
+ 'only 2 journeys expected'
28
29
  );
29
30
  assert.deepEqual(
30
- await testUtils.getActualJson('testExisting_interaction', 'interaction'),
31
- await testUtils.getExpectedJson('9999999', 'interaction', 'get'),
31
+ await testUtils.getActualJson('testExisting_interaction', 'journey'),
32
+ await testUtils.getExpectedJson('9999999', 'journey', 'get'),
32
33
  'returned JSON was not equal expected'
33
34
  );
34
35
  assert.equal(
35
36
  testUtils.getAPIHistoryLength(),
36
- 9,
37
+ 13,
37
38
  'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
38
39
  );
39
40
  return;
@@ -43,81 +44,114 @@ describe('interaction', () => {
43
44
  beforeEach(() => {
44
45
  testUtils.mockSetup(true);
45
46
  });
46
- it('Should create & upsert a interaction', async () => {
47
+ it('Should create & upsert a journey', async () => {
47
48
  // WHEN
48
- await handler.deploy('testInstance/testBU', ['interaction']);
49
+ await handler.deploy('testInstance/testBU', ['journey']);
49
50
  // THEN
51
+ assert.equal(process.exitCode, false, 'deploy should not have thrown an error');
50
52
  // get results from cache
51
53
  const result = cache.getCache();
52
54
  assert.equal(
53
- result.interaction ? Object.keys(result.interaction).length : 0,
55
+ result.journey ? Object.keys(result.journey).length : 0,
54
56
  3,
55
- '3 interactions expected'
57
+ '3 journeys expected'
56
58
  );
57
59
  // confirm created item
58
60
  assert.deepEqual(
59
- await testUtils.getActualJson('testNew_interaction', 'interaction'),
60
- await testUtils.getExpectedJson('9999999', 'interaction', 'post'),
61
- 'returned JSON was not equal expected for insert interaction'
61
+ await testUtils.getActualJson('testNew_interaction', 'journey'),
62
+ await testUtils.getExpectedJson('9999999', 'journey', 'post'),
63
+ 'returned JSON was not equal expected for insert journey'
62
64
  );
63
65
 
64
66
  // confirm updated item
65
67
  assert.deepEqual(
66
- await testUtils.getActualJson('testExisting_interaction', 'interaction'),
67
- await testUtils.getExpectedJson('9999999', 'interaction', 'put'), // watch out - interaction api wants put instead of patch for updates
68
- 'returned JSON was not equal expected for update interaction'
68
+ await testUtils.getActualJson('testExisting_interaction', 'journey'),
69
+ await testUtils.getExpectedJson('9999999', 'journey', 'put'), // watch out - journey api wants put instead of patch for updates
70
+ 'returned JSON was not equal expected for update journey'
69
71
  );
70
72
 
71
73
  // check number of API calls
72
74
  assert.equal(
73
75
  testUtils.getAPIHistoryLength(),
74
- 7,
76
+ 11,
75
77
  'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
76
78
  );
77
79
  return;
78
80
  });
81
+ it('Should NOT change the key during update with --changeKeyValue and instead fail due to missing support', async () => {
82
+ // WHEN
83
+ handler.setOptions({ changeKeyValue: 'updatedKey' });
84
+ await handler.deploy('testInstance/testBU', ['journey'], ['testExisting_interaction']);
85
+ // THEN
86
+ assert.equal(
87
+ process.exitCode,
88
+ 1,
89
+ 'deploy should have thrown an error due to lack of support'
90
+ );
91
+ return;
92
+ });
79
93
  });
80
94
  describe('Templating ================', () => {
81
- it('Should create a interaction template via buildTemplate and build it', async () => {
95
+ it('Should create a journey template via buildTemplate and build it', async () => {
82
96
  // download first before we test buildTemplate
83
- await handler.retrieve('testInstance/testBU', ['interaction']);
97
+ await handler.retrieve('testInstance/testBU', ['journey']);
84
98
  // buildTemplate
85
99
  const result = await handler.buildTemplate(
86
100
  'testInstance/testBU',
87
- 'interaction',
101
+ 'journey',
88
102
  ['testExisting_interaction'],
89
103
  'testSourceMarket'
90
104
  );
105
+ assert.equal(process.exitCode, false, 'buildTemplate should not have thrown an error');
91
106
  assert.equal(
92
- result.interaction ? Object.keys(result.interaction).length : 0,
107
+ result.journey ? Object.keys(result.journey).length : 0,
93
108
  1,
94
- 'only one interaction expected'
109
+ 'only one journey expected'
95
110
  );
96
111
  assert.deepEqual(
97
- await testUtils.getActualTemplateJson('testExisting_interaction', 'interaction'),
98
- await testUtils.getExpectedJson('9999999', 'interaction', 'template'),
112
+ await testUtils.getActualTemplateJson('testExisting_interaction', 'journey'),
113
+ await testUtils.getExpectedJson('9999999', 'journey', 'template'),
99
114
  'returned template JSON was not equal expected'
100
115
  );
101
116
 
102
117
  // buildDefinition
103
118
  await handler.buildDefinition(
104
119
  'testInstance/testBU',
105
- 'interaction',
120
+ 'journey',
106
121
  'testExisting_interaction',
107
122
  'testTargetMarket'
108
123
  );
124
+ assert.equal(
125
+ process.exitCode,
126
+ false,
127
+ 'buildDefinition should not have thrown an error'
128
+ );
109
129
  assert.deepEqual(
110
- await testUtils.getActualDeployJson('testExisting_interaction', 'interaction'),
111
- await testUtils.getExpectedJson('9999999', 'interaction', 'build'),
130
+ await testUtils.getActualDeployJson('testTemplated_interaction', 'journey'),
131
+ await testUtils.getExpectedJson('9999999', 'journey', 'build'),
112
132
  'returned deployment JSON was not equal expected'
113
133
  );
114
134
 
115
135
  assert.equal(
116
136
  testUtils.getAPIHistoryLength(),
117
- 9,
137
+ 13,
118
138
  'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
119
139
  );
120
140
  return;
121
141
  });
122
142
  });
143
+ describe('Delete ================', () => {
144
+ // TODO: add this test
145
+ it('Should delete the item'); // , async () => {
146
+ // // WHEN
147
+ // const result = await handler.deleteByKey('testInstance/testBU', 'mobileKeyword', [
148
+ // 'testExisting_keyword',
149
+ // ]);
150
+ // // THEN
151
+ // assert.equal(process.exitCode, false, 'delete should not have thrown an error');
152
+
153
+ // assert.equal(result, true, 'should have deleted the item');
154
+ // return;
155
+ // });
156
+ });
123
157
  });
@@ -0,0 +1,250 @@
1
+ const chai = require('chai');
2
+ const chaiFiles = require('chai-files');
3
+ const assert = chai.assert;
4
+ chai.use(chaiFiles);
5
+ const expect = chai.expect;
6
+ const file = chaiFiles.file;
7
+ const cache = require('../lib/util/cache');
8
+ const testUtils = require('./utils');
9
+ const handler = require('../lib/index');
10
+
11
+ describe('type: mobileKeyword', () => {
12
+ beforeEach(() => {
13
+ testUtils.mockSetup();
14
+ });
15
+ afterEach(() => {
16
+ testUtils.mockReset();
17
+ });
18
+
19
+ describe('Retrieve ================', () => {
20
+ it('Should retrieve a mobileKeyword', async () => {
21
+ // WHEN
22
+ await handler.retrieve('testInstance/testBU', ['mobileKeyword']);
23
+ // THEN
24
+ assert.equal(process.exitCode, false, 'retrieve should not have thrown an error');
25
+ // get results from cache
26
+ const result = cache.getCache();
27
+ assert.equal(
28
+ result.mobileKeyword ? Object.keys(result.mobileKeyword).length : 0,
29
+ 1,
30
+ 'only 1 mobileKeywords expected'
31
+ );
32
+ assert.deepEqual(
33
+ await testUtils.getActualJson('testExisting_keyword', 'mobileKeyword'),
34
+ await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'get'),
35
+ 'saved JSON was not equal expected'
36
+ );
37
+ expect(
38
+ file(testUtils.getActualFile('testExisting_keyword', 'mobileKeyword', 'amp'))
39
+ ).to.equal(file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'get', 'amp')));
40
+ assert.equal(
41
+ testUtils.getAPIHistoryLength(),
42
+ 2,
43
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
44
+ );
45
+ return;
46
+ });
47
+ });
48
+ describe('Deploy ================', () => {
49
+ beforeEach(() => {
50
+ testUtils.mockSetup(true);
51
+ });
52
+ it('Should create (but not update) a mobileKeyword', async () => {
53
+ // WHEN
54
+ await handler.deploy('testInstance/testBU', ['mobileKeyword'], ['testNew_keyword']);
55
+ // THEN
56
+ assert.equal(process.exitCode, false, 'deploy should not have thrown an error');
57
+ // get results from cache
58
+ const result = cache.getCache();
59
+ assert.equal(
60
+ result.mobileKeyword ? Object.keys(result.mobileKeyword).length : 0,
61
+ 2,
62
+ '2 mobileKeywords expected'
63
+ );
64
+ // confirm created item
65
+ assert.deepEqual(
66
+ await testUtils.getActualJson('testNew_keyword', 'mobileKeyword'),
67
+ await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'post-create'),
68
+ 'returned JSON was not equal expected for insert mobileKeyword'
69
+ );
70
+ expect(
71
+ file(testUtils.getActualFile('testNew_keyword', 'mobileKeyword', 'amp'))
72
+ ).to.equal(
73
+ file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'post-create', 'amp'))
74
+ );
75
+
76
+ // confirm updated item
77
+ // eslint-disable-next-line no-console
78
+ console.log(
79
+ 'Not testing UPDATE because the API only responds with an empty body unless there are errors in the request body'
80
+ );
81
+
82
+ // check number of API calls
83
+ assert.equal(
84
+ testUtils.getAPIHistoryLength(),
85
+ 4,
86
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
87
+ );
88
+ return;
89
+ });
90
+ it('Should not create a mobileKeyword with wrong type', async () => {
91
+ // WHEN
92
+ await handler.deploy(
93
+ 'testInstance/testBU',
94
+ ['mobileKeyword'],
95
+ ['testNew_keyword_blocked']
96
+ );
97
+ // THEN
98
+ assert.equal(process.exitCode, true, 'deploy should have thrown an error');
99
+
100
+ // check number of API calls
101
+ assert.equal(
102
+ testUtils.getAPIHistoryLength(),
103
+ 2,
104
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
105
+ );
106
+ return;
107
+ });
108
+ it('Should change the key during update via --changeKeyValue');
109
+ });
110
+ describe('Templating ================', () => {
111
+ it('Should create a mobileKeyword template via retrieveAsTemplate and build it', async () => {
112
+ // GIVEN there is a template
113
+ const result = await handler.retrieveAsTemplate(
114
+ 'testInstance/testBU',
115
+ 'mobileKeyword',
116
+ ['testExisting_keyword'],
117
+ 'testSourceMarket'
118
+ );
119
+ // WHEN
120
+ assert.equal(
121
+ process.exitCode,
122
+ false,
123
+ 'retrieveAsTemplate should not have thrown an error'
124
+ );
125
+ assert.equal(
126
+ result.mobileKeyword ? Object.keys(result.mobileKeyword).length : 0,
127
+ 1,
128
+ 'only one item expected'
129
+ );
130
+ assert.deepEqual(
131
+ await testUtils.getActualTemplateJson('testExisting_keyword', 'mobileKeyword'),
132
+ await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'template'),
133
+ 'returned template JSON was not equal expected'
134
+ );
135
+ expect(
136
+ file(
137
+ testUtils.getActualTemplateFile('testExisting_keyword', 'mobileKeyword', 'amp')
138
+ )
139
+ ).to.equal(
140
+ file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'template', 'amp'))
141
+ );
142
+ assert.equal(
143
+ testUtils.getAPIHistoryLength(),
144
+ 2,
145
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
146
+ );
147
+ return;
148
+ });
149
+ it('Should create a mobileKeyword template via buildTemplate and build it', async () => {
150
+ // download first before we test buildTemplate
151
+ await handler.retrieve('testInstance/testBU', ['mobileKeyword']);
152
+ // buildTemplate
153
+ const result = await handler.buildTemplate(
154
+ 'testInstance/testBU',
155
+ 'mobileKeyword',
156
+ ['testExisting_keyword'],
157
+ 'testSourceMarket'
158
+ );
159
+ assert.equal(process.exitCode, false, 'buildTemplate should not have thrown an error');
160
+
161
+ assert.equal(
162
+ result.mobileKeyword ? Object.keys(result.mobileKeyword).length : 0,
163
+ 1,
164
+ 'only one mobileKeyword expected'
165
+ );
166
+ assert.deepEqual(
167
+ await testUtils.getActualTemplateJson('testExisting_keyword', 'mobileKeyword'),
168
+ await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'template'),
169
+ 'returned template JSON was not equal expected'
170
+ );
171
+ expect(
172
+ file(
173
+ testUtils.getActualTemplateFile('testExisting_keyword', 'mobileKeyword', 'amp')
174
+ )
175
+ ).to.equal(
176
+ file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'template', 'amp'))
177
+ );
178
+
179
+ // buildDefinition
180
+ await handler.buildDefinition(
181
+ 'testInstance/testBU',
182
+ 'mobileKeyword',
183
+ 'testExisting_keyword',
184
+ 'testTargetMarket'
185
+ );
186
+ assert.equal(
187
+ process.exitCode,
188
+ false,
189
+ 'buildDefinition should not have thrown an error'
190
+ );
191
+ assert.deepEqual(
192
+ await testUtils.getActualDeployJson('testTemplated_keyword', 'mobileKeyword'),
193
+ await testUtils.getExpectedJson('9999999', 'mobileKeyword', 'build'),
194
+ 'returned deployment JSON was not equal expected'
195
+ );
196
+ expect(
197
+ file(testUtils.getActualDeployFile('testTemplated_keyword', 'mobileKeyword', 'amp'))
198
+ ).to.equal(file(testUtils.getExpectedFile('9999999', 'mobileKeyword', 'build', 'amp')));
199
+
200
+ assert.equal(
201
+ testUtils.getAPIHistoryLength(),
202
+ 2,
203
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
204
+ );
205
+ return;
206
+ });
207
+ });
208
+ describe('Delete ================', () => {
209
+ it('Should delete the item', async () => {
210
+ // WHEN
211
+ const result = await handler.deleteByKey('testInstance/testBU', 'mobileKeyword', [
212
+ 'testExisting_keyword',
213
+ ]);
214
+ // THEN
215
+ assert.equal(process.exitCode, false, 'delete should not have thrown an error');
216
+
217
+ assert.equal(result, true, 'should have deleted the item');
218
+ return;
219
+ });
220
+ });
221
+ describe('CI/CD ================', () => {
222
+ it('Should return a list of files based on their type and key', async () => {
223
+ // WHEN
224
+ const fileList = await handler.getFilesToCommit(
225
+ 'testInstance/testBU',
226
+ 'mobileKeyword',
227
+ ['testExisting_keyword']
228
+ );
229
+ // THEN
230
+ assert.equal(
231
+ process.exitCode,
232
+ false,
233
+ 'getFilesToCommit should not have thrown an error'
234
+ );
235
+ assert.equal(fileList.length, 2, 'expected only 2 file paths');
236
+
237
+ assert.equal(
238
+ fileList[0].split('\\').join('/'),
239
+ 'retrieve/testInstance/testBU/mobileKeyword/testExisting_keyword.mobileKeyword-meta.json',
240
+ 'wrong JSON path'
241
+ );
242
+ assert.equal(
243
+ fileList[1].split('\\').join('/'),
244
+ 'retrieve/testInstance/testBU/mobileKeyword/testExisting_keyword.mobileKeyword-meta.amp',
245
+ 'wrong AMP path'
246
+ );
247
+ return;
248
+ });
249
+ });
250
+ });
@@ -0,0 +1,205 @@
1
+ const chai = require('chai');
2
+ const chaiFiles = require('chai-files');
3
+ const assert = chai.assert;
4
+ chai.use(chaiFiles);
5
+ const expect = chai.expect;
6
+ const file = chaiFiles.file;
7
+ const cache = require('../lib/util/cache');
8
+ const testUtils = require('./utils');
9
+ const handler = require('../lib/index');
10
+
11
+ describe('type: mobileMessage', () => {
12
+ beforeEach(() => {
13
+ testUtils.mockSetup();
14
+ });
15
+ afterEach(() => {
16
+ testUtils.mockReset();
17
+ });
18
+
19
+ describe('Retrieve ================', () => {
20
+ it('Should retrieve a mobileMessage', async () => {
21
+ // WHEN
22
+ await handler.retrieve('testInstance/testBU', ['mobileMessage']);
23
+ // THEN
24
+ assert.equal(process.exitCode, false, 'retrieve should not have thrown an error');
25
+ // get results from cache
26
+ const result = cache.getCache();
27
+ assert.equal(
28
+ result.mobileMessage ? Object.keys(result.mobileMessage).length : 0,
29
+ 1,
30
+ 'only 1 mobileMessages expected'
31
+ );
32
+ assert.deepEqual(
33
+ await testUtils.getActualJson('NTIzOjc4OjA', 'mobileMessage'),
34
+ await testUtils.getExpectedJson('9999999', 'mobileMessage', 'get'),
35
+ 'saved JSON was not equal expected'
36
+ );
37
+ expect(file(testUtils.getActualFile('NTIzOjc4OjA', 'mobileMessage', 'amp'))).to.equal(
38
+ file(testUtils.getExpectedFile('9999999', 'mobileMessage', 'get', 'amp'))
39
+ );
40
+ assert.equal(
41
+ testUtils.getAPIHistoryLength(),
42
+ 4,
43
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
44
+ );
45
+ return;
46
+ });
47
+ });
48
+ describe('Deploy ================', () => {
49
+ beforeEach(() => {
50
+ testUtils.mockSetup(true);
51
+ });
52
+ it('Should create & update items', async () => {
53
+ // WHEN
54
+ await handler.deploy('testInstance/testBU', ['mobileMessage']);
55
+ // THEN
56
+ assert.equal(process.exitCode, false, 'deploy should not have thrown an error');
57
+ // get results from cache
58
+ const result = cache.getCache();
59
+ assert.equal(
60
+ result.mobileMessage ? Object.keys(result.mobileMessage).length : 0,
61
+ 2,
62
+ '2 mobileMessages expected'
63
+ );
64
+ // confirm created item
65
+ assert.deepEqual(
66
+ await testUtils.getActualJson('NTQ3Ojc4OjA', 'mobileMessage'),
67
+ await testUtils.getExpectedJson('9999999', 'mobileMessage', 'post-create'),
68
+ 'returned JSON was not equal expected for insert mobileMessage'
69
+ );
70
+ expect(file(testUtils.getActualFile('NTQ3Ojc4OjA', 'mobileMessage', 'amp'))).to.equal(
71
+ file(testUtils.getExpectedFile('9999999', 'mobileMessage', 'post-create', 'amp'))
72
+ );
73
+
74
+ // confirm updated item
75
+ assert.deepEqual(
76
+ await testUtils.getActualJson('NTIzOjc4OjA', 'mobileMessage'),
77
+ await testUtils.getExpectedJson('9999999', 'mobileMessage', 'post-update'), // watch out - mobileMessage api wants put instead of patch for updates
78
+ 'returned JSON was not equal expected for update mobileMessage'
79
+ );
80
+ expect(file(testUtils.getActualFile('NTIzOjc4OjA', 'mobileMessage', 'amp'))).to.equal(
81
+ file(testUtils.getExpectedFile('9999999', 'mobileMessage', 'post-update', 'amp'))
82
+ );
83
+
84
+ // check number of API calls
85
+ assert.equal(
86
+ testUtils.getAPIHistoryLength(),
87
+ 8,
88
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
89
+ );
90
+ return;
91
+ });
92
+ it('Should NOT change the key during update with --changeKeyValue and instead fail due to missing support', async () => {
93
+ // WHEN
94
+ handler.setOptions({ changeKeyValue: 'updatedKey' });
95
+ await handler.deploy('testInstance/testBU', ['mobileMessage'], ['NTIzOjc4OjA']);
96
+ // THEN
97
+ assert.equal(
98
+ process.exitCode,
99
+ 1,
100
+ 'deploy should have thrown an error due to lack of support'
101
+ );
102
+ return;
103
+ });
104
+ });
105
+ describe('Templating ================', () => {
106
+ it('Should create a mobileMessage template via buildTemplate and build it', async () => {
107
+ // download first before we test buildTemplate
108
+ await handler.retrieve('testInstance/testBU', ['mobileMessage']);
109
+ // buildTemplate
110
+ const result = await handler.buildTemplate(
111
+ 'testInstance/testBU',
112
+ 'mobileMessage',
113
+ ['NTIzOjc4OjA'],
114
+ 'testSourceMarket'
115
+ );
116
+ assert.equal(process.exitCode, false, 'buildTemplate should not have thrown an error');
117
+
118
+ assert.equal(
119
+ result.mobileMessage ? Object.keys(result.mobileMessage).length : 0,
120
+ 1,
121
+ 'only one mobileMessage expected'
122
+ );
123
+ assert.deepEqual(
124
+ await testUtils.getActualTemplateJson('NTIzOjc4OjA', 'mobileMessage'),
125
+ await testUtils.getExpectedJson('9999999', 'mobileMessage', 'template'),
126
+ 'returned template JSON was not equal expected'
127
+ );
128
+ expect(
129
+ file(testUtils.getActualTemplateFile('NTIzOjc4OjA', 'mobileMessage', 'amp'))
130
+ ).to.equal(
131
+ file(testUtils.getExpectedFile('9999999', 'mobileMessage', 'template', 'amp'))
132
+ );
133
+
134
+ // buildDefinition
135
+ await handler.buildDefinition(
136
+ 'testInstance/testBU',
137
+ 'mobileMessage',
138
+ 'NTIzOjc4OjA',
139
+ 'testTargetMarket'
140
+ );
141
+ assert.equal(
142
+ process.exitCode,
143
+ false,
144
+ 'buildDefinition should not have thrown an error'
145
+ );
146
+ assert.deepEqual(
147
+ await testUtils.getActualDeployJson('NTIzOjc4OjA', 'mobileMessage'),
148
+ await testUtils.getExpectedJson('9999999', 'mobileMessage', 'build'),
149
+ 'returned deployment JSON was not equal expected'
150
+ );
151
+ expect(
152
+ file(testUtils.getActualDeployFile('NTIzOjc4OjA', 'mobileMessage', 'amp'))
153
+ ).to.equal(file(testUtils.getExpectedFile('9999999', 'mobileMessage', 'build', 'amp')));
154
+
155
+ assert.equal(
156
+ testUtils.getAPIHistoryLength(),
157
+ 4,
158
+ 'Unexpected number of requests made. Run testUtils.logAPIHistoryDebug() to see the requests'
159
+ );
160
+ return;
161
+ });
162
+ });
163
+ describe('Delete ================', () => {
164
+ it('Should delete the item', async () => {
165
+ // WHEN
166
+ const result = await handler.deleteByKey('testInstance/testBU', 'mobileMessage', [
167
+ 'NTIzOjc4OjA',
168
+ ]);
169
+ // THEN
170
+ assert.equal(process.exitCode, false, 'delete should not have thrown an error');
171
+
172
+ assert.equal(result, true, 'should have deleted the item');
173
+ return;
174
+ });
175
+ });
176
+ describe('CI/CD ================', () => {
177
+ it('Should return a list of files based on their type and key', async () => {
178
+ // WHEN
179
+ const fileList = await handler.getFilesToCommit(
180
+ 'testInstance/testBU',
181
+ 'mobileMessage',
182
+ ['NTIzOjc4OjA']
183
+ );
184
+ // THEN
185
+ assert.equal(
186
+ process.exitCode,
187
+ false,
188
+ 'getFilesToCommit should not have thrown an error'
189
+ );
190
+ assert.equal(fileList.length, 2, 'expected only 2 file paths');
191
+
192
+ assert.equal(
193
+ fileList[0].split('\\').join('/'),
194
+ 'retrieve/testInstance/testBU/mobileMessage/NTIzOjc4OjA.mobileMessage-meta.json',
195
+ 'wrong JSON path'
196
+ );
197
+ assert.equal(
198
+ fileList[1].split('\\').join('/'),
199
+ 'retrieve/testInstance/testBU/mobileMessage/NTIzOjc4OjA.mobileMessage-meta.amp',
200
+ 'wrong AMP path'
201
+ );
202
+ return;
203
+ });
204
+ });
205
+ });