@symbo.ls/sdk 3.2.3 → 3.2.7

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 (183) hide show
  1. package/README.md +141 -0
  2. package/dist/cjs/config/environment.js +94 -10
  3. package/dist/cjs/index.js +152 -12
  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 +439 -116
  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 +60 -4
  23. package/dist/cjs/state/RootStateManager.js +2 -23
  24. package/dist/cjs/state/rootEventBus.js +9 -0
  25. package/dist/cjs/utils/CollabClient.js +78 -12
  26. package/dist/cjs/utils/TokenManager.js +16 -3
  27. package/dist/cjs/utils/changePreprocessor.js +199 -0
  28. package/dist/cjs/utils/jsonDiff.js +46 -4
  29. package/dist/cjs/utils/ordering.js +309 -0
  30. package/dist/cjs/utils/services.js +285 -128
  31. package/dist/cjs/utils/validation.js +0 -3
  32. package/dist/esm/config/environment.js +94 -10
  33. package/dist/esm/index.js +47862 -18248
  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 +24956 -16089
  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 +47373 -18027
  53. package/dist/esm/state/RootStateManager.js +11 -23
  54. package/dist/esm/state/rootEventBus.js +9 -0
  55. package/dist/esm/utils/CollabClient.js +17526 -16120
  56. package/dist/esm/utils/TokenManager.js +16 -3
  57. package/dist/esm/utils/changePreprocessor.js +542 -0
  58. package/dist/esm/utils/jsonDiff.js +958 -43
  59. package/dist/esm/utils/ordering.js +291 -0
  60. package/dist/esm/utils/services.js +285 -128
  61. package/dist/esm/utils/validation.js +116 -50
  62. package/dist/node/config/environment.js +94 -10
  63. package/dist/node/index.js +183 -16
  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 +439 -116
  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 +60 -4
  83. package/dist/node/state/RootStateManager.js +2 -23
  84. package/dist/node/state/rootEventBus.js +9 -0
  85. package/dist/node/utils/CollabClient.js +77 -11
  86. package/dist/node/utils/TokenManager.js +16 -3
  87. package/dist/node/utils/changePreprocessor.js +180 -0
  88. package/dist/node/utils/jsonDiff.js +46 -4
  89. package/dist/node/utils/ordering.js +290 -0
  90. package/dist/node/utils/services.js +285 -128
  91. package/dist/node/utils/validation.js +0 -3
  92. package/package.json +30 -18
  93. package/src/config/environment.js +95 -10
  94. package/src/index.js +190 -23
  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 +557 -148
  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 +79 -5
  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 +37 -32
  148. package/src/state/rootEventBus.js +19 -0
  149. package/src/utils/CollabClient.js +99 -12
  150. package/src/utils/TokenManager.js +20 -3
  151. package/src/utils/changePreprocessor.js +239 -0
  152. package/src/utils/jsonDiff.js +40 -5
  153. package/src/utils/ordering.js +271 -0
  154. package/src/utils/services.js +306 -139
  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 -2295
  159. package/dist/cjs/services/SocketService.js +0 -309
  160. package/dist/cjs/services/SymstoryService.js +0 -571
  161. package/dist/cjs/utils/basedQuerys.js +0 -181
  162. package/dist/cjs/utils/symstoryClient.js +0 -259
  163. package/dist/esm/services/AIService.js +0 -185
  164. package/dist/esm/services/BasedService.js +0 -5262
  165. package/dist/esm/services/CoreService.js +0 -2827
  166. package/dist/esm/services/SocketService.js +0 -456
  167. package/dist/esm/services/SymstoryService.js +0 -7025
  168. package/dist/esm/utils/basedQuerys.js +0 -163
  169. package/dist/esm/utils/symstoryClient.js +0 -354
  170. package/dist/node/services/AIService.js +0 -136
  171. package/dist/node/services/BasedService.js +0 -1156
  172. package/dist/node/services/CoreService.js +0 -2266
  173. package/dist/node/services/SocketService.js +0 -280
  174. package/dist/node/services/SymstoryService.js +0 -542
  175. package/dist/node/utils/basedQuerys.js +0 -162
  176. package/dist/node/utils/symstoryClient.js +0 -230
  177. package/src/services/AIService.js +0 -150
  178. package/src/services/BasedService.js +0 -1302
  179. package/src/services/CoreService.js +0 -2548
  180. package/src/services/SocketService.js +0 -336
  181. package/src/services/SymstoryService.js +0 -649
  182. package/src/utils/basedQuerys.js +0 -164
  183. 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