feat(products): add resolvers
This commit is contained in:
58
src/app/resolvers/product-resolver.spec.ts
Normal file
58
src/app/resolvers/product-resolver.spec.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
import { TestBed } from '@angular/core/testing';
|
||||
import { provideRouter, RedirectCommand, ResolveFn, Router } from '@angular/router';
|
||||
|
||||
import { productResolver } from './product-resolver';
|
||||
import { Product } from '../models/Product';
|
||||
import { ProductDAO } from '../dao/ProductDAO';
|
||||
import { Component } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'app-mock',
|
||||
template: ``,
|
||||
styles: ``,
|
||||
})
|
||||
class MockComponent {}
|
||||
|
||||
describe('productResolver', () => {
|
||||
const executeResolver: ResolveFn<Product | RedirectCommand> = (...resolverParameters) =>
|
||||
TestBed.runInInjectionContext(() => productResolver(...resolverParameters));
|
||||
|
||||
let productDAO: Partial<ProductDAO>;
|
||||
let router: Router;
|
||||
|
||||
let PRODUCT_MOCK: Product;
|
||||
beforeEach(() => {
|
||||
productDAO = {
|
||||
findBy: vi.fn().mockResolvedValue([]),
|
||||
};
|
||||
|
||||
PRODUCT_MOCK = new Product('mock','mock','',1);
|
||||
|
||||
TestBed.configureTestingModule({
|
||||
providers: [
|
||||
provideRouter([
|
||||
{ path: 'mock/:id', component: MockComponent, resolve: { product: productResolver } },
|
||||
{ path: 'settings/products', component: MockComponent },
|
||||
]),
|
||||
{ provide: ProductDAO, useValue: productDAO },
|
||||
],
|
||||
});
|
||||
|
||||
router = TestBed.inject(Router);
|
||||
});
|
||||
|
||||
it('should be created', () => {
|
||||
expect(executeResolver).toBeTruthy();
|
||||
});
|
||||
|
||||
it('should navigate back to settings for not found ids', async () => {
|
||||
await router.navigate(['mock', '99']);
|
||||
expect(router.url).toEqual('/settings/products');
|
||||
});
|
||||
|
||||
it('should complete navigation for found ids', async () => {
|
||||
productDAO.findBy = vi.fn().mockResolvedValue([PRODUCT_MOCK]);
|
||||
await router.navigate(['mock', String(PRODUCT_MOCK.id)]);
|
||||
expect(router.url).toEqual(`/mock/${PRODUCT_MOCK.id}`);
|
||||
});
|
||||
});
|
||||
25
src/app/resolvers/product-resolver.ts
Normal file
25
src/app/resolvers/product-resolver.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import { inject } from '@angular/core';
|
||||
import { RedirectCommand, ResolveFn, Router } from '@angular/router';
|
||||
import { ProductDAO } from '../dao/ProductDAO';
|
||||
import { Product } from '../models/Product';
|
||||
|
||||
export const productResolver: ResolveFn<Product|RedirectCommand> = async (route, _) => {
|
||||
const productDAO = inject(ProductDAO);
|
||||
const router = inject(Router);
|
||||
const chainID = (<{ id: string }>route.params).id;
|
||||
let product: Product;
|
||||
|
||||
try {
|
||||
const results = await productDAO.findBy({ id: Number(chainID) });
|
||||
if (!results[0]) {
|
||||
throw new Error('The search for chain on edit did not find any match');
|
||||
}
|
||||
product = results[0];
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
return new RedirectCommand(router.parseUrl('settings/products'), {
|
||||
skipLocationChange: true,
|
||||
});
|
||||
}
|
||||
return product;
|
||||
};
|
||||
48
src/app/resolvers/products-resolver.spec.ts
Normal file
48
src/app/resolvers/products-resolver.spec.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
import { TestBed } from '@angular/core/testing';
|
||||
import { provideRouter, ResolveFn, Router } from '@angular/router';
|
||||
|
||||
import { productsResolver } from './products-resolver';
|
||||
import { Product } from '../models/Product';
|
||||
import { ProductDAO } from '../dao/ProductDAO';
|
||||
import { Component } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'app-mock',
|
||||
template: ``,
|
||||
styles: ``,
|
||||
})
|
||||
class MockComponent {}
|
||||
|
||||
describe('productsResolver', () => {
|
||||
const executeResolver: ResolveFn<Product[]> = (...resolverParameters) =>
|
||||
TestBed.runInInjectionContext(() => productsResolver(...resolverParameters));
|
||||
|
||||
let productDAO: Partial<ProductDAO>;
|
||||
let router: Router;
|
||||
|
||||
beforeEach(() => {
|
||||
productDAO = {
|
||||
findAll: vi.fn().mockResolvedValue([]),
|
||||
};
|
||||
|
||||
TestBed.configureTestingModule({
|
||||
providers: [
|
||||
provideRouter([
|
||||
{ path: 'products', component: MockComponent, resolve: { products: productsResolver } },
|
||||
]),
|
||||
{ provide: ProductDAO, useValue: productDAO },
|
||||
],
|
||||
});
|
||||
|
||||
router = TestBed.inject(Router);
|
||||
});
|
||||
|
||||
it('should be created', () => {
|
||||
expect(executeResolver).toBeTruthy();
|
||||
});
|
||||
|
||||
it('should call productDAO findAll method', async () => {
|
||||
await router.navigate(['products']);
|
||||
expect(productDAO.findAll).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
17
src/app/resolvers/products-resolver.ts
Normal file
17
src/app/resolvers/products-resolver.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import { ResolveFn } from '@angular/router';
|
||||
import { ProductDAO } from '../dao/ProductDAO';
|
||||
import { inject } from '@angular/core';
|
||||
import { Product } from '../models/Product';
|
||||
|
||||
export const productsResolver: ResolveFn<Product[]> = async (route, state) => {
|
||||
const productDAO = inject(ProductDAO);
|
||||
let products: Product[] = [];
|
||||
|
||||
try {
|
||||
products = await productDAO.findAll()
|
||||
} catch(e) {
|
||||
console.error(e);
|
||||
//TODO: report error
|
||||
}
|
||||
return products;
|
||||
};
|
||||
Reference in New Issue
Block a user