@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.
- package/README.md +8 -0
- package/dist/index.d.ts +354 -188
- package/dist/index.global.js +2346 -2209
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +1968 -1829
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2171 -2032
- package/dist/index.mjs.map +1 -1
- package/package.json +30 -21
- package/src/constants.ts +4 -2
- package/src/ctMock.ts +27 -86
- package/src/helpers.ts +10 -11
- package/src/index.test.ts +1 -1
- package/src/lib/haversine.ts +2 -2
- package/src/lib/masking.ts +3 -1
- package/src/lib/predicateParser.ts +93 -92
- package/src/lib/projectionSearchFilter.test.ts +28 -36
- package/src/lib/projectionSearchFilter.ts +88 -103
- package/src/oauth/store.ts +3 -3
- package/src/priceSelector.test.ts +16 -35
- package/src/priceSelector.ts +6 -9
- package/src/product-projection-search.ts +49 -57
- package/src/projectAPI.test.ts +7 -0
- package/src/projectAPI.ts +17 -22
- package/src/repositories/abstract.ts +102 -51
- package/src/repositories/cart-discount.ts +4 -5
- package/src/repositories/cart.ts +56 -46
- package/src/repositories/category.ts +23 -26
- package/src/repositories/channel.ts +5 -6
- package/src/repositories/custom-object.ts +41 -32
- package/src/repositories/customer-group.ts +4 -5
- package/src/repositories/customer.ts +42 -5
- package/src/repositories/discount-code.ts +5 -6
- package/src/repositories/errors.ts +10 -14
- package/src/repositories/extension.ts +16 -15
- package/src/repositories/helpers.ts +10 -15
- package/src/repositories/index.ts +75 -0
- package/src/repositories/inventory-entry.ts +5 -6
- package/src/repositories/my-order.ts +2 -2
- package/src/repositories/order-edit.ts +39 -0
- package/src/repositories/order.test.ts +16 -11
- package/src/repositories/order.ts +21 -14
- package/src/repositories/payment.ts +9 -10
- package/src/repositories/product-discount.ts +5 -25
- package/src/repositories/product-projection.ts +12 -5
- package/src/repositories/product-selection.ts +40 -0
- package/src/repositories/product-type.ts +38 -60
- package/src/repositories/product.ts +128 -85
- package/src/repositories/project.ts +16 -33
- package/src/repositories/quote-request.ts +28 -0
- package/src/repositories/quote.ts +28 -0
- package/src/repositories/review.ts +34 -0
- package/src/repositories/shipping-method.ts +25 -28
- package/src/repositories/shopping-list.ts +6 -6
- package/src/repositories/staged-quote.ts +29 -0
- package/src/repositories/standalone-price.ts +36 -0
- package/src/repositories/state.ts +16 -17
- package/src/repositories/store.ts +13 -29
- package/src/repositories/subscription.ts +4 -5
- package/src/repositories/tax-category.ts +9 -26
- package/src/repositories/type.ts +24 -27
- package/src/repositories/zone.ts +9 -11
- package/src/server.ts +5 -0
- package/src/services/abstract.ts +43 -12
- package/src/services/cart-discount.ts +3 -4
- package/src/services/cart.test.ts +9 -11
- package/src/services/cart.ts +42 -38
- package/src/services/category.test.ts +1 -2
- package/src/services/category.ts +3 -4
- package/src/services/channel.ts +3 -4
- package/src/services/custom-object.test.ts +6 -6
- package/src/services/custom-object.ts +4 -5
- package/src/services/customer-group.ts +3 -4
- package/src/services/customer.test.ts +136 -0
- package/src/services/customer.ts +5 -6
- package/src/services/discount-code.ts +3 -4
- package/src/services/extension.ts +3 -4
- package/src/services/index.ts +74 -0
- package/src/services/inventory-entry.test.ts +9 -13
- package/src/services/inventory-entry.ts +3 -4
- package/src/services/my-cart.test.ts +2 -0
- package/src/services/my-cart.ts +4 -5
- package/src/services/my-customer.ts +3 -4
- package/src/services/my-order.ts +4 -5
- package/src/services/my-payment.ts +3 -4
- package/src/services/order.test.ts +28 -26
- package/src/services/order.ts +4 -5
- package/src/services/payment.ts +3 -4
- package/src/services/product-discount.ts +3 -20
- package/src/services/product-projection.test.ts +76 -8
- package/src/services/product-projection.ts +4 -5
- package/src/services/product-type.ts +3 -20
- package/src/services/product.test.ts +200 -90
- package/src/services/product.ts +3 -4
- package/src/services/project.ts +5 -6
- package/src/services/shipping-method.ts +3 -4
- package/src/services/shopping-list.ts +3 -4
- package/src/services/state.ts +3 -4
- package/src/services/store.test.ts +11 -2
- package/src/services/store.ts +4 -21
- package/src/services/subscription.ts +3 -4
- package/src/services/tax-category.ts +3 -20
- package/src/services/type.ts +3 -4
- package/src/services/zone.ts +3 -4
- package/src/storage/abstract.ts +82 -0
- package/src/{storage.ts → storage/in-memory.ts} +79 -147
- package/src/storage/index.ts +2 -0
- package/src/types.ts +52 -83
package/src/services/abstract.ts
CHANGED
|
@@ -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.
|
|
31
|
-
router.delete('/:id', 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
|
-
|
|
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
|
-
|
|
86
|
-
|
|
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
|
-
|
|
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,
|
|
8
|
+
constructor(parent: Router, repository: CartDiscountRepository) {
|
|
10
9
|
super(parent)
|
|
11
|
-
this.repository =
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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')
|
package/src/services/cart.ts
CHANGED
|
@@ -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 {
|
|
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(
|
|
12
|
+
constructor(
|
|
13
|
+
parent: Router,
|
|
14
|
+
cartRepository: CartRepository,
|
|
15
|
+
orderRepository: OrderRepository
|
|
16
|
+
) {
|
|
14
17
|
super(parent)
|
|
15
|
-
this.repository =
|
|
16
|
-
this.orderRepository =
|
|
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', (
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
}
|
package/src/services/category.ts
CHANGED
|
@@ -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,
|
|
8
|
+
constructor(parent: Router, repository: CategoryRepository) {
|
|
10
9
|
super(parent)
|
|
11
|
-
this.repository =
|
|
10
|
+
this.repository = repository
|
|
12
11
|
}
|
|
13
12
|
|
|
14
13
|
getBasePath() {
|
package/src/services/channel.ts
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import AbstractService from './abstract'
|
|
2
1
|
import { Router } from 'express'
|
|
3
2
|
import { ChannelRepository } from '../repositories/channel'
|
|
4
|
-
import
|
|
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,
|
|
8
|
+
constructor(parent: Router, repository: ChannelRepository) {
|
|
10
9
|
super(parent)
|
|
11
|
-
this.repository =
|
|
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
|
-
|
|
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:
|
|
168
|
+
version: 3,
|
|
169
169
|
})
|
|
170
170
|
})
|
|
171
171
|
|
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import
|
|
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,
|
|
10
|
+
constructor(parent: Router, repository: CustomObjectRepository) {
|
|
12
11
|
super(parent)
|
|
13
|
-
this.repository =
|
|
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
|
|
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,
|
|
8
|
+
constructor(parent: Router, repository: CustomerGroupRepository) {
|
|
10
9
|
super(parent)
|
|
11
|
-
this.repository =
|
|
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
|
+
})
|
package/src/services/customer.ts
CHANGED
|
@@ -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,
|
|
11
|
+
constructor(parent: Router, repository: CustomerRepository) {
|
|
13
12
|
super(parent)
|
|
14
|
-
this.repository =
|
|
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,
|
|
8
|
+
constructor(parent: Router, repository: DiscountCodeRepository) {
|
|
10
9
|
super(parent)
|
|
11
|
-
this.repository =
|
|
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,
|
|
8
|
+
constructor(parent: Router, repository: ExtensionRepository) {
|
|
10
9
|
super(parent)
|
|
11
|
-
this.repository =
|
|
10
|
+
this.repository = repository
|
|
12
11
|
}
|
|
13
12
|
|
|
14
13
|
getBasePath() {
|