Skip to content

Commit

Permalink
feat(product): improve default product factory field generation (#2609)
Browse files Browse the repository at this point in the history
BREAKING CHANGE: `DaffDefaultProductFactory` now requires passing the image factory to construct. It is recommended to use DI to construct factories.
  • Loading branch information
griest024 committed Nov 22, 2023
1 parent a4f408f commit 48f4ba0
Show file tree
Hide file tree
Showing 20 changed files with 116 additions and 64 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import { DaffCompositeProductFactory } from '@daffodil/product-composite/testing
import { getDaffCompositeProductEntitiesSelectors } from './composite-product-entities.selectors';

describe('selectCompositeProductEntitiesState', () => {

let store: Store<DaffCompositeProductStateRootSlice>;
let compositeProductFactory: DaffCompositeProductFactory;
let stubCompositeProduct: DaffCompositeProduct;
Expand All @@ -47,9 +46,9 @@ describe('selectCompositeProductEntitiesState', () => {
});

compositeProductFactory = TestBed.inject(DaffCompositeProductFactory);
store = TestBed.inject(Store);

stubCompositeProduct = compositeProductFactory.create();
store = TestBed.inject(Store);

store.dispatch(new DaffProductGridLoadSuccess(new Array(stubCompositeProduct)));
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,10 @@ import { DaffCompositeProductFactory } from '@daffodil/product-composite/testing

import { getDaffCompositeProductPriceSelectors } from './composite-product.selectors';

describe('Composite Product Selectors | integration tests', () => {

describe('@daffodil/product-composite/state | getDaffCompositeProductPriceSelectors | integration tests', () => {
let store: Store<DaffCompositeProductStateRootSlice>;
let compositeProductFactory: DaffCompositeProductFactory;
const productFactory: DaffProductFactory = new DaffProductFactory();
let productFactory: DaffProductFactory;
let stubCompositeProduct: DaffCompositeProduct;
let stubProduct: DaffProduct;
const {
Expand Down Expand Up @@ -71,6 +70,7 @@ describe('Composite Product Selectors | integration tests', () => {
],
});

productFactory = TestBed.inject(DaffProductFactory);
compositeProductFactory = TestBed.inject(DaffCompositeProductFactory);

stubCompositeProduct = compositeProductFactory.create();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ import { Injectable } from '@angular/core';
import { faker } from '@faker-js/faker/locale/en_US';

import { DaffModelFactory } from '@daffodil/core/testing';
import { MockProduct } from '@daffodil/product/testing';
import {
DaffProductImageFactory,
MockProduct,
} from '@daffodil/product/testing';
import { DaffCompositeProductItemOption } from '@daffodil/product-composite';

/**
Expand All @@ -20,7 +23,9 @@ export class MockCompositeProductItemOption extends MockProduct implements DaffC
providedIn: 'root',
})
export class DaffCompositeProductItemOptionFactory extends DaffModelFactory<DaffCompositeProductItemOption>{
constructor() {
super(MockCompositeProductItemOption);
constructor(
imageFactory: DaffProductImageFactory,
) {
super(MockCompositeProductItemOption, imageFactory);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ import { faker } from '@faker-js/faker/locale/en_US';

import { DaffModelFactory } from '@daffodil/core/testing';
import { DaffProductTypeEnum } from '@daffodil/product';
import { MockProduct } from '@daffodil/product/testing';
import {
DaffProductImageFactory,
MockProduct,
} from '@daffodil/product/testing';
import { DaffCompositeProduct } from '@daffodil/product-composite';

import { DaffCompositeProductItemFactory } from './composite-product-item.factory';
Expand All @@ -17,8 +20,9 @@ export class MockCompositeProduct extends MockProduct implements DaffCompositePr

constructor(
protected itemFactory: DaffCompositeProductItemFactory,
imageFactory: DaffProductImageFactory,
) {
super();
super(imageFactory);
}
}

Expand All @@ -31,7 +35,8 @@ export class MockCompositeProduct extends MockProduct implements DaffCompositePr
export class DaffCompositeProductFactory extends DaffModelFactory<DaffCompositeProduct>{
constructor(
itemFactory: DaffCompositeProductItemFactory,
imageFactory: DaffProductImageFactory,
) {
super(MockCompositeProduct, itemFactory);
super(MockCompositeProduct, itemFactory, imageFactory);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,24 +23,33 @@ import daffConfigurableProductData from './spec-data/daff-configurable-product.j
import magentoConfigurableProductData from './spec-data/magento-configurable-product.json';

describe('DaffMagentoConfigurableProductTransformers', () => {
const daffConfigurableProduct: DaffConfigurableProduct = new DaffConfigurableProductFactory().create();
const magentoConfigurableProduct: MagentoConfigurableProduct = new MagentoConfigurableProductFactory().create();
daffConfigurableProduct.variants[0].image = new DaffProductImageFactory().create();
daffConfigurableProduct.variants[1].image = new DaffProductImageFactory().create();
daffConfigurableProduct.variants[2].image = new DaffProductImageFactory().create();
daffConfigurableProduct.variants[0].image.id = '0';
daffConfigurableProduct.variants[1].image.id = '0';
daffConfigurableProduct.variants[2].image.id = '0';
let imageFactory: DaffProductImageFactory;
let configurableProductFactory: DaffConfigurableProductFactory;
let magentoConfigurableProductFactory: MagentoConfigurableProductFactory;
let daffConfigurableProduct: DaffConfigurableProduct;
let magentoConfigurableProduct: MagentoConfigurableProduct;
const mediaUrl = 'mediaUrl';
delete daffConfigurableProduct.configurableAttributes[0].values[0].swatch;
delete daffConfigurableProduct.configurableAttributes[0].values[1].swatch;
delete daffConfigurableProduct.configurableAttributes[0].values[2].swatch;
let simpleProductService: DaffMagentoSimpleProductTransformers;

beforeEach(() => {
TestBed.configureTestingModule({});

simpleProductService = TestBed.inject(DaffMagentoSimpleProductTransformers);
imageFactory = TestBed.inject(DaffProductImageFactory);
configurableProductFactory = TestBed.inject(DaffConfigurableProductFactory);
magentoConfigurableProductFactory = TestBed.inject(MagentoConfigurableProductFactory);

daffConfigurableProduct = configurableProductFactory.create();
magentoConfigurableProduct = magentoConfigurableProductFactory.create();
daffConfigurableProduct.variants[0].image = new DaffProductImageFactory().create();
daffConfigurableProduct.variants[1].image = new DaffProductImageFactory().create();
daffConfigurableProduct.variants[2].image = new DaffProductImageFactory().create();
daffConfigurableProduct.variants[0].image.id = '0';
daffConfigurableProduct.variants[1].image.id = '0';
daffConfigurableProduct.variants[2].image.id = '0';
delete daffConfigurableProduct.configurableAttributes[0].values[0].swatch;
delete daffConfigurableProduct.configurableAttributes[0].values[1].swatch;
delete daffConfigurableProduct.configurableAttributes[0].values[2].swatch;
});

describe('transformMagentoConfigurableProduct', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ describe('DaffConfigurableProductFacade', () => {
let store: Store<DaffProductStateRootSlice>;
let facade: DaffConfigurableProductFacade;
let stubConfigurableProduct: DaffConfigurableProduct;
let configurableProductFactory: DaffConfigurableProductFactory;

beforeEach(() => {
TestBed.configureTestingModule({
Expand All @@ -42,7 +43,8 @@ describe('DaffConfigurableProductFacade', () => {

store = TestBed.inject(Store);
facade = TestBed.inject(DaffConfigurableProductFacade);
stubConfigurableProduct = new DaffConfigurableProductFactory().create();
configurableProductFactory = TestBed.inject(DaffConfigurableProductFactory);
stubConfigurableProduct = configurableProductFactory.create();
store.dispatch(new DaffProductLoadSuccess({
id: stubConfigurableProduct.id,
products: [stubConfigurableProduct],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@

import { TestBed } from '@angular/core/testing';
import { EntityState } from '@ngrx/entity';

import { DaffProduct } from '@daffodil/product';
Expand All @@ -23,15 +24,15 @@ import { DaffConfigurableProductAppliedAttributesEntitiesAdapter } from './confi

describe('@daffodil/product-configurable/state | DaffConfigurableProductAppliedAttributesEntitiesAdapter', () => {
let adapter: DaffConfigurableProductAppliedAttributesEntitiesAdapter;
let productFactory: DaffProductFactory;
let configurableProductFactory: DaffConfigurableProductFactory;
const initialState = daffConfigurableProductAppliedAttributesEntitiesAdapter().getInitialState();
let configurableProduct: DaffConfigurableProduct;
let productFactory: DaffProductFactory;
let configurableProductFactory: DaffConfigurableProductFactory;

beforeEach(() => {
adapter = new DaffConfigurableProductAppliedAttributesEntitiesAdapter();
productFactory = new DaffProductFactory();
configurableProductFactory = new DaffConfigurableProductFactory();
productFactory = TestBed.inject(DaffProductFactory);
configurableProductFactory = TestBed.inject(DaffConfigurableProductFactory);

configurableProduct = configurableProductFactory.create();
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

import { TestBed } from '@angular/core/testing';

import { DaffProduct } from '@daffodil/product';
import {
DaffProductLoadSuccess,
Expand All @@ -19,15 +21,14 @@ import { DaffConfigurableProductFactory } from '@daffodil/product-configurable/t
import { daffConfigurableProductEntitiesReducer } from './configurable-product-entities.reducer';

describe('@daffodil/product-configurable/state | daffConfigurableProductEntitiesReducer', () => {

let productFactory: DaffProductFactory;
let configurableProductFactory: DaffConfigurableProductFactory;
const initialState = daffConfigurableProductAppliedAttributesEntitiesAdapter().getInitialState();
let configurableProduct: DaffConfigurableProduct;

beforeEach(() => {
productFactory = new DaffProductFactory();
configurableProductFactory = new DaffConfigurableProductFactory();
productFactory = TestBed.inject(DaffProductFactory);
configurableProductFactory = TestBed.inject(DaffConfigurableProductFactory);
configurableProduct = configurableProductFactory.create();
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import { getDaffConfigurableProductEntitiesSelectors } from './configurable-prod
describe('selectConfigurableProductEntitiesState', () => {

let store: Store<DaffProductStateRootSlice>;
const configurableProductFactory: DaffConfigurableProductFactory = new DaffConfigurableProductFactory();
let configurableProductFactory: DaffConfigurableProductFactory;
let stubConfigurableProduct: DaffConfigurableProduct;
const {
selectConfigurableProductIds,
Expand All @@ -47,9 +47,11 @@ describe('selectConfigurableProductEntitiesState', () => {
],
});

stubConfigurableProduct = configurableProductFactory.create();
configurableProductFactory = TestBed.inject(DaffConfigurableProductFactory);
store = TestBed.inject(Store);

stubConfigurableProduct = configurableProductFactory.create();

store.dispatch(new DaffProductGridLoadSuccess(new Array(stubConfigurableProduct)));
store.dispatch(new DaffConfigurableProductApplyAttribute(
stubConfigurableProduct.id,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import { getDaffConfigurableProductSelectors } from './configurable-product.sele
describe('Configurable Product Selectors | integration tests', () => {

let store: Store<DaffProductStateRootSlice>;
const configurableProductFactory: DaffConfigurableProductFactory = new DaffConfigurableProductFactory();
let configurableProductFactory: DaffConfigurableProductFactory;
let stubConfigurableProduct: DaffConfigurableProduct;
const {
selectSelectableConfigurableProductAttributes,
Expand All @@ -47,8 +47,10 @@ describe('Configurable Product Selectors | integration tests', () => {
],
});

stubConfigurableProduct = configurableProductFactory.create();
configurableProductFactory = TestBed.inject(DaffConfigurableProductFactory);
store = TestBed.inject(Store);

stubConfigurableProduct = configurableProductFactory.create();
});

describe('when one attribute (material) is chosen', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import { getDaffConfigurableProductSelectors } from './configurable-product.sele
describe('Configurable Product Selectors | unit tests', () => {

let store: Store<DaffProductStateRootSlice>;
const configurableProductFactory: DaffConfigurableProductFactory = new DaffConfigurableProductFactory();
let configurableProductFactory: DaffConfigurableProductFactory;
let stubConfigurableProduct: DaffConfigurableProduct;
const {
selectAllConfigurableProductVariants,
Expand Down Expand Up @@ -57,8 +57,10 @@ describe('Configurable Product Selectors | unit tests', () => {
],
});

stubConfigurableProduct = configurableProductFactory.create();
configurableProductFactory = TestBed.inject(DaffConfigurableProductFactory);
store = TestBed.inject(Store);

stubConfigurableProduct = configurableProductFactory.create();
});

describe('selectAllConfigurableProductVariants', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ import { faker } from '@faker-js/faker/locale/en_US';

import { DaffModelFactory } from '@daffodil/core/testing';
import { DaffProductTypeEnum } from '@daffodil/product';
import { MockProduct } from '@daffodil/product/testing';
import {
DaffProductImageFactory,
MockProduct,
} from '@daffodil/product/testing';
import { DaffConfigurableProduct } from '@daffodil/product-configurable';

/**
Expand Down Expand Up @@ -246,7 +249,9 @@ export class MockConfigurableProduct extends MockProduct implements DaffConfigur
providedIn: 'root',
})
export class DaffConfigurableProductFactory extends DaffModelFactory<DaffConfigurableProduct>{
constructor(){
super(MockConfigurableProduct);
constructor(
imageFactory: DaffProductImageFactory,
) {
super(MockConfigurableProduct, imageFactory);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,6 @@ describe('Driver | InMemory | Product | DaffInMemoryBackendProductService', () =
expect(result.products.length).toBeGreaterThan(2);
expect(isProduct(result.products[0])).toBeTruthy();
});

it('should return Products that have 5 images', () => {
expect(result.products[0].images.length).toEqual(5);
});
});

describe('get', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export class DaffInMemoryBackendProductService implements InMemoryDbService {
'1033',
'1034',
'1035',
].map(id => this.productFactory.create({ id, url: `/${id}`, images: this.productImageFactory.createMany(5) }));
].map(id => this.productFactory.create({ id, url: `/${id}` }));
}

/**
Expand Down
24 changes: 16 additions & 8 deletions libs/product/testing/src/factories/default-product.factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import {
DaffProductTypeEnum,
} from '@daffodil/product';

import { DaffProductImageFactory } from './product-image.factory';

/**
* Mocked DaffProduct object.
*/
Expand All @@ -24,14 +26,18 @@ export class MockProduct implements DaffProduct {
amount: this.stubDiscount,
percent: Math.floor((this.stubDiscount/this.stubPrice) * 100),
};
images = [];
thumbnail = null;
images = this.imageFactory.createMany(faker.datatype.number({ min: 1, max: 10 }));
thumbnail = this.imageFactory.create();
name = faker.commerce.productName();
brand = faker.company.companyName();
description = 'Lorem ipsum dolor sit amet, accumsan ullamcorper ei eam. Sint appetere ocurreret no per, et cum lorem disputationi. Sit ut magna delenit, assum vidisse vocibus sed ut. In aperiri malorum accusamus sea, novum mediocritatem ius at. Duo agam probo honestatis ut. Nec regione splendide cu, unum graeco vivendum in duo.';
short_description = 'Lorem ipsum dolor sit amet, accumsan ullamcorper ei eam. Sint appetere ocurreret no per, et cum lorem disputationi. Sit ut magna delenit, assum vidisse vocibus sed ut. In aperiri malorum accusamus sea, novum mediocritatem ius at. Duo agam probo honestatis ut.';
brand = faker.company.name();
description = faker.commerce.productDescription();
short_description = faker.commerce.productDescription();
meta_title = faker.commerce.productName();
meta_description = 'Lorem ipsum dolor sit amet, accumsan ullamcorper ei eam. Sint appetere ocurreret no per, et cum lorem disputationi. Sit ut magna delenit, assum vidisse vocibus sed ut. In aperiri malorum accusamus sea, novum mediocritatem ius at. Duo agam probo honestatis ut. Nec regione splendide cu, unum graeco vivendum in duo.';
meta_description = faker.commerce.productDescription();

constructor(
protected imageFactory: DaffProductImageFactory,
) {}
}

/**
Expand All @@ -41,7 +47,9 @@ export class MockProduct implements DaffProduct {
providedIn: 'root',
})
export class DaffDefaultProductFactory extends DaffModelFactory<DaffProduct> {
constructor() {
super(MockProduct);
constructor(
imageFactory: DaffProductImageFactory,
) {
super(MockProduct, imageFactory);
}
}
Loading

0 comments on commit 48f4ba0

Please sign in to comment.