@labdigital/commercetools-mock 0.9.1 → 0.10.1

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 (108) hide show
  1. package/README.md +8 -0
  2. package/dist/index.d.ts +354 -188
  3. package/dist/index.global.js +2346 -2209
  4. package/dist/index.global.js.map +1 -1
  5. package/dist/index.js +1968 -1829
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +2171 -2032
  8. package/dist/index.mjs.map +1 -1
  9. package/package.json +30 -21
  10. package/src/constants.ts +4 -2
  11. package/src/ctMock.ts +27 -86
  12. package/src/helpers.ts +10 -11
  13. package/src/index.test.ts +1 -1
  14. package/src/lib/haversine.ts +2 -2
  15. package/src/lib/masking.ts +3 -1
  16. package/src/lib/predicateParser.ts +93 -92
  17. package/src/lib/projectionSearchFilter.test.ts +28 -36
  18. package/src/lib/projectionSearchFilter.ts +88 -103
  19. package/src/oauth/store.ts +3 -3
  20. package/src/priceSelector.test.ts +16 -35
  21. package/src/priceSelector.ts +6 -9
  22. package/src/product-projection-search.ts +49 -57
  23. package/src/projectAPI.test.ts +7 -0
  24. package/src/projectAPI.ts +17 -22
  25. package/src/repositories/abstract.ts +102 -51
  26. package/src/repositories/cart-discount.ts +4 -5
  27. package/src/repositories/cart.ts +56 -46
  28. package/src/repositories/category.ts +23 -26
  29. package/src/repositories/channel.ts +5 -6
  30. package/src/repositories/custom-object.ts +41 -32
  31. package/src/repositories/customer-group.ts +4 -5
  32. package/src/repositories/customer.ts +42 -5
  33. package/src/repositories/discount-code.ts +5 -6
  34. package/src/repositories/errors.ts +10 -14
  35. package/src/repositories/extension.ts +16 -15
  36. package/src/repositories/helpers.ts +10 -15
  37. package/src/repositories/index.ts +75 -0
  38. package/src/repositories/inventory-entry.ts +5 -6
  39. package/src/repositories/my-order.ts +2 -2
  40. package/src/repositories/order-edit.ts +39 -0
  41. package/src/repositories/order.test.ts +16 -11
  42. package/src/repositories/order.ts +21 -14
  43. package/src/repositories/payment.ts +9 -10
  44. package/src/repositories/product-discount.ts +5 -25
  45. package/src/repositories/product-projection.ts +12 -5
  46. package/src/repositories/product-selection.ts +40 -0
  47. package/src/repositories/product-type.ts +38 -60
  48. package/src/repositories/product.ts +128 -85
  49. package/src/repositories/project.ts +16 -33
  50. package/src/repositories/quote-request.ts +28 -0
  51. package/src/repositories/quote.ts +28 -0
  52. package/src/repositories/review.ts +34 -0
  53. package/src/repositories/shipping-method.ts +25 -28
  54. package/src/repositories/shopping-list.ts +6 -6
  55. package/src/repositories/staged-quote.ts +29 -0
  56. package/src/repositories/standalone-price.ts +36 -0
  57. package/src/repositories/state.ts +16 -17
  58. package/src/repositories/store.ts +13 -29
  59. package/src/repositories/subscription.ts +4 -5
  60. package/src/repositories/tax-category.ts +9 -26
  61. package/src/repositories/type.ts +24 -27
  62. package/src/repositories/zone.ts +9 -11
  63. package/src/server.ts +5 -0
  64. package/src/services/abstract.ts +43 -12
  65. package/src/services/cart-discount.ts +3 -4
  66. package/src/services/cart.test.ts +9 -11
  67. package/src/services/cart.ts +42 -38
  68. package/src/services/category.test.ts +1 -2
  69. package/src/services/category.ts +3 -4
  70. package/src/services/channel.ts +3 -4
  71. package/src/services/custom-object.test.ts +6 -6
  72. package/src/services/custom-object.ts +4 -5
  73. package/src/services/customer-group.ts +3 -4
  74. package/src/services/customer.test.ts +136 -0
  75. package/src/services/customer.ts +5 -6
  76. package/src/services/discount-code.ts +3 -4
  77. package/src/services/extension.ts +3 -4
  78. package/src/services/index.ts +74 -0
  79. package/src/services/inventory-entry.test.ts +9 -13
  80. package/src/services/inventory-entry.ts +3 -4
  81. package/src/services/my-cart.test.ts +2 -0
  82. package/src/services/my-cart.ts +4 -5
  83. package/src/services/my-customer.ts +3 -4
  84. package/src/services/my-order.ts +4 -5
  85. package/src/services/my-payment.ts +3 -4
  86. package/src/services/order.test.ts +28 -26
  87. package/src/services/order.ts +4 -5
  88. package/src/services/payment.ts +3 -4
  89. package/src/services/product-discount.ts +3 -20
  90. package/src/services/product-projection.test.ts +76 -8
  91. package/src/services/product-projection.ts +4 -5
  92. package/src/services/product-type.ts +3 -20
  93. package/src/services/product.test.ts +200 -90
  94. package/src/services/product.ts +3 -4
  95. package/src/services/project.ts +5 -6
  96. package/src/services/shipping-method.ts +3 -4
  97. package/src/services/shopping-list.ts +3 -4
  98. package/src/services/state.ts +3 -4
  99. package/src/services/store.test.ts +11 -2
  100. package/src/services/store.ts +4 -21
  101. package/src/services/subscription.ts +3 -4
  102. package/src/services/tax-category.ts +3 -20
  103. package/src/services/type.ts +3 -4
  104. package/src/services/zone.ts +3 -4
  105. package/src/storage/abstract.ts +82 -0
  106. package/src/{storage.ts → storage/in-memory.ts} +79 -147
  107. package/src/storage/index.ts +2 -0
  108. package/src/types.ts +52 -83
@@ -1,12 +1,12 @@
1
1
  import { Update } from '@commercetools/platform-sdk'
2
- import { ParsedQs } from 'qs'
3
2
  import { Request, Response, Router } from 'express'
3
+ import { ParsedQs } from 'qs'
4
4
  import { AbstractResourceRepository } from '../repositories/abstract'
5
5
  import { getRepositoryContext } from '../repositories/helpers'
6
6
 
7
7
  export default abstract class AbstractService {
8
8
  protected abstract getBasePath(): string
9
- public abstract repository: AbstractResourceRepository
9
+ public abstract repository: AbstractResourceRepository<any>
10
10
 
11
11
  createStatusCode = 201
12
12
 
@@ -27,8 +27,8 @@ export default abstract class AbstractService {
27
27
  router.get('/key=:key', this.getWithKey.bind(this)) // same thing goes for the key routes
28
28
  router.get('/:id', this.getWithId.bind(this))
29
29
 
30
- router.delete('/key=:key', this.deletewithKey.bind(this))
31
- router.delete('/:id', this.deletewithId.bind(this))
30
+ router.delete('/key=:key', this.deleteWithKey.bind(this))
31
+ router.delete('/:id', this.deleteWithId.bind(this))
32
32
 
33
33
  router.post('/', this.post.bind(this))
34
34
  router.post('/key=:key', this.postWithKey.bind(this))
@@ -68,7 +68,7 @@ export default abstract class AbstractService {
68
68
  return response.status(200).send(result)
69
69
  }
70
70
 
71
- deletewithId(request: Request, response: Response) {
71
+ deleteWithId(request: Request, response: Response) {
72
72
  const result = this.repository.delete(
73
73
  getRepositoryContext(request),
74
74
  request.params['id'],
@@ -82,8 +82,26 @@ export default abstract class AbstractService {
82
82
  return response.status(200).send(result)
83
83
  }
84
84
 
85
- deletewithKey(request: Request, response: Response) {
86
- return response.status(500).send('Not implemented')
85
+ deleteWithKey(request: Request, response: Response) {
86
+ const resource = this.repository.getByKey(
87
+ getRepositoryContext(request),
88
+ request.params['key']
89
+ )
90
+ if (!resource) {
91
+ return response.status(404).send('Not found')
92
+ }
93
+
94
+ const result = this.repository.delete(
95
+ getRepositoryContext(request),
96
+ resource.id,
97
+ {
98
+ expand: this._parseParam(request.query.expand),
99
+ }
100
+ )
101
+ if (!result) {
102
+ return response.status(404).send('Not found')
103
+ }
104
+ return response.status(200).send(result)
87
105
  }
88
106
 
89
107
  post(request: Request, response: Response) {
@@ -106,13 +124,10 @@ export default abstract class AbstractService {
106
124
  return response.status(404).send('Not found')
107
125
  }
108
126
 
109
- if (resource.version !== updateRequest.version) {
110
- return response.status(409).send('Concurrent modification')
111
- }
112
-
113
127
  const updatedResource = this.repository.processUpdateActions(
114
128
  getRepositoryContext(request),
115
129
  resource,
130
+ updateRequest.version,
116
131
  updateRequest.actions
117
132
  )
118
133
 
@@ -121,7 +136,23 @@ export default abstract class AbstractService {
121
136
  }
122
137
 
123
138
  postWithKey(request: Request, response: Response) {
124
- return response.status(500).send('Not implemented')
139
+ const updateRequest: Update = request.body
140
+ const resource = this.repository.getByKey(
141
+ getRepositoryContext(request),
142
+ request.params['key']
143
+ )
144
+ if (!resource) {
145
+ return response.status(404).send('Not found')
146
+ }
147
+ const updatedResource = this.repository.processUpdateActions(
148
+ getRepositoryContext(request),
149
+ resource,
150
+ updateRequest.version,
151
+ updateRequest.actions
152
+ )
153
+
154
+ const result = this._expandWithId(request, updatedResource.id)
155
+ return response.status(200).send(result)
125
156
  }
126
157
 
127
158
  protected _expandWithId(request: Request, resourceId: string) {
@@ -1,14 +1,13 @@
1
1
  import { Router } from 'express'
2
- import AbstractService from './abstract'
3
- import { AbstractStorage } from '../storage'
4
2
  import { CartDiscountRepository } from '../repositories/cart-discount'
3
+ import AbstractService from './abstract'
5
4
 
6
5
  export class CartDiscountService extends AbstractService {
7
6
  public repository: CartDiscountRepository
8
7
 
9
- constructor(parent: Router, storage: AbstractStorage) {
8
+ constructor(parent: Router, repository: CartDiscountRepository) {
10
9
  super(parent)
11
- this.repository = new CartDiscountRepository(storage)
10
+ this.repository = repository
12
11
  }
13
12
 
14
13
  getBasePath() {
@@ -4,9 +4,9 @@ import {
4
4
  CentPrecisionMoney,
5
5
  ProductDraft,
6
6
  } from '@commercetools/platform-sdk'
7
+ import assert from 'assert'
7
8
  import supertest from 'supertest'
8
9
  import { CommercetoolsMock } from '../index'
9
- import assert from 'assert'
10
10
 
11
11
  describe('Carts Query', () => {
12
12
  const ctMock = new CommercetoolsMock()
@@ -81,11 +81,9 @@ describe('Cart Update Actions', () => {
81
81
  let cart: Cart | undefined
82
82
 
83
83
  const createCart = async (currency: string) => {
84
- let response = await supertest(ctMock.app)
85
- .post('/dummy/carts')
86
- .send({
87
- currency,
88
- })
84
+ const response = await supertest(ctMock.app).post('/dummy/carts').send({
85
+ currency,
86
+ })
89
87
  expect(response.status).toBe(201)
90
88
  cart = response.body
91
89
  }
@@ -189,7 +187,7 @@ describe('Cart Update Actions', () => {
189
187
  const product = await supertest(ctMock.app)
190
188
  .post(`/dummy/products`)
191
189
  .send(productDraft)
192
- .then(x => x.body)
190
+ .then((x) => x.body)
193
191
 
194
192
  assert(cart, 'cart not created')
195
193
  assert(product, 'product not created')
@@ -216,7 +214,7 @@ describe('Cart Update Actions', () => {
216
214
  const product = await supertest(ctMock.app)
217
215
  .post(`/dummy/products`)
218
216
  .send(productDraft)
219
- .then(x => x.body)
217
+ .then((x) => x.body)
220
218
 
221
219
  assert(cart, 'cart not created')
222
220
  assert(product, 'product not created')
@@ -242,7 +240,7 @@ describe('Cart Update Actions', () => {
242
240
  const product = await supertest(ctMock.app)
243
241
  .post(`/dummy/products`)
244
242
  .send(productDraft)
245
- .then(x => x.body)
243
+ .then((x) => x.body)
246
244
 
247
245
  assert(cart, 'cart not created')
248
246
  assert(product, 'product not created')
@@ -277,7 +275,7 @@ describe('Cart Update Actions', () => {
277
275
  const product = await supertest(ctMock.app)
278
276
  .post(`/dummy/products`)
279
277
  .send(productDraft)
280
- .then(x => x.body)
278
+ .then((x) => x.body)
281
279
 
282
280
  assert(cart, 'cart not created')
283
281
  assert(product, 'product not created')
@@ -314,7 +312,7 @@ describe('Cart Update Actions', () => {
314
312
  const product = await supertest(ctMock.app)
315
313
  .post(`/dummy/products`)
316
314
  .send(productDraft)
317
- .then(x => x.body)
315
+ .then((x) => x.body)
318
316
 
319
317
  assert(cart, 'cart not created')
320
318
  assert(product, 'product not created')
@@ -1,19 +1,22 @@
1
- import AbstractService from './abstract'
2
- import { Router } from 'express'
3
- import { CartRepository } from '../repositories/cart'
4
- import { AbstractStorage } from '../storage'
5
1
  import { Cart, CartDraft, Order } from '@commercetools/platform-sdk'
6
- import { OrderRepository } from '../repositories/order'
2
+ import { Request, Response, Router } from 'express'
3
+ import { CartRepository } from '../repositories/cart'
7
4
  import { getRepositoryContext } from '../repositories/helpers'
5
+ import { OrderRepository } from '../repositories/order'
6
+ import AbstractService from './abstract'
8
7
 
9
8
  export class CartService extends AbstractService {
10
9
  public repository: CartRepository
11
10
  public orderRepository: OrderRepository
12
11
 
13
- constructor(parent: Router, storage: AbstractStorage) {
12
+ constructor(
13
+ parent: Router,
14
+ cartRepository: CartRepository,
15
+ orderRepository: OrderRepository
16
+ ) {
14
17
  super(parent)
15
- this.repository = new CartRepository(storage)
16
- this.orderRepository = new OrderRepository(storage)
18
+ this.repository = cartRepository
19
+ this.orderRepository = orderRepository
17
20
  }
18
21
 
19
22
  getBasePath() {
@@ -21,35 +24,36 @@ export class CartService extends AbstractService {
21
24
  }
22
25
 
23
26
  extraRoutes(parent: Router) {
24
- parent.post('/replicate', (request, response) => {
25
- const context = getRepositoryContext(request)
26
-
27
- // @ts-ignore
28
- const cartOrOrder: Cart | Order | null =
29
- request.body.reference.typeId === 'order'
30
- ? this.orderRepository.get(context, request.body.reference.id)
31
- : this.repository.get(context, request.body.reference.id)
32
-
33
- if (!cartOrOrder) {
34
- return response.status(400).send()
35
- }
36
-
37
- const cartDraft: CartDraft = {
38
- ...cartOrOrder,
39
- currency: cartOrOrder.totalPrice.currencyCode,
40
- discountCodes: [],
41
- lineItems: cartOrOrder.lineItems.map(lineItem => {
42
- return {
43
- ...lineItem,
44
- variantId: lineItem.variant.id,
45
- sku: lineItem.variant.sku,
46
- }
47
- }),
48
- }
49
-
50
- const newCart = this.repository.create(context, cartDraft)
51
-
52
- return response.status(200).send(newCart)
53
- })
27
+ parent.post('/replicate', this.replicate.bind(this))
28
+ }
29
+
30
+ replicate(request: Request, response: Response) {
31
+ const context = getRepositoryContext(request)
32
+
33
+ // @ts-ignore
34
+ const cartOrOrder: Cart | Order | null =
35
+ request.body.reference.typeId === 'order'
36
+ ? this.orderRepository.get(context, request.body.reference.id)
37
+ : this.repository.get(context, request.body.reference.id)
38
+
39
+ if (!cartOrOrder) {
40
+ return response.status(400).send()
41
+ }
42
+
43
+ const cartDraft: CartDraft = {
44
+ ...cartOrOrder,
45
+ currency: cartOrOrder.totalPrice.currencyCode,
46
+ discountCodes: [],
47
+ shipping: [], // TODO: cartOrOrder.shipping,
48
+ lineItems: cartOrOrder.lineItems.map((lineItem) => ({
49
+ ...lineItem,
50
+ variantId: lineItem.variant.id,
51
+ sku: lineItem.variant.sku,
52
+ })),
53
+ }
54
+
55
+ const newCart = this.repository.create(context, cartDraft)
56
+
57
+ return response.status(200).send(newCart)
54
58
  }
55
59
  }
@@ -6,8 +6,7 @@ describe('Categories Query', () => {
6
6
  const ctMock = new CommercetoolsMock()
7
7
 
8
8
  beforeEach(async () => {
9
- let response
10
- response = await supertest(ctMock.app)
9
+ const response = await supertest(ctMock.app)
11
10
  .post('/dummy/categories')
12
11
  .send({
13
12
  name: {
@@ -1,14 +1,13 @@
1
- import AbstractService from './abstract'
2
1
  import { Router } from 'express'
3
- import { AbstractStorage } from '../storage'
4
2
  import { CategoryRepository } from '../repositories/category'
3
+ import AbstractService from './abstract'
5
4
 
6
5
  export class CategoryServices extends AbstractService {
7
6
  public repository: CategoryRepository
8
7
 
9
- constructor(parent: Router, storage: AbstractStorage) {
8
+ constructor(parent: Router, repository: CategoryRepository) {
10
9
  super(parent)
11
- this.repository = new CategoryRepository(storage)
10
+ this.repository = repository
12
11
  }
13
12
 
14
13
  getBasePath() {
@@ -1,14 +1,13 @@
1
- import AbstractService from './abstract'
2
1
  import { Router } from 'express'
3
2
  import { ChannelRepository } from '../repositories/channel'
4
- import { AbstractStorage } from '../storage'
3
+ import AbstractService from './abstract'
5
4
 
6
5
  export class ChannelService extends AbstractService {
7
6
  public repository: ChannelRepository
8
7
 
9
- constructor(parent: Router, storage: AbstractStorage) {
8
+ constructor(parent: Router, repository: ChannelRepository) {
10
9
  super(parent)
11
- this.repository = new ChannelRepository(storage)
10
+ this.repository = repository
12
11
  }
13
12
 
14
13
  getBasePath() {
@@ -1,13 +1,13 @@
1
1
  import { CustomObject } from '@commercetools/platform-sdk'
2
- import { getBaseResourceProperties } from '../helpers'
3
2
  import supertest from 'supertest'
3
+ import { getBaseResourceProperties } from '../helpers'
4
4
  import { CommercetoolsMock } from '../index'
5
5
 
6
6
  describe('CustomObject create', () => {
7
7
  const ctMock = new CommercetoolsMock()
8
8
 
9
9
  test('Create new object', async () => {
10
- let response = await supertest(ctMock.app)
10
+ const response = await supertest(ctMock.app)
11
11
  .post('/dummy/custom-objects')
12
12
  .send({
13
13
  container: 'my-container',
@@ -145,27 +145,27 @@ describe('CustomObject retrieve', () => {
145
145
  test('update with container and key', async () => {
146
146
  ctMock.project('dummy').add('key-value-document', {
147
147
  ...getBaseResourceProperties(),
148
- container: 'my-container',
148
+ container: 'my-other-container',
149
149
  key: 'my-key',
150
150
  value: 'my-value',
151
151
  version: 2,
152
152
  })
153
153
 
154
154
  const response = await supertest(ctMock.app)
155
- .post('/dummy/custom-objects/my-container/my-key')
155
+ .post('/dummy/custom-objects/my-other-container/my-key')
156
156
  .send({
157
157
  value: 'new-value',
158
158
  })
159
159
 
160
160
  expect(response.status).toEqual(200)
161
161
  expect(response.body).toEqual({
162
- container: 'my-container',
162
+ container: 'my-other-container',
163
163
  createdAt: expect.anything(),
164
164
  id: expect.anything(),
165
165
  key: 'my-key',
166
166
  lastModifiedAt: expect.anything(),
167
167
  value: 'new-value',
168
- version: 2,
168
+ version: 3,
169
169
  })
170
170
  })
171
171
 
@@ -1,16 +1,15 @@
1
- import AbstractService from './abstract'
1
+ import { CustomObjectDraft } from '@commercetools/platform-sdk'
2
2
  import { Request, Response, Router } from 'express'
3
3
  import { CustomObjectRepository } from '../repositories/custom-object'
4
- import { AbstractStorage } from '../storage'
5
- import { CustomObjectDraft } from '@commercetools/platform-sdk'
6
4
  import { getRepositoryContext } from '../repositories/helpers'
5
+ import AbstractService from './abstract'
7
6
 
8
7
  export class CustomObjectService extends AbstractService {
9
8
  public repository: CustomObjectRepository
10
9
 
11
- constructor(parent: Router, storage: AbstractStorage) {
10
+ constructor(parent: Router, repository: CustomObjectRepository) {
12
11
  super(parent)
13
- this.repository = new CustomObjectRepository(storage)
12
+ this.repository = repository
14
13
  }
15
14
 
16
15
  getBasePath() {
@@ -1,14 +1,13 @@
1
- import AbstractService from './abstract'
2
1
  import { Router } from 'express'
3
2
  import { CustomerGroupRepository } from '../repositories/customer-group'
4
- import { AbstractStorage } from '../storage'
3
+ import AbstractService from './abstract'
5
4
 
6
5
  export class CustomerGroupService extends AbstractService {
7
6
  public repository: CustomerGroupRepository
8
7
 
9
- constructor(parent: Router, storage: AbstractStorage) {
8
+ constructor(parent: Router, repository: CustomerGroupRepository) {
10
9
  super(parent)
11
- this.repository = new CustomerGroupRepository(storage)
10
+ this.repository = repository
12
11
  }
13
12
 
14
13
  getBasePath() {
@@ -0,0 +1,136 @@
1
+ import { Customer } from '@commercetools/platform-sdk'
2
+ import assert from 'assert'
3
+ import supertest from 'supertest'
4
+ import { CommercetoolsMock, getBaseResourceProperties } from '../index'
5
+
6
+ describe('Customer Update Actions', () => {
7
+ const ctMock = new CommercetoolsMock()
8
+ let customer: Customer | undefined
9
+
10
+ beforeEach(async () => {
11
+ customer = {
12
+ ...getBaseResourceProperties(),
13
+ id: 'customer-uuid',
14
+ email: 'user@example.com',
15
+ password: 'supersecret',
16
+ addresses: [],
17
+ isEmailVerified: true,
18
+ authenticationMode: 'Password', //default in Commercetools
19
+ version: 1,
20
+ }
21
+ ctMock.project('dummy').add('customer', customer)
22
+ })
23
+
24
+ afterEach(() => {
25
+ ctMock.clear()
26
+ })
27
+
28
+ test('changeEmail', async () => {
29
+ assert(customer, 'customer not created')
30
+
31
+ const response = await supertest(ctMock.app)
32
+ .post(`/dummy/customers/${customer.id}`)
33
+ .send({
34
+ version: 1,
35
+ actions: [{ action: 'changeEmail', email: 'new@example.com' }],
36
+ })
37
+ expect(response.status).toBe(200)
38
+ expect(response.body.version).toBe(2)
39
+ expect(response.body.email).toBe('new@example.com')
40
+ })
41
+
42
+ test('setAuthenticationMode to an invalid mode', async () => {
43
+ assert(customer, 'customer not created')
44
+
45
+ const response = await supertest(ctMock.app)
46
+ .post(`/dummy/customers/${customer.id}`)
47
+ .send({
48
+ version: 1,
49
+ actions: [{ action: 'setAuthenticationMode', authMode: 'invalid' }],
50
+ })
51
+ expect(response.status).toBe(400)
52
+ expect(response.body.message).toBe(
53
+ 'Request body does not contain valid JSON.'
54
+ )
55
+ expect(response.body.errors[0].code).toBe('InvalidJsonInput')
56
+ expect(response.body.errors[0].detailedErrorMessage).toBe(
57
+ "actions -> authMode: Invalid enum value: 'invalid'. Expected one of: 'Password','ExternalAuth'"
58
+ )
59
+ })
60
+
61
+ test('setAuthenticationMode to ExternalAuth', async () => {
62
+ assert(customer, 'customer not created')
63
+
64
+ const response = await supertest(ctMock.app)
65
+ .post(`/dummy/customers/${customer.id}`)
66
+ .send({
67
+ version: 1,
68
+ actions: [
69
+ { action: 'setAuthenticationMode', authMode: 'ExternalAuth' },
70
+ ],
71
+ })
72
+ expect(response.status).toBe(200)
73
+ expect(response.body.version).toBe(2)
74
+ expect(response.body.authenticationMode).toBe('ExternalAuth')
75
+ expect(response.body.password).toBe(undefined)
76
+ })
77
+
78
+ test('setAuthenticationMode error when setting current authMode', async () => {
79
+ assert(customer, 'customer not created')
80
+ assert(
81
+ customer.authenticationMode == 'Password',
82
+ 'customer not in default state'
83
+ )
84
+
85
+ const response = await supertest(ctMock.app)
86
+ .post(`/dummy/customers/${customer.id}`)
87
+ .send({
88
+ version: 1,
89
+ actions: [
90
+ {
91
+ action: 'setAuthenticationMode',
92
+ authMode: 'Password',
93
+ password: 'newpass',
94
+ },
95
+ ],
96
+ })
97
+ expect(response.status).toBe(400)
98
+ expect(response.body.message).toBe(
99
+ "The customer is already using the 'Password' authentication mode."
100
+ )
101
+ })
102
+
103
+ test('setAuthenticationMode to Password', async () => {
104
+ assert(customer, 'customer not created')
105
+
106
+ //change *away from* Password authMode (to be able to test changing *to* Password authMode)
107
+ await supertest(ctMock.app)
108
+ .post(`/dummy/customers/${customer.id}`)
109
+ .send({
110
+ version: 1,
111
+ actions: [
112
+ { action: 'setAuthenticationMode', authMode: 'ExternalAuth' },
113
+ ],
114
+ })
115
+
116
+ //change to Password authMode
117
+ const response = await supertest(ctMock.app)
118
+ .post(`/dummy/customers/${customer.id}`)
119
+ .send({
120
+ version: 2,
121
+ actions: [
122
+ {
123
+ action: 'setAuthenticationMode',
124
+ authMode: 'Password',
125
+ password: 'newpass',
126
+ },
127
+ ],
128
+ })
129
+ expect(response.status).toBe(200)
130
+ expect(response.body.version).toBe(3)
131
+ expect(response.body.authenticationMode).toBe('Password')
132
+ expect(response.body.password).toBe(
133
+ Buffer.from('newpass').toString('base64')
134
+ )
135
+ })
136
+ })
@@ -1,17 +1,16 @@
1
- import AbstractService from './abstract'
2
1
  import { Router } from 'express'
3
- import { CustomerRepository } from '../repositories/customer'
4
- import { AbstractStorage } from '../storage'
5
- import { getBaseResourceProperties } from '../helpers'
6
2
  import { v4 as uuidv4 } from 'uuid'
3
+ import { getBaseResourceProperties } from '../helpers'
4
+ import { CustomerRepository } from '../repositories/customer'
7
5
  import { getRepositoryContext } from '../repositories/helpers'
6
+ import AbstractService from './abstract'
8
7
 
9
8
  export class CustomerService extends AbstractService {
10
9
  public repository: CustomerRepository
11
10
 
12
- constructor(parent: Router, storage: AbstractStorage) {
11
+ constructor(parent: Router, repository: CustomerRepository) {
13
12
  super(parent)
14
- this.repository = new CustomerRepository(storage)
13
+ this.repository = repository
15
14
  }
16
15
 
17
16
  getBasePath() {
@@ -1,14 +1,13 @@
1
1
  import { Router } from 'express'
2
- import AbstractService from './abstract'
3
- import { AbstractStorage } from '../storage'
4
2
  import { DiscountCodeRepository } from '../repositories/discount-code'
3
+ import AbstractService from './abstract'
5
4
 
6
5
  export class DiscountCodeService extends AbstractService {
7
6
  public repository: DiscountCodeRepository
8
7
 
9
- constructor(parent: Router, storage: AbstractStorage) {
8
+ constructor(parent: Router, repository: DiscountCodeRepository) {
10
9
  super(parent)
11
- this.repository = new DiscountCodeRepository(storage)
10
+ this.repository = repository
12
11
  }
13
12
 
14
13
  getBasePath() {
@@ -1,14 +1,13 @@
1
- import AbstractService from './abstract'
2
1
  import { Router } from 'express'
3
- import { AbstractStorage } from '../storage'
4
2
  import { ExtensionRepository } from '../repositories/extension'
3
+ import AbstractService from './abstract'
5
4
 
6
5
  export class ExtensionServices extends AbstractService {
7
6
  public repository: ExtensionRepository
8
7
 
9
- constructor(parent: Router, storage: AbstractStorage) {
8
+ constructor(parent: Router, repository: ExtensionRepository) {
10
9
  super(parent)
11
- this.repository = new ExtensionRepository(storage)
10
+ this.repository = repository
12
11
  }
13
12
 
14
13
  getBasePath() {