Skip to content

Commit 739caaa

Browse files
committed
feat(cart,checkout): move place order to checkout
1 parent bbdf0a2 commit 739caaa

90 files changed

Lines changed: 2378 additions & 28 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

libs/cart/driver/in-memory/src/backend/cart-order/cart-order.service.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import { DAFF_CART_IN_MEMORY_CART_ORDER_COLLECTION_NAME } from '../../collection
1111

1212
/**
1313
* @inheritdoc
14+
*
15+
* @deprecated Use {@link DaffCheckoutInMemoryBackendOrderService} instead.
1416
*/
1517
@Injectable({
1618
providedIn: 'root',

libs/cart/src/models/cart-order-result.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { ID } from '@daffodil/core';
33
/**
44
* The result of placing an order for a cart.
55
* Stores a reference to a cart and order object.
6+
*
7+
* @deprecated Use {@link DaffCheckoutOrderResult} instead.
68
*/
79
export interface DaffCartOrderResult {
810
/**

libs/cart/state/src/selectors/cart-order/cart-order.selector.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import {
1717
} from '../../reducers/public_api';
1818
import { getDaffCartFeatureSelector } from '../cart-feature.selector';
1919

20+
/**
21+
* @deprecated Use {@link DaffCheckoutOrderMemoizedSelectors} instead.
22+
*/
2023
export interface DaffCartOrderMemoizedSelectors<
2124
T extends DaffCart = DaffCart,
2225
V extends DaffCartOrderResult = DaffCartOrderResult,
@@ -90,6 +93,9 @@ const createCartOrderSelectors = <
9093
};
9194
};
9295

96+
/**
97+
* @deprecated Use {@link getCheckoutOrderSelectors} instead.
98+
*/
9399
export const getCartOrderSelectors: <
94100
T extends DaffCart = DaffCart,
95101
V extends DaffCartOrderResult = DaffCartOrderResult,
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"$schema": "../../../../node_modules/ng-packagr/ng-entrypoint.schema.json",
3+
"lib": {
4+
"entryFile": "src/index.ts"
5+
}
6+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { DaffCheckoutInMemoryBackendRootService } from './root.service';
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import { TestBed } from '@angular/core/testing';
2+
3+
import { DaffCheckoutInMemoryBackendOrderService } from '@daffodil/checkout/driver/in-memory';
4+
import { DaffProductTestingModule } from '@daffodil/product/testing';
5+
6+
import { DaffCheckoutInMemoryBackendRootService } from './root.service';
7+
import { DAFF_CHECKOUT_IN_MEMORY_CHECKOUT_ORDER_COLLECTION_NAME } from '../collection-names.const';
8+
9+
describe('DaffCheckoutInMemoryBackendRootService | Unit', () => {
10+
let service: DaffCheckoutInMemoryBackendRootService;
11+
12+
let orderBackendService: DaffCheckoutInMemoryBackendOrderService;
13+
14+
let reqInfoStub;
15+
let baseUrl;
16+
17+
let orderPostSpy: jasmine.Spy;
18+
19+
beforeEach(() => {
20+
TestBed.configureTestingModule({
21+
imports: [
22+
DaffProductTestingModule,
23+
],
24+
providers: [
25+
DaffCheckoutInMemoryBackendRootService,
26+
],
27+
});
28+
service = TestBed.inject(DaffCheckoutInMemoryBackendRootService);
29+
30+
orderBackendService = TestBed.inject(DaffCheckoutInMemoryBackendOrderService);
31+
32+
baseUrl = 'api/checkout';
33+
reqInfoStub = {
34+
id: '',
35+
resourceUrl: baseUrl,
36+
collection: [],
37+
collectionName: '',
38+
method: '',
39+
req: {
40+
body: {},
41+
},
42+
utils: {
43+
createResponse$: func => func(),
44+
getJsonBody: req => req.body,
45+
findById: (ary, id) => ary.find(e => e.id === id),
46+
},
47+
};
48+
49+
orderPostSpy = spyOn(orderBackendService, 'post');
50+
});
51+
52+
it('should be created', () => {
53+
expect(service).toBeTruthy();
54+
});
55+
56+
describe('processing a post request', () => {
57+
beforeEach(() => {
58+
reqInfoStub.method = 'post';
59+
});
60+
61+
describe(`when the collectionName is ${DAFF_CHECKOUT_IN_MEMORY_CHECKOUT_ORDER_COLLECTION_NAME}`, () => {
62+
let result;
63+
64+
beforeEach(() => {
65+
reqInfoStub.collectionName = DAFF_CHECKOUT_IN_MEMORY_CHECKOUT_ORDER_COLLECTION_NAME;
66+
67+
result = service.post(reqInfoStub);
68+
});
69+
70+
it('should delegate the request to the order service', () => {
71+
expect(orderPostSpy).toHaveBeenCalledWith(reqInfoStub);
72+
});
73+
});
74+
});
75+
});
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import {
2+
Inject,
3+
Injectable,
4+
} from '@angular/core';
5+
import {
6+
InMemoryDbService,
7+
RequestInfo,
8+
} from 'angular-in-memory-web-api';
9+
import {
10+
Observable,
11+
of,
12+
} from 'rxjs';
13+
14+
import {
15+
DAFF_IN_MEMORY_DRIVER_CONFIG,
16+
DaffInMemoryBackendDelegate,
17+
DaffInMemoryDriverConfig,
18+
DaffInMemoryMultiRouteableBackend,
19+
} from '@daffodil/driver/in-memory';
20+
21+
import { DAFF_CHECKOUT_IN_MEMORY_CHECKOUT_ORDER_COLLECTION_NAME } from '../collection-names.const';
22+
import { DaffCheckoutInMemoryBackendOrderService } from '../order/backend.service';
23+
24+
/**
25+
* The collections that the root service manages.
26+
* Useful for a higher-level backend that delegates to this one based on collection name.
27+
*/
28+
const COLLECTION_NAMES = [
29+
DAFF_CHECKOUT_IN_MEMORY_CHECKOUT_ORDER_COLLECTION_NAME,
30+
];
31+
32+
/**
33+
* The root in-memory backend.
34+
* Creates the database and delegates requests to child backends.
35+
*/
36+
@Injectable({
37+
providedIn: 'root',
38+
})
39+
export class DaffCheckoutInMemoryBackendRootService extends DaffInMemoryBackendDelegate implements InMemoryDbService, DaffInMemoryMultiRouteableBackend {
40+
constructor(
41+
orderService: DaffCheckoutInMemoryBackendOrderService,
42+
@Inject(DAFF_IN_MEMORY_DRIVER_CONFIG) _config: DaffInMemoryDriverConfig,
43+
) {
44+
super([
45+
orderService,
46+
], _config);
47+
}
48+
49+
protected override delegateRequest(reqInfo: RequestInfo, method): Observable<any> {
50+
return super.delegateRequest({
51+
...reqInfo,
52+
collection: [],
53+
}, method);
54+
}
55+
56+
canHandle(collectionName: string): boolean {
57+
return COLLECTION_NAMES.includes(collectionName);
58+
}
59+
60+
createDb(reqInfo: RequestInfo) {
61+
return of({});
62+
}
63+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const DAFF_CHECKOUT_IN_MEMORY_CHECKOUT_ORDER_COLLECTION_NAME = 'checkout-order';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './public_api';
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { TestBed } from '@angular/core/testing';
2+
3+
import { DaffCart } from '@daffodil/cart';
4+
5+
import { DaffCheckoutInMemoryBackendOrderService } from './backend.service';
6+
import { DAFF_CHECKOUT_IN_MEMORY_CHECKOUT_ORDER_COLLECTION_NAME } from '../collection-names.const';
7+
8+
9+
describe('DaffCheckoutInMemoryBackendOrderService', () => {
10+
let service: DaffCheckoutInMemoryBackendOrderService;
11+
12+
let cartId: DaffCart['id'];
13+
let reqInfoStub;
14+
let baseUrl;
15+
16+
beforeEach(() => {
17+
TestBed.configureTestingModule({
18+
providers: [
19+
DaffCheckoutInMemoryBackendOrderService,
20+
],
21+
});
22+
service = TestBed.inject(DaffCheckoutInMemoryBackendOrderService);
23+
24+
cartId = 'cartId';
25+
baseUrl = `api/${DAFF_CHECKOUT_IN_MEMORY_CHECKOUT_ORDER_COLLECTION_NAME}/`;
26+
reqInfoStub = {
27+
id: cartId,
28+
resourceUrl: baseUrl,
29+
collection: [],
30+
req: {
31+
body: {},
32+
},
33+
utils: {
34+
createResponse$: func => func(),
35+
getJsonBody: req => req.body,
36+
findById: (ary, id) => ary.find(e => e.id === id),
37+
},
38+
};
39+
});
40+
41+
it('should be created', () => {
42+
expect(service).toBeTruthy();
43+
});
44+
45+
describe('processing a place order request', () => {
46+
let result;
47+
48+
beforeEach(() => {
49+
reqInfoStub.url = baseUrl;
50+
reqInfoStub.req.body.cartId = cartId;
51+
52+
result = service.post(reqInfoStub);
53+
});
54+
55+
it('should return the cart order result with a defined cart and order ID', () => {
56+
expect(result.body.orderId).toBeDefined();
57+
expect(result.body.cartId).toBeDefined();
58+
});
59+
});
60+
});

0 commit comments

Comments
 (0)