fixed issues with ngrx platform upgrade: selectors, tests and router state in the dev tools

This commit is contained in:
Art Lowel
2017-09-06 16:50:01 +02:00
parent 32e91962f3
commit 30ee3859c8
16 changed files with 69 additions and 39 deletions

View File

@@ -80,9 +80,9 @@
"@angularclass/bootloader": "1.0.1", "@angularclass/bootloader": "1.0.1",
"@angularclass/idle-preload": "1.0.4", "@angularclass/idle-preload": "1.0.4",
"@ng-bootstrap/ng-bootstrap": "1.0.0-alpha.28", "@ng-bootstrap/ng-bootstrap": "1.0.0-alpha.28",
"@ngrx/effects": "^4.0.1", "@ngrx/effects": "^4.0.5",
"@ngrx/router-store": "^4.0.0", "@ngrx/router-store": "^4.0.4",
"@ngrx/store": "^4.0.0", "@ngrx/store": "^4.0.3",
"@nguniversal/express-engine": "1.0.0-beta.2", "@nguniversal/express-engine": "1.0.0-beta.2",
"@ngx-translate/core": "7.1.0", "@ngx-translate/core": "7.1.0",
"@ngx-translate/http-loader": "0.1.0", "@ngx-translate/http-loader": "0.1.0",

View File

@@ -45,7 +45,7 @@ describe('App component', () => {
return TestBed.configureTestingModule({ return TestBed.configureTestingModule({
imports: [ imports: [
CommonModule, CommonModule,
StoreModule.provideStore({}), StoreModule.forRoot({}),
TranslateModule.forRoot({ TranslateModule.forRoot({
loader: { loader: {
provide: TranslateLoader, provide: TranslateLoader,

View File

@@ -45,7 +45,7 @@ export function getConfig() {
CommunityPageModule, CommunityPageModule,
AppRoutingModule, AppRoutingModule,
StoreModule.forRoot(appReducers, { metaReducers: appMetaReducers }), StoreModule.forRoot(appReducers, { metaReducers: appMetaReducers }),
// !getConfig().production ? StoreDevtoolsModule.instrument({ maxAge: 50 }) : [], StoreDevtoolsModule.instrument({ maxAge: 50 }),
EffectsModule.forRoot(appEffects) EffectsModule.forRoot(appEffects)
], ],
providers: [ providers: [

View File

@@ -25,7 +25,8 @@ import { CoreModule } from './core/core.module';
import { AppModule } from './app.module'; import { AppModule } from './app.module';
import { AppComponent } from './app.component'; import { AppComponent } from './app.component';
import { StoreRouterConnectingModule } from '@ngrx/router-store'; import { RouterStateSerializer, StoreRouterConnectingModule } from '@ngrx/router-store';
import { DSpaceRouterStateSerializer } from './shared/ngrx/dspace-router-state-serializer';
export function init(cache: TransferState) { export function init(cache: TransferState) {
return () => { return () => {
@@ -70,6 +71,10 @@ export function HttpLoaderFactory(http: Http) {
deps: [ deps: [
TransferState TransferState
] ]
},
{
provide: RouterStateSerializer,
useClass: DSpaceRouterStateSerializer
} }
] ]
}) })

View File

@@ -90,7 +90,7 @@ export class RemoteDataBuildService {
).filter((normalized) => hasValue(normalized)) ).filter((normalized) => hasValue(normalized))
.map((normalized: TNormalized) => { .map((normalized: TNormalized) => {
return this.build<TNormalized, TDomain>(normalized); return this.build<TNormalized, TDomain>(normalized);
}); }).distinctUntilChanged();
return new RemoteData( return new RemoteData(
href, href,

View File

@@ -2,8 +2,9 @@ import { Store } from '@ngrx/store';
import { Observable } from 'rxjs/Observable'; import { Observable } from 'rxjs/Observable';
import { ObjectCacheService } from './object-cache.service'; import { ObjectCacheService } from './object-cache.service';
import { ObjectCacheState, CacheableObject } from './object-cache.reducer'; import { CacheableObject } from './object-cache.reducer';
import { AddToObjectCacheAction, RemoveFromObjectCacheAction } from './object-cache.actions'; import { AddToObjectCacheAction, RemoveFromObjectCacheAction } from './object-cache.actions';
import { CoreState } from '../core.reducers';
class TestClass implements CacheableObject { class TestClass implements CacheableObject {
constructor( constructor(
@@ -18,7 +19,7 @@ class TestClass implements CacheableObject {
describe('ObjectCacheService', () => { describe('ObjectCacheService', () => {
let service: ObjectCacheService; let service: ObjectCacheService;
let store: Store<ObjectCacheState>; let store: Store<CoreState>;
const uuid = '1698f1d3-be98-4c51-9fd8-6bfedcbd59b7'; const uuid = '1698f1d3-be98-4c51-9fd8-6bfedcbd59b7';
const requestHref = 'https://rest.api/endpoint/1698f1d3-be98-4c51-9fd8-6bfedcbd59b7'; const requestHref = 'https://rest.api/endpoint/1698f1d3-be98-4c51-9fd8-6bfedcbd59b7';
@@ -36,7 +37,7 @@ describe('ObjectCacheService', () => {
const invalidCacheEntry = Object.assign({}, cacheEntry, { msToLive: -1 }); const invalidCacheEntry = Object.assign({}, cacheEntry, { msToLive: -1 });
beforeEach(() => { beforeEach(() => {
store = new Store<ObjectCacheState>(undefined, undefined, undefined); store = new Store<CoreState>(undefined, undefined, undefined);
spyOn(store, 'dispatch'); spyOn(store, 'dispatch');
service = new ObjectCacheService(store); service = new ObjectCacheService(store);

View File

@@ -92,7 +92,7 @@ export class ObjectCacheService {
} }
getRequestHrefBySelfLink(self: string): Observable<string> { getRequestHrefBySelfLink(self: string): Observable<string> {
return this.store.select('index/href', self) return this.store.select(uuidFromHrefSelector(self))
.flatMap((uuid: string) => this.getRequestHref(uuid)); .flatMap((uuid: string) => this.getRequestHref(uuid));
} }

View File

@@ -11,7 +11,7 @@ import { CoreState } from '../core.reducers';
import { keySelector } from '../shared/selectors'; import { keySelector } from '../shared/selectors';
function entryFromKeySelector(key: string): MemoizedSelector<CoreState, ResponseCacheEntry> { function entryFromKeySelector(key: string): MemoizedSelector<CoreState, ResponseCacheEntry> {
return keySelector<ResponseCacheEntry>('data/reponse', key); return keySelector<ResponseCacheEntry>('data/response', key);
} }
/** /**

View File

@@ -4,7 +4,7 @@ import { MemoizedSelector, Store } from '@ngrx/store';
import { Observable } from 'rxjs/Observable'; import { Observable } from 'rxjs/Observable';
import { RequestEntry, RequestState } from './request.reducer'; import { RequestEntry } from './request.reducer';
import { Request } from './request.models'; import { Request } from './request.models';
import { hasValue } from '../../shared/empty.util'; import { hasValue } from '../../shared/empty.util';
import { RequestConfigureAction, RequestExecuteAction } from './request.actions'; import { RequestConfigureAction, RequestExecuteAction } from './request.actions';

View File

@@ -33,7 +33,7 @@ describe('Footer component', () => {
// async beforeEach // async beforeEach
beforeEach(async(() => { beforeEach(async(() => {
return TestBed.configureTestingModule({ return TestBed.configureTestingModule({
imports: [CommonModule, StoreModule.provideStore({}), TranslateModule.forRoot({ imports: [CommonModule, StoreModule.forRoot({}), TranslateModule.forRoot({
loader: { loader: {
provide: TranslateLoader, provide: TranslateLoader,
useClass: MockTranslateLoader useClass: MockTranslateLoader

View File

@@ -21,7 +21,7 @@ describe('HeaderComponent', () => {
// async beforeEach // async beforeEach
beforeEach(async(() => { beforeEach(async(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [StoreModule.provideStore({}), TranslateModule.forRoot(), NgbCollapseModule.forRoot()], imports: [StoreModule.forRoot({}), TranslateModule.forRoot(), NgbCollapseModule.forRoot()],
declarations: [HeaderComponent] declarations: [HeaderComponent]
}) })
.compileComponents(); // compile template and css .compileComponents(); // compile template and css
@@ -70,7 +70,7 @@ describe('HeaderComponent', () => {
beforeEach(() => { beforeEach(() => {
menu = fixture.debugElement.query(By.css('#collapsingNav')).nativeElement; menu = fixture.debugElement.query(By.css('#collapsingNav')).nativeElement;
spyOn(store, 'select').and.returnValue(Observable.of({ navCollapsed: false })); spyOn(store, 'select').and.returnValue(Observable.of(false));
fixture.detectChanges(); fixture.detectChanges();
}); });

View File

@@ -37,7 +37,8 @@ import { AppModule } from './app.module';
import { AppComponent } from './app.component'; import { AppComponent } from './app.component';
import { GLOBAL_CONFIG, GlobalConfig } from '../config'; import { GLOBAL_CONFIG, GlobalConfig } from '../config';
import { StoreRouterConnectingModule } from '@ngrx/router-store'; import { RouterStateSerializer, StoreRouterConnectingModule } from '@ngrx/router-store';
import { DSpaceRouterStateSerializer } from './shared/ngrx/dspace-router-state-serializer';
export function boot(cache: TransferState, appRef: ApplicationRef, store: Store<AppState>, request: Request, config: GlobalConfig) { export function boot(cache: TransferState, appRef: ApplicationRef, store: Store<AppState>, request: Request, config: GlobalConfig) {
// authentication mechanism goes here // authentication mechanism goes here
@@ -88,6 +89,10 @@ export function UniversalLoaderFactory() {
REQUEST, REQUEST,
GLOBAL_CONFIG GLOBAL_CONFIG
] ]
},
{
provide: RouterStateSerializer,
useClass: DSpaceRouterStateSerializer
} }
] ]
}) })

View File

@@ -1,17 +1,18 @@
import { Store } from '@ngrx/store'; import { Store } from '@ngrx/store';
import { Observable } from 'rxjs/Observable'; import { Observable } from 'rxjs/Observable';
import { AppState } from '../app.reducer';
import { HostWindowState } from './host-window.reducer';
import { HostWindowService } from './host-window.service'; import { HostWindowService } from './host-window.service';
import { HostWindowState } from './host-window.reducer';
describe('HostWindowService', () => { describe('HostWindowService', () => {
let service: HostWindowService; let service: HostWindowService;
let store: Store<HostWindowState>; let store: Store<AppState>;
describe('', () => { describe('', () => {
beforeEach(() => { beforeEach(() => {
const _initialState = { width: 1600, height: 770 }; const _initialState = { hostWindow: { width: 1600, height: 770 } };
store = new Store<HostWindowState>(undefined, undefined, Observable.of(_initialState)); store = new Store<AppState>(Observable.of(_initialState), undefined, undefined);
service = new HostWindowService(store); service = new HostWindowService(store);
}); });
@@ -46,8 +47,8 @@ describe('HostWindowService', () => {
describe('', () => { describe('', () => {
beforeEach(() => { beforeEach(() => {
const _initialState = { width: 1100, height: 770 }; const _initialState = { hostWindow: { width: 1100, height: 770 } };
store = new Store<HostWindowState>(undefined, undefined, Observable.of(_initialState)); store = new Store<AppState>(Observable.of(_initialState), undefined, undefined);
service = new HostWindowService(store); service = new HostWindowService(store);
}); });
@@ -82,8 +83,8 @@ describe('HostWindowService', () => {
describe('', () => { describe('', () => {
beforeEach(() => { beforeEach(() => {
const _initialState = { width: 800, height: 770 }; const _initialState = { hostWindow: { width: 800, height: 770 } };
store = new Store<HostWindowState>(undefined, undefined, Observable.of(_initialState)); store = new Store<AppState>(Observable.of(_initialState), undefined, undefined);
service = new HostWindowService(store); service = new HostWindowService(store);
}); });
@@ -118,8 +119,8 @@ describe('HostWindowService', () => {
describe('', () => { describe('', () => {
beforeEach(() => { beforeEach(() => {
const _initialState = { width: 600, height: 770 }; const _initialState = { hostWindow: { width: 600, height: 770 } };
store = new Store<HostWindowState>(undefined, undefined, Observable.of(_initialState)); store = new Store<AppState>(Observable.of(_initialState), undefined, undefined);
service = new HostWindowService(store); service = new HostWindowService(store);
}); });
@@ -154,8 +155,8 @@ describe('HostWindowService', () => {
describe('', () => { describe('', () => {
beforeEach(() => { beforeEach(() => {
const _initialState = { width: 400, height: 770 }; const _initialState = { hostWindow: { width: 400, height: 770 } };
store = new Store<HostWindowState>(undefined, undefined, Observable.of(_initialState)); store = new Store<AppState>(Observable.of(_initialState), undefined, undefined);
service = new HostWindowService(store); service = new HostWindowService(store);
}); });

View File

@@ -0,0 +1,18 @@
import { RouterStateSerializer } from '@ngrx/router-store';
import { Params, RouterStateSnapshot } from '@angular/router';
export interface RouterStateUrl {
url: string;
queryParams: Params;
}
export class DSpaceRouterStateSerializer implements RouterStateSerializer<RouterStateUrl> {
serialize(routerState: RouterStateSnapshot): RouterStateUrl {
const { url } = routerState;
const queryParams = routerState.root.queryParams;
// Only return an object including the URL and query params
// instead of the entire snapshot
return { url, queryParams };
}
}

View File

@@ -140,7 +140,7 @@ describe('Pagination component', () => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [ imports: [
CommonModule, CommonModule,
StoreModule.provideStore({}), StoreModule.forRoot({}),
TranslateModule.forRoot({ TranslateModule.forRoot({
loader: { loader: {
provide: TranslateLoader, provide: TranslateLoader,

View File

@@ -90,21 +90,21 @@
version "1.0.0-alpha.28" version "1.0.0-alpha.28"
resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-1.0.0-alpha.28.tgz#30a6503bf7f94f9d3187591fb3267b59cc0cdaad" resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-1.0.0-alpha.28.tgz#30a6503bf7f94f9d3187591fb3267b59cc0cdaad"
"@ngrx/effects@^4.0.1": "@ngrx/effects@^4.0.5":
version "4.0.1" version "4.0.5"
resolved "https://registry.yarnpkg.com/@ngrx/effects/-/effects-4.0.1.tgz#9403d5668c70217eb5c84ba7a5ffebbbcf507b34" resolved "https://registry.yarnpkg.com/@ngrx/effects/-/effects-4.0.5.tgz#1224763800621b7305f9b18bc17ee09b25c861d1"
"@ngrx/router-store@^4.0.0": "@ngrx/router-store@^4.0.4":
version "4.0.0" version "4.0.4"
resolved "https://registry.yarnpkg.com/@ngrx/router-store/-/router-store-4.0.0.tgz#22b50297395669834df09c46b5a15a8eb56b871d" resolved "https://registry.yarnpkg.com/@ngrx/router-store/-/router-store-4.0.4.tgz#ab59f35aae93465088384faf009e21b22edd456a"
"@ngrx/store-devtools@^4.0.0": "@ngrx/store-devtools@^4.0.0":
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/@ngrx/store-devtools/-/store-devtools-4.0.0.tgz#b79c24773217df7fd9735ad21f9cbf2533c96e04" resolved "https://registry.yarnpkg.com/@ngrx/store-devtools/-/store-devtools-4.0.0.tgz#b79c24773217df7fd9735ad21f9cbf2533c96e04"
"@ngrx/store@^4.0.0": "@ngrx/store@^4.0.3":
version "4.0.0" version "4.0.3"
resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-4.0.0.tgz#714d82056f0eb31518ca85a68a5cfecfc12cc50b" resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-4.0.3.tgz#36abacdfa19bfb8506e40de80bae06050a1e15e9"
"@ngtools/webpack@1.5.1": "@ngtools/webpack@1.5.1":
version "1.5.1" version "1.5.1"