@symbo.ls/sdk 3.1.2 → 3.2.6

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 (187) hide show
  1. package/README.md +143 -2
  2. package/dist/cjs/config/environment.js +98 -30
  3. package/dist/cjs/index.js +144 -24
  4. package/dist/cjs/services/AdminService.js +351 -0
  5. package/dist/cjs/services/AuthService.js +738 -305
  6. package/dist/cjs/services/BaseService.js +158 -6
  7. package/dist/cjs/services/BranchService.js +484 -0
  8. package/dist/cjs/services/CollabService.js +743 -0
  9. package/dist/cjs/services/DnsService.js +340 -0
  10. package/dist/cjs/services/FeatureFlagService.js +175 -0
  11. package/dist/cjs/services/FileService.js +201 -0
  12. package/dist/cjs/services/IntegrationService.js +538 -0
  13. package/dist/cjs/services/MetricsService.js +62 -0
  14. package/dist/cjs/services/PaymentService.js +271 -0
  15. package/dist/cjs/services/PlanService.js +426 -0
  16. package/dist/cjs/services/ProjectService.js +1207 -0
  17. package/dist/cjs/services/PullRequestService.js +503 -0
  18. package/dist/cjs/services/ScreenshotService.js +304 -0
  19. package/dist/cjs/services/SubscriptionService.js +396 -0
  20. package/dist/cjs/services/TrackingService.js +661 -0
  21. package/dist/cjs/services/WaitlistService.js +148 -0
  22. package/dist/cjs/services/index.js +64 -16
  23. package/dist/cjs/state/RootStateManager.js +65 -0
  24. package/dist/cjs/state/rootEventBus.js +74 -0
  25. package/dist/cjs/utils/CollabClient.js +223 -0
  26. package/dist/cjs/utils/TokenManager.js +78 -30
  27. package/dist/cjs/utils/changePreprocessor.js +199 -0
  28. package/dist/cjs/utils/jsonDiff.js +145 -0
  29. package/dist/cjs/utils/ordering.js +309 -0
  30. package/dist/cjs/utils/services.js +301 -103
  31. package/dist/cjs/utils/validation.js +0 -3
  32. package/dist/esm/config/environment.js +98 -30
  33. package/dist/esm/index.js +49505 -8718
  34. package/dist/esm/services/AdminService.js +1132 -0
  35. package/dist/esm/services/AuthService.js +1493 -386
  36. package/dist/esm/services/BaseService.js +757 -6
  37. package/dist/esm/services/BranchService.js +1265 -0
  38. package/dist/esm/services/CollabService.js +26895 -0
  39. package/dist/esm/services/DnsService.js +1121 -0
  40. package/dist/esm/services/FeatureFlagService.js +956 -0
  41. package/dist/esm/services/FileService.js +982 -0
  42. package/dist/esm/services/IntegrationService.js +1319 -0
  43. package/dist/esm/services/MetricsService.js +843 -0
  44. package/dist/esm/services/PaymentService.js +1052 -0
  45. package/dist/esm/services/PlanService.js +1207 -0
  46. package/dist/esm/services/ProjectService.js +2526 -0
  47. package/dist/esm/services/PullRequestService.js +1284 -0
  48. package/dist/esm/services/ScreenshotService.js +1085 -0
  49. package/dist/esm/services/SubscriptionService.js +1177 -0
  50. package/dist/esm/services/TrackingService.js +18454 -0
  51. package/dist/esm/services/WaitlistService.js +929 -0
  52. package/dist/esm/services/index.js +49062 -8569
  53. package/dist/esm/state/RootStateManager.js +90 -0
  54. package/dist/esm/state/rootEventBus.js +56 -0
  55. package/dist/esm/utils/CollabClient.js +18889 -0
  56. package/dist/esm/utils/TokenManager.js +78 -30
  57. package/dist/esm/utils/changePreprocessor.js +542 -0
  58. package/dist/esm/utils/jsonDiff.js +7011 -0
  59. package/dist/esm/utils/ordering.js +291 -0
  60. package/dist/esm/utils/services.js +301 -103
  61. package/dist/esm/utils/validation.js +116 -50
  62. package/dist/node/config/environment.js +98 -30
  63. package/dist/node/index.js +175 -32
  64. package/dist/node/services/AdminService.js +332 -0
  65. package/dist/node/services/AuthService.js +742 -310
  66. package/dist/node/services/BaseService.js +148 -6
  67. package/dist/node/services/BranchService.js +465 -0
  68. package/dist/node/services/CollabService.js +724 -0
  69. package/dist/node/services/DnsService.js +321 -0
  70. package/dist/node/services/FeatureFlagService.js +156 -0
  71. package/dist/node/services/FileService.js +182 -0
  72. package/dist/node/services/IntegrationService.js +519 -0
  73. package/dist/node/services/MetricsService.js +43 -0
  74. package/dist/node/services/PaymentService.js +252 -0
  75. package/dist/node/services/PlanService.js +407 -0
  76. package/dist/node/services/ProjectService.js +1188 -0
  77. package/dist/node/services/PullRequestService.js +484 -0
  78. package/dist/node/services/ScreenshotService.js +285 -0
  79. package/dist/node/services/SubscriptionService.js +377 -0
  80. package/dist/node/services/TrackingService.js +632 -0
  81. package/dist/node/services/WaitlistService.js +129 -0
  82. package/dist/node/services/index.js +64 -16
  83. package/dist/node/state/RootStateManager.js +36 -0
  84. package/dist/node/state/rootEventBus.js +55 -0
  85. package/dist/node/utils/CollabClient.js +194 -0
  86. package/dist/node/utils/TokenManager.js +78 -30
  87. package/dist/node/utils/changePreprocessor.js +180 -0
  88. package/dist/node/utils/jsonDiff.js +116 -0
  89. package/dist/node/utils/ordering.js +290 -0
  90. package/dist/node/utils/services.js +301 -103
  91. package/dist/node/utils/validation.js +0 -3
  92. package/package.json +39 -21
  93. package/src/config/environment.js +99 -28
  94. package/src/index.js +181 -36
  95. package/src/services/AdminService.js +374 -0
  96. package/src/services/AuthService.js +874 -328
  97. package/src/services/BaseService.js +166 -6
  98. package/src/services/BranchService.js +536 -0
  99. package/src/services/CollabService.js +900 -0
  100. package/src/services/DnsService.js +366 -0
  101. package/src/services/FeatureFlagService.js +174 -0
  102. package/src/services/FileService.js +213 -0
  103. package/src/services/IntegrationService.js +548 -0
  104. package/src/services/MetricsService.js +40 -0
  105. package/src/services/PaymentService.js +287 -0
  106. package/src/services/PlanService.js +468 -0
  107. package/src/services/ProjectService.js +1366 -0
  108. package/src/services/PullRequestService.js +537 -0
  109. package/src/services/ScreenshotService.js +258 -0
  110. package/src/services/SubscriptionService.js +425 -0
  111. package/src/services/TrackingService.js +853 -0
  112. package/src/services/WaitlistService.js +130 -0
  113. package/src/services/index.js +80 -13
  114. package/src/services/tests/BranchService/createBranch.test.js +153 -0
  115. package/src/services/tests/BranchService/deleteBranch.test.js +173 -0
  116. package/src/services/tests/BranchService/getBranchChanges.test.js +146 -0
  117. package/src/services/tests/BranchService/listBranches.test.js +87 -0
  118. package/src/services/tests/BranchService/mergeBranch.test.js +210 -0
  119. package/src/services/tests/BranchService/publishVersion.test.js +183 -0
  120. package/src/services/tests/BranchService/renameBranch.test.js +240 -0
  121. package/src/services/tests/BranchService/resetBranch.test.js +152 -0
  122. package/src/services/tests/FeatureFlagService/adminFeatureFlags.test.js +67 -0
  123. package/src/services/tests/FeatureFlagService/getFeatureFlags.test.js +75 -0
  124. package/src/services/tests/FileService/createFileFormData.test.js +74 -0
  125. package/src/services/tests/FileService/getFileUrl.test.js +69 -0
  126. package/src/services/tests/FileService/updateProjectIcon.test.js +109 -0
  127. package/src/services/tests/FileService/uploadDocument.test.js +36 -0
  128. package/src/services/tests/FileService/uploadFile.test.js +78 -0
  129. package/src/services/tests/FileService/uploadFileWithValidation.test.js +114 -0
  130. package/src/services/tests/FileService/uploadImage.test.js +36 -0
  131. package/src/services/tests/FileService/uploadMultipleFiles.test.js +111 -0
  132. package/src/services/tests/FileService/validateFile.test.js +63 -0
  133. package/src/services/tests/PlanService/createPlan.test.js +104 -0
  134. package/src/services/tests/PlanService/createPlanWithValidation.test.js +523 -0
  135. package/src/services/tests/PlanService/deletePlan.test.js +92 -0
  136. package/src/services/tests/PlanService/getActivePlans.test.js +123 -0
  137. package/src/services/tests/PlanService/getAdminPlans.test.js +84 -0
  138. package/src/services/tests/PlanService/getPlan.test.js +50 -0
  139. package/src/services/tests/PlanService/getPlanByKey.test.js +109 -0
  140. package/src/services/tests/PlanService/getPlanWithValidation.test.js +85 -0
  141. package/src/services/tests/PlanService/getPlans.test.js +53 -0
  142. package/src/services/tests/PlanService/getPlansByPriceRange.test.js +109 -0
  143. package/src/services/tests/PlanService/getPlansWithValidation.test.js +48 -0
  144. package/src/services/tests/PlanService/initializePlans.test.js +75 -0
  145. package/src/services/tests/PlanService/updatePlan.test.js +111 -0
  146. package/src/services/tests/PlanService/updatePlanWithValidation.test.js +556 -0
  147. package/src/state/RootStateManager.js +76 -0
  148. package/src/state/rootEventBus.js +67 -0
  149. package/src/utils/CollabClient.js +248 -0
  150. package/src/utils/TokenManager.js +88 -33
  151. package/src/utils/changePreprocessor.js +239 -0
  152. package/src/utils/jsonDiff.js +144 -0
  153. package/src/utils/ordering.js +271 -0
  154. package/src/utils/services.js +326 -107
  155. package/src/utils/validation.js +0 -3
  156. package/dist/cjs/services/AIService.js +0 -155
  157. package/dist/cjs/services/BasedService.js +0 -1185
  158. package/dist/cjs/services/CoreService.js +0 -1751
  159. package/dist/cjs/services/SocketIOService.js +0 -307
  160. package/dist/cjs/services/SocketService.js +0 -161
  161. package/dist/cjs/services/SymstoryService.js +0 -571
  162. package/dist/cjs/utils/basedQuerys.js +0 -181
  163. package/dist/cjs/utils/symstoryClient.js +0 -259
  164. package/dist/esm/services/AIService.js +0 -185
  165. package/dist/esm/services/BasedService.js +0 -5278
  166. package/dist/esm/services/CoreService.js +0 -2264
  167. package/dist/esm/services/SocketIOService.js +0 -470
  168. package/dist/esm/services/SocketService.js +0 -191
  169. package/dist/esm/services/SymstoryService.js +0 -7041
  170. package/dist/esm/utils/basedQuerys.js +0 -163
  171. package/dist/esm/utils/symstoryClient.js +0 -370
  172. package/dist/node/services/AIService.js +0 -136
  173. package/dist/node/services/BasedService.js +0 -1156
  174. package/dist/node/services/CoreService.js +0 -1722
  175. package/dist/node/services/SocketIOService.js +0 -278
  176. package/dist/node/services/SocketService.js +0 -142
  177. package/dist/node/services/SymstoryService.js +0 -542
  178. package/dist/node/utils/basedQuerys.js +0 -162
  179. package/dist/node/utils/symstoryClient.js +0 -230
  180. package/src/services/AIService.js +0 -150
  181. package/src/services/BasedService.js +0 -1301
  182. package/src/services/CoreService.js +0 -1943
  183. package/src/services/SocketIOService.js +0 -334
  184. package/src/services/SocketService.js +0 -168
  185. package/src/services/SymstoryService.js +0 -649
  186. package/src/utils/basedQuerys.js +0 -164
  187. package/src/utils/symstoryClient.js +0 -252
@@ -0,0 +1,123 @@
1
+ /* eslint-disable no-undefined */
2
+ import test from 'tape'
3
+ import sinon from 'sinon'
4
+ import { PlanService } from '../../PlanService.js'
5
+
6
+ // #region Setup
7
+ const sandbox = sinon.createSandbox()
8
+ // #endregion
9
+
10
+ // #region Tests
11
+ test('getActivePlans should return active plans', async t => {
12
+ t.plan(3)
13
+ const numActivePlans = 2
14
+ const plansStub = [
15
+ {
16
+ plan: 'plan1',
17
+ status: 'active',
18
+ isVisible: true
19
+ },
20
+ {
21
+ plan: 'plan2',
22
+ status: 'inactive',
23
+ isVisible: false
24
+ },
25
+ {
26
+ plan: 'plan3',
27
+ status: 'active',
28
+ isVisible: true
29
+ }
30
+ ]
31
+ const planServiceStub = new PlanService()
32
+ sandbox.stub(planServiceStub, 'getPlans').resolves(plansStub)
33
+ const response = await planServiceStub.getActivePlans()
34
+
35
+ t.equal(
36
+ response.length,
37
+ numActivePlans,
38
+ 'Correct number of active plans returned'
39
+ )
40
+ t.equal(
41
+ response[0].plan,
42
+ plansStub[0].plan,
43
+ 'First plan successfully returned'
44
+ )
45
+ t.equal(
46
+ response[1].plan,
47
+ plansStub[2].plan,
48
+ 'Third plan successfully returned'
49
+ )
50
+ })
51
+
52
+ function planFilter () {
53
+ const badPlans = [
54
+ {
55
+ plan: 'status is inactive and isVisible is false',
56
+ status: 'inactive',
57
+ isVisible: false
58
+ },
59
+ {
60
+ plan: 'status is active and isVisible is false',
61
+ status: 'active',
62
+ isVisible: false
63
+ },
64
+ {
65
+ plan: 'status is undefined and isVisible is true',
66
+ status: undefined,
67
+ isVisible: true
68
+ },
69
+ {
70
+ plan: 'status is undefined and isVisible is false',
71
+ status: undefined,
72
+ isVisible: false
73
+ },
74
+ {
75
+ plan: 'status is null and isVisible is true',
76
+ status: null,
77
+ isVisible: true
78
+ },
79
+ {
80
+ plan: 'status is null and isVisible is false',
81
+ status: null,
82
+ isVisible: false
83
+ },
84
+ {
85
+ plan: 'status is active and isVisible is undefined',
86
+ status: 'active',
87
+ isVisible: undefined
88
+ },
89
+ {
90
+ plan: 'status is active and isVisible is null',
91
+ status: 'active',
92
+ isVisible: null
93
+ },
94
+ {
95
+ plan: 'status is a number and isVisible is true',
96
+ status: 123,
97
+ isVisible: true
98
+ }
99
+ ]
100
+ for (let ii = 0; ii < badPlans.length; ii++) {
101
+ test(`getActivePlans should return no plans using ${badPlans[ii].plan}`, async t => {
102
+ t.plan(1)
103
+ const planServiceStub = new PlanService()
104
+ sandbox.stub(planServiceStub, 'getPlans').resolves([badPlans[ii]])
105
+ const response = await planServiceStub.getActivePlans()
106
+ t.equal(
107
+ response.length,
108
+ 0,
109
+ `No active plans returned when ${badPlans[ii].plan}`
110
+ )
111
+ })
112
+ }
113
+ }
114
+
115
+ planFilter()
116
+ // #endregion
117
+
118
+ // #region Cleanup
119
+ test('teardown', t => {
120
+ sandbox.restore()
121
+ t.end()
122
+ })
123
+ // #endregion
@@ -0,0 +1,84 @@
1
+ import test from 'tape'
2
+ import sinon from 'sinon'
3
+ import { PlanService } from '../../PlanService.js'
4
+
5
+ // #region Setup
6
+ const sandbox = sinon.createSandbox()
7
+ // #endregion
8
+
9
+ // #region Tests
10
+ test('getAdminPlans should return response data', async t => {
11
+ t.plan(1)
12
+ const responseStub = {
13
+ success: true,
14
+ data: sandbox.stub()
15
+ }
16
+ const planServiceStub = new PlanService()
17
+ sandbox.stub(planServiceStub, '_request').resolves(responseStub)
18
+ sandbox.stub(planServiceStub, '_requireReady').resolves()
19
+ const response = await planServiceStub.getAdminPlans()
20
+ t.equal(response, responseStub.data, 'Response data returned')
21
+
22
+ sandbox.restore()
23
+ t.end()
24
+ })
25
+
26
+ test('getAdminPlans should return an error', async t => {
27
+ t.plan(1)
28
+ const responseStub = {
29
+ success: false,
30
+ data: sandbox.stub(),
31
+ message: 'Negative getAdminPlans Test'
32
+ }
33
+ const planServiceStub = new PlanService()
34
+ sandbox.stub(planServiceStub, '_request').resolves(responseStub)
35
+ sandbox.stub(planServiceStub, '_requireReady').resolves()
36
+
37
+ try {
38
+ await planServiceStub.getAdminPlans()
39
+ } catch (err) {
40
+ t.ok(
41
+ err
42
+ .toString()
43
+ .includes(`Failed to get admin plans: ${responseStub.message}`),
44
+ 'Error correctly returned'
45
+ )
46
+ }
47
+ sandbox.restore()
48
+ t.end()
49
+ })
50
+
51
+ test('getAdminPlans should fail the requireReady', async t => {
52
+ t.plan(1)
53
+ const responseStub = {
54
+ success: false,
55
+ data: sandbox.stub(),
56
+ message: 'Service not initialized for method: getAdminPlans'
57
+ }
58
+ const planServiceStub = new PlanService()
59
+ sandbox.stub(planServiceStub, '_request').resolves(responseStub)
60
+ sandbox
61
+ .stub(planServiceStub, '_requireReady')
62
+ .throws(() => new Error(responseStub.message))
63
+
64
+ try {
65
+ await planServiceStub.getAdminPlans()
66
+ t.fail('getAdminPlans should have failed')
67
+ } catch (err) {
68
+ t.equal(
69
+ err.toString(),
70
+ `Error: ${responseStub.message}`,
71
+ 'Error correctly returned'
72
+ )
73
+ }
74
+ sandbox.restore()
75
+ t.end()
76
+ })
77
+ // #endregion
78
+
79
+ // #region Cleanup
80
+ test('teardown', t => {
81
+ sandbox.restore()
82
+ t.end()
83
+ })
84
+ // #endregion
@@ -0,0 +1,50 @@
1
+ import test from 'tape'
2
+ import sinon from 'sinon'
3
+ import { PlanService } from '../../PlanService.js'
4
+
5
+ // #region Setup
6
+ const sandbox = sinon.createSandbox()
7
+ // #endregion
8
+
9
+ // #region Tests
10
+ test('getPlan should return response data', async t => {
11
+ t.plan(1)
12
+ const responseStub = {
13
+ success: true,
14
+ data: sandbox.stub()
15
+ }
16
+ const planServiceStub = new PlanService()
17
+ sandbox.stub(planServiceStub, '_request').resolves(responseStub)
18
+ const response = await planServiceStub.getPlan(true)
19
+ t.equal(response, responseStub.data, 'Response data returned')
20
+
21
+ sandbox.restore()
22
+ t.end()
23
+ })
24
+
25
+ test('getPlan should return an error', async t => {
26
+ t.plan(1)
27
+ const responseStub = {
28
+ success: false,
29
+ data: sandbox.stub(),
30
+ message: 'Error: Plan ID is required'
31
+ }
32
+ const planServiceStub = new PlanService()
33
+ sandbox.stub(planServiceStub, '_request').resolves(responseStub)
34
+
35
+ try {
36
+ await planServiceStub.getPlan()
37
+ } catch (err) {
38
+ t.equal(err.toString(), responseStub.message, 'Error correctly returned')
39
+ }
40
+ sandbox.restore()
41
+ t.end()
42
+ })
43
+ // #endregion
44
+
45
+ // #region Cleanup
46
+ test('teardown', t => {
47
+ sandbox.restore()
48
+ t.end()
49
+ })
50
+ // #endregion
@@ -0,0 +1,109 @@
1
+ /* eslint-disable no-undefined */
2
+ import test from 'tape'
3
+ import sinon from 'sinon'
4
+ import { PlanService } from '../../PlanService.js'
5
+
6
+ // #region Setup
7
+ const sandbox = sinon.createSandbox()
8
+ // #endregion
9
+
10
+ // #region Tests
11
+ test('getPlanByKey should return response data', async t => {
12
+ t.plan(1)
13
+ const responseStub = {
14
+ key: 'test123'
15
+ }
16
+ const planServiceStub = new PlanService()
17
+ sandbox.stub(planServiceStub, 'getPlans').resolves([responseStub])
18
+ const response = await planServiceStub.getPlanByKey('test123')
19
+ t.equal(response.key, responseStub.key, 'Response data matches stubbed data')
20
+ sandbox.restore()
21
+ t.end()
22
+ })
23
+
24
+ test('getPlanByKey should return a key not found error', async t => {
25
+ t.plan(1)
26
+ const responseStub = {
27
+ key: 'test123'
28
+ }
29
+ const planServiceStub = new PlanService()
30
+ sandbox.stub(planServiceStub, 'getPlans').resolves([responseStub])
31
+ try {
32
+ await planServiceStub.getPlanByKey('wrongKey123')
33
+ t.fail('getPlanByKey key validation successfully threw an error')
34
+ } catch (err) {
35
+ t.equal(
36
+ err.toString(),
37
+ "Error: Failed to get plan by key: Plan with key 'wrongKey123' not found",
38
+ 'Plan key not found validation successfully threw an error for a wrong key entered.'
39
+ )
40
+ }
41
+ sandbox.restore()
42
+ t.end()
43
+ })
44
+
45
+ test('getPlanByKey error handling catches and returns an error', async t => {
46
+ t.plan(1)
47
+ const planServiceStub = new PlanService()
48
+ sandbox.stub(planServiceStub, 'getPlans').throws('Test Error')
49
+ try {
50
+ await planServiceStub.getPlanByKey('test123')
51
+ } catch (err) {
52
+ t.equal(
53
+ err.toString(),
54
+ 'Error: Failed to get plan by key: Sinon-provided Test Error',
55
+ 'Error handling caught and returned the correct error.'
56
+ )
57
+ }
58
+ sandbox.restore()
59
+ t.end()
60
+ })
61
+
62
+ function checkPlanKeyIsRequired () {
63
+ const badPlanKeys = [
64
+ {
65
+ name: 'an undefined value',
66
+ key: undefined
67
+ },
68
+ {
69
+ name: 'a null',
70
+ key: null
71
+ },
72
+ {
73
+ name: 'an empty string',
74
+ key: ''
75
+ }
76
+ ]
77
+ for (let ii = 0; ii < badPlanKeys.length; ii++) {
78
+ test(`getPlanByKey should demand a Plan key when the key entered is ${badPlanKeys[ii].name}`, async t => {
79
+ t.plan(1)
80
+ const responseStub = {
81
+ key: 'test123'
82
+ }
83
+ const planServiceStub = new PlanService()
84
+ sandbox.stub(planServiceStub, 'getPlans').resolves([responseStub])
85
+ try {
86
+ await planServiceStub.getPlanByKey(badPlanKeys[ii].key)
87
+ t.fail('getPlanByKey key validation successfully threw an error')
88
+ } catch (err) {
89
+ t.equal(
90
+ err.toString(),
91
+ 'Error: Plan key is required',
92
+ `Key requirement validation successfully threw an error when ${badPlanKeys[ii].name} key is entered.`
93
+ )
94
+ }
95
+ sandbox.restore()
96
+ t.end()
97
+ })
98
+ }
99
+ }
100
+
101
+ checkPlanKeyIsRequired()
102
+ // #endregion
103
+
104
+ // #region Cleanup
105
+ test('teardown', t => {
106
+ sandbox.restore()
107
+ t.end()
108
+ })
109
+ // #endregion
@@ -0,0 +1,85 @@
1
+ /* eslint-disable no-undefined */
2
+ import test from 'tape'
3
+ import sinon from 'sinon'
4
+ import { PlanService } from '../../PlanService.js'
5
+
6
+ // #region Setup
7
+ const sandbox = sinon.createSandbox()
8
+ // #endregion
9
+
10
+ // #region Tests
11
+ test('getPlanWithValidation should return response data', async t => {
12
+ t.plan(1)
13
+ const responseStub = [sandbox.stub()]
14
+ const planServiceStub = new PlanService()
15
+ sandbox.stub(planServiceStub, 'getPlan').resolves(responseStub)
16
+ const response = await planServiceStub.getPlanWithValidation(
17
+ 'Plan ID Test String'
18
+ )
19
+ t.equal(response, responseStub, 'Response data returned')
20
+
21
+ sandbox.restore()
22
+ t.end()
23
+ })
24
+
25
+ test('getPlanWithValidation should return an error - null causes Invalid plan data received', async t => {
26
+ t.plan(1)
27
+ const responseStub = null
28
+ const planServiceStub = new PlanService()
29
+ sandbox.stub(planServiceStub, 'getPlan').resolves(responseStub)
30
+
31
+ try {
32
+ await planServiceStub.getPlanWithValidation('Plan ID Test String')
33
+ } catch (err) {
34
+ t.ok(
35
+ err.toString().includes('Invalid plan data received'),
36
+ 'Error correctly returned'
37
+ )
38
+ }
39
+ sandbox.restore()
40
+ t.end()
41
+ })
42
+
43
+ test('getPlanWithValidation should return an error - string causes Invalid plan data received', async t => {
44
+ t.plan(1)
45
+ const responseStub = 'Not an object'
46
+ const planServiceStub = new PlanService()
47
+ sandbox.stub(planServiceStub, 'getPlan').resolves(responseStub)
48
+
49
+ try {
50
+ await planServiceStub.getPlanWithValidation('Plan ID Test String')
51
+ } catch (err) {
52
+ t.ok(
53
+ err.toString().includes('Invalid plan data received'),
54
+ 'Error correctly returned'
55
+ )
56
+ }
57
+ sandbox.restore()
58
+ t.end()
59
+ })
60
+
61
+ test('getPlanWithValidation should return an error - Plan ID must be a valid string', async t => {
62
+ t.plan(1)
63
+ const responseStub = null
64
+ const planServiceStub = new PlanService()
65
+ sandbox.stub(planServiceStub, 'getPlan').resolves(responseStub)
66
+
67
+ try {
68
+ await planServiceStub.getPlanWithValidation(undefined)
69
+ } catch (err) {
70
+ t.ok(
71
+ err.toString().includes('Plan ID must be a valid string'),
72
+ 'Error correctly returned'
73
+ )
74
+ }
75
+ sandbox.restore()
76
+ t.end()
77
+ })
78
+ // #endregion
79
+
80
+ // #region Cleanup
81
+ test('teardown', t => {
82
+ sandbox.restore()
83
+ t.end()
84
+ })
85
+ // #endregion
@@ -0,0 +1,53 @@
1
+ import test from 'tape'
2
+ import sinon from 'sinon'
3
+ import { PlanService } from '../../PlanService.js'
4
+
5
+ // #region Setup
6
+ const sandbox = sinon.createSandbox()
7
+ // #endregion
8
+
9
+ // #region Tests
10
+ test('getPlans should return response data', async t => {
11
+ t.plan(1)
12
+ const responseStub = {
13
+ success: true,
14
+ data: sandbox.stub()
15
+ }
16
+ const planServiceStub = new PlanService()
17
+ sandbox.stub(planServiceStub, '_request').resolves(responseStub)
18
+ const response = await planServiceStub.getPlans()
19
+ t.equal(response, responseStub.data, 'Response data returned')
20
+
21
+ sandbox.restore()
22
+ t.end()
23
+ })
24
+
25
+ test('getPlans should return an error', async t => {
26
+ t.plan(1)
27
+ const responseStub = {
28
+ success: false,
29
+ data: sandbox.stub(),
30
+ message: 'Negative getPlans Test'
31
+ }
32
+ const planServiceStub = new PlanService()
33
+ sandbox.stub(planServiceStub, '_request').resolves(responseStub)
34
+
35
+ try {
36
+ await planServiceStub.getPlans()
37
+ } catch (err) {
38
+ t.ok(
39
+ err.toString().includes(`Failed to get plans: ${responseStub.message}`),
40
+ 'Error correctly returned'
41
+ )
42
+ }
43
+ sandbox.restore()
44
+ t.end()
45
+ })
46
+ // #endregion
47
+
48
+ // #region Cleanup
49
+ test('teardown', t => {
50
+ sandbox.restore()
51
+ t.end()
52
+ })
53
+ // #endregion
@@ -0,0 +1,109 @@
1
+ /* eslint-disable no-undefined */
2
+ import test from 'tape'
3
+ import sinon from 'sinon'
4
+ import { PlanService } from '../../PlanService.js'
5
+
6
+ // #region Setup
7
+ const sandbox = sinon.createSandbox()
8
+ // #endregion
9
+
10
+ // #region Tests
11
+ test('getPlans should return response data', async t => {
12
+ t.plan(1)
13
+ const responseStub = {
14
+ pricing: {
15
+ bestPrice: {
16
+ amount: 1
17
+ }
18
+ }
19
+ }
20
+ const planServiceStub = new PlanService()
21
+ sandbox.stub(planServiceStub, 'getPlansWithPricing').resolves([responseStub])
22
+ const response = await planServiceStub.getPlansByPriceRange()
23
+ t.equal(
24
+ response[0].pricing.bestPrice.amount,
25
+ responseStub.pricing.bestPrice.amount,
26
+ 'Response data matches stubbed data'
27
+ )
28
+ sandbox.restore()
29
+ t.end()
30
+ })
31
+
32
+ function noPricingAmount () {
33
+ const noPriceAmounts = [
34
+ {
35
+ name: 'undefined',
36
+ amount: undefined
37
+ },
38
+ {
39
+ name: 'null',
40
+ amount: null
41
+ },
42
+ {
43
+ name: 'less than the minimum',
44
+ amount: 1
45
+ },
46
+ {
47
+ name: 'more than the maximum',
48
+ amount: 20
49
+ },
50
+ {
51
+ name: 'a string',
52
+ amount: 'test string'
53
+ },
54
+ {
55
+ name: 'an object',
56
+ amount: {}
57
+ }
58
+ ]
59
+ for (let ii = 0; ii < noPriceAmounts.length; ii++) {
60
+ test(`getPlansWithPricing should return an empty response when the amount entered is ${noPriceAmounts[ii].name}`, async t => {
61
+ t.plan(1)
62
+ const responseStub = {
63
+ pricing: {
64
+ bestPrice: {}
65
+ }
66
+ }
67
+ responseStub.pricing.bestPrice.amount = noPriceAmounts[ii].amount
68
+ const planServiceStub = new PlanService()
69
+ sandbox
70
+ .stub(planServiceStub, 'getPlansWithPricing')
71
+ .resolves([responseStub])
72
+ const response = await planServiceStub.getPlansByPriceRange(5, 10)
73
+ t.equal(
74
+ response.length,
75
+ 0,
76
+ `Response is an empty array when entered amount is: ${responseStub.pricing.bestPrice.amount}`
77
+ )
78
+ sandbox.restore()
79
+ t.end()
80
+ })
81
+ }
82
+ }
83
+
84
+ test('getPlans should return an error', async t => {
85
+ t.plan(1)
86
+ const planServiceStub = new PlanService()
87
+ sandbox.stub(planServiceStub, 'getPlansWithPricing').throws('Test Error')
88
+ try {
89
+ await planServiceStub.getPlansByPriceRange()
90
+ } catch (err) {
91
+ t.equal(
92
+ err.toString(),
93
+ 'Error: Failed to get plans by price range: Sinon-provided Test Error',
94
+ 'Error caught and correctly returned'
95
+ )
96
+ }
97
+ sandbox.restore()
98
+ t.end()
99
+ })
100
+
101
+ noPricingAmount()
102
+ // #endregion
103
+
104
+ // #region Cleanup
105
+ test('teardown', t => {
106
+ sandbox.restore()
107
+ t.end()
108
+ })
109
+ // #endregion
@@ -0,0 +1,48 @@
1
+ import test from 'tape'
2
+ import sinon from 'sinon'
3
+ import { PlanService } from '../../PlanService.js'
4
+
5
+ // #region Setup
6
+ const sandbox = sinon.createSandbox()
7
+ // #endregion
8
+
9
+ // #region Tests
10
+ test('getPlansWithValidation should return response data', async t => {
11
+ t.plan(1)
12
+ const responseStub = [sandbox.stub()]
13
+ const planServiceStub = new PlanService()
14
+ sandbox.stub(planServiceStub, 'getPlans').resolves(responseStub)
15
+ const response = await planServiceStub.getPlansWithValidation()
16
+ t.equal(response, responseStub, 'Response data returned')
17
+
18
+ sandbox.restore()
19
+ t.end()
20
+ })
21
+
22
+ test('getPlansWithValidation should return an error - plans should be an array', async t => {
23
+ t.plan(1)
24
+ const responseStub = null
25
+ const planServiceStub = new PlanService()
26
+ sandbox.stub(planServiceStub, 'getPlans').resolves(responseStub)
27
+
28
+ try {
29
+ await planServiceStub.getPlansWithValidation()
30
+ } catch (err) {
31
+ t.ok(
32
+ err
33
+ .toString()
34
+ .includes('Invalid response format: plans should be an array'),
35
+ 'Error correctly returned'
36
+ )
37
+ }
38
+ sandbox.restore()
39
+ t.end()
40
+ })
41
+ // #endregion
42
+
43
+ // #region Cleanup
44
+ test('teardown', t => {
45
+ sandbox.restore()
46
+ t.end()
47
+ })
48
+ // #endregion