Skip to content

Commit

Permalink
fix(cart): cart resolution effects unsafely call storage in SSR (#2545)
Browse files Browse the repository at this point in the history
  • Loading branch information
griest024 committed Sep 19, 2023
1 parent 5e517ab commit d6e0468
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 5 deletions.
64 changes: 63 additions & 1 deletion libs/cart/state/src/effects/cart-resolver.effects.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import { PLATFORM_ID } from '@angular/core';
import { TestBed } from '@angular/core/testing';
import { platformBrowser } from '@angular/platform-browser';
import { provideMockActions } from '@ngrx/effects/testing';
import {
hot,
Expand Down Expand Up @@ -39,7 +41,7 @@ import { daffTransformErrorToStateError } from '@daffodil/core/state';

import { DaffCartResolverEffects } from './cart-resolver.effects';

describe('@daffodil/cart/state | DaffCartResolverEffects', () => {
describe('@daffodil/cart/state | DaffCartResolverEffects | in the browser', () => {
let actions$: Observable<any>;
let effects: DaffCartResolverEffects;

Expand Down Expand Up @@ -263,3 +265,63 @@ describe('@daffodil/cart/state | DaffCartResolverEffects', () => {
});
});
});

describe('@daffodil/cart/state | DaffCartResolverEffects | on the server', () => {
let actions$: Observable<any>;
let effects: DaffCartResolverEffects;

let cartFactory: DaffCartFactory;
let stubCart: DaffCart;

let cartResolverSpy: jasmine.SpyObj<DaffCartDriverResolveService>;
let cartStorageService: DaffCartStorageService;
let getCartIdSpy: jasmine.Spy;

beforeEach(() => {
cartResolverSpy = jasmine.createSpyObj('DaffCartDriverResolveService', ['getCartOrFail']);

TestBed.configureTestingModule({
imports: [
DaffTestingCartDriverModule.forRoot(),
],
providers: [
DaffCartResolverEffects,
provideMockActions(() => actions$),
{
provide: DaffCartDriverResolveService,
useValue: cartResolverSpy,
},
{
provide: PLATFORM_ID,
useValue: 'server',
},
],
});

effects = TestBed.inject(DaffCartResolverEffects);
cartFactory = TestBed.inject(DaffCartFactory);
cartStorageService = TestBed.inject(DaffCartStorageService);

stubCart = cartFactory.create();
getCartIdSpy = spyOn(cartStorageService, 'getCartId');

getCartIdSpy.and.returnValue(stubCart.id);
cartResolverSpy.getCartOrFail.and.returnValue(of({
response: stubCart,
errors: [],
}));
});

it('should be created', () => {
expect(effects).toBeTruthy();
});

it('should should not call the cart storage service', () => {
effects.ngrxOnInitEffects();
expect(getCartIdSpy).not.toHaveBeenCalled();
});

it('should not initiate cart resolution', () => {
expect(effects.ngrxOnInitEffects() instanceof DaffResolveCart).toBeFalse();
});
});
14 changes: 10 additions & 4 deletions libs/cart/state/src/effects/cart-resolver.effects.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { isPlatformBrowser } from '@angular/common';
import {
Injectable,
Inject,
PLATFORM_ID,
} from '@angular/core';
import {
Actions,
Expand Down Expand Up @@ -51,6 +53,7 @@ import {
DaffResolveCartServerSide,
DaffResolveCart,
DaffResolveCartPartialSuccess,
DaffCartActions,
} from '../actions/public_api';

/**
Expand All @@ -64,19 +67,22 @@ import {
export class DaffCartResolverEffects<T extends DaffCart = DaffCart>
implements OnInitEffects {
constructor(
private actions$: Actions,
private actions$: Actions<DaffCartActions<T>>,
@Inject(DAFF_CART_ERROR_MATCHER) private errorMatcher: ErrorTransformer,
private cartStorage: DaffCartStorageService,
private cartResolver: DaffCartDriverResolveService,
@Inject(DaffCartDriver) private driver: DaffCartServiceInterface<T>,
@Inject(PLATFORM_ID) private platformId: string,
) {}

ngrxOnInitEffects(): Action {
return this.cartStorage.getCartId() ? new DaffResolveCart() : { type: '' };
return isPlatformBrowser(this.platformId) && this.cartStorage.getCartId() ? new DaffResolveCart() : { type: '' };
}

onResolveCart = createEffect(() => (): Observable<Action> => this.actions$.pipe(
ofType<DaffResolveCart | DaffResolveCartSuccess>(DaffCartActionTypes.ResolveCartAction, DaffCartActionTypes.ResolveCartSuccessAction),
ofType(
DaffCartActionTypes.ResolveCartAction,
DaffCartActionTypes.ResolveCartSuccessAction,
),
switchMap(action =>
iif(
// if something else resolves the cart during an outstanding resolve
Expand Down

0 comments on commit d6e0468

Please sign in to comment.