test: clean up async behaviour

This commit is contained in:
Jovan Krunić
2022-02-22 11:09:22 +01:00
parent 89dc41ad35
commit 37fe25c42f
9 changed files with 188 additions and 199 deletions

View File

@@ -14,7 +14,7 @@
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
import {TestBed, waitForAsync} from '@angular/core/testing'; import {TestBed} from '@angular/core/testing';
import {Platform} from '@ionic/angular'; import {Platform} from '@ionic/angular';
@@ -43,68 +43,64 @@ describe('AppComponent', () => {
let platformIsSpy; let platformIsSpy;
let storageProvider: jasmine.SpyObj<StorageProvider>; let storageProvider: jasmine.SpyObj<StorageProvider>;
beforeEach( beforeEach(() => {
waitForAsync(() => { platformReadySpy = Promise.resolve();
platformReadySpy = Promise.resolve(); platformIsSpy = Promise.resolve();
platformIsSpy = Promise.resolve(); platformSpy = jasmine.createSpyObj('Platform', {
platformSpy = jasmine.createSpyObj('Platform', { ready: platformReadySpy,
ready: platformReadySpy, is: platformIsSpy,
is: platformIsSpy, });
}); translateServiceSpy = jasmine.createSpyObj('TranslateService', [
translateServiceSpy = jasmine.createSpyObj('TranslateService', [ 'setDefaultLang',
'setDefaultLang', 'use',
'use', ]);
]); thingTranslateServiceSpy = jasmine.createSpyObj('ThingTranslateService', [
thingTranslateServiceSpy = jasmine.createSpyObj('ThingTranslateService', [ 'init',
'init', ]);
]); settingsProvider = jasmine.createSpyObj('SettingsProvider', [
settingsProvider = jasmine.createSpyObj('SettingsProvider', [ 'getSettingValue',
'getSettingValue', 'provideSetting',
'provideSetting', 'setCategoriesOrder',
'setCategoriesOrder', ]);
]); scheduleSyncServiceSpy = jasmine.createSpyObj('ScheduleSyncService', [
scheduleSyncServiceSpy = jasmine.createSpyObj('ScheduleSyncService', [ 'getDifferences',
'getDifferences', 'postDifferencesNotification',
'postDifferencesNotification', ]);
]); configProvider = jasmine.createSpyObj('ConfigProvider', [
configProvider = jasmine.createSpyObj('ConfigProvider', [ 'init',
'init', 'getAnyValue',
'getAnyValue', ]);
]); configProvider.getAnyValue = jasmine.createSpy().and.callFake(function () {
configProvider.getAnyValue = jasmine return sampleAuthConfiguration;
.createSpy() });
.and.callFake(function () { ngxLogger = jasmine.createSpyObj('NGXLogger', ['log', 'error', 'warn']);
return sampleAuthConfiguration; storageProvider = jasmine.createSpyObj('StorageProvider', [
}); 'init',
ngxLogger = jasmine.createSpyObj('NGXLogger', ['log', 'error', 'warn']); 'get',
storageProvider = jasmine.createSpyObj('StorageProvider', [ 'has',
'init', 'put',
'get', ]);
'has',
'put',
]);
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [ imports: [
RouterTestingModule.withRoutes([]), RouterTestingModule.withRoutes([]),
HttpClientTestingModule, HttpClientTestingModule,
AuthModule, AuthModule,
], ],
declarations: [AppComponent], declarations: [AppComponent],
providers: [ providers: [
{provide: Platform, useValue: platformSpy}, {provide: Platform, useValue: platformSpy},
{provide: TranslateService, useValue: translateServiceSpy}, {provide: TranslateService, useValue: translateServiceSpy},
{provide: ThingTranslateService, useValue: thingTranslateServiceSpy}, {provide: ThingTranslateService, useValue: thingTranslateServiceSpy},
{provide: ScheduleSyncService, useValue: scheduleSyncServiceSpy}, {provide: ScheduleSyncService, useValue: scheduleSyncServiceSpy},
{provide: SettingsProvider, useValue: settingsProvider}, {provide: SettingsProvider, useValue: settingsProvider},
{provide: ConfigProvider, useValue: configProvider}, {provide: ConfigProvider, useValue: configProvider},
{provide: NGXLogger, useValue: ngxLogger}, {provide: NGXLogger, useValue: ngxLogger},
{provide: StorageProvider, useValue: storageProvider}, {provide: StorageProvider, useValue: storageProvider},
], ],
schemas: [CUSTOM_ELEMENTS_SCHEMA], schemas: [CUSTOM_ELEMENTS_SCHEMA],
}).compileComponents(); }).compileComponents();
}), });
);
it('should create the app', () => { it('should create the app', () => {
const fixture = TestBed.createComponent(AppComponent); const fixture = TestBed.createComponent(AppComponent);

View File

@@ -14,7 +14,7 @@
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {CUSTOM_ELEMENTS_SCHEMA, DebugElement} from '@angular/core'; import {CUSTOM_ELEMENTS_SCHEMA, DebugElement} from '@angular/core';
import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; import {ComponentFixture, TestBed} from '@angular/core/testing';
import {ActivatedRoute, RouterModule} from '@angular/router'; import {ActivatedRoute, RouterModule} from '@angular/router';
import {IonRefresher, IonTitle} from '@ionic/angular'; import {IonRefresher, IonTitle} from '@ionic/angular';
import { import {
@@ -71,33 +71,31 @@ describe('DataDetailComponent', () => {
'search', 'search',
]); ]);
beforeEach( beforeEach(() => {
waitForAsync(() => { TestBed.configureTestingModule({
TestBed.configureTestingModule({ imports: [
imports: [ RouterModule.forRoot([], {relativeLinkResolution: 'legacy'}),
RouterModule.forRoot([], {relativeLinkResolution: 'legacy'}), DataRoutingModule,
DataRoutingModule, DataModule,
DataModule, TranslateModule.forRoot({
TranslateModule.forRoot({ loader: {provide: TranslateLoader, useClass: TranslateFakeLoader},
loader: {provide: TranslateLoader, useClass: TranslateFakeLoader}, }),
}), ],
], providers: [
providers: [ {
{ provide: ActivatedRoute,
provide: ActivatedRoute, useValue: fakeActivatedRoute,
useValue: fakeActivatedRoute, },
}, {
{ provide: StorageProvider,
provide: StorageProvider, useValue: storageProviderSpy,
useValue: storageProviderSpy, },
}, ],
], schemas: [CUSTOM_ELEMENTS_SCHEMA],
schemas: [CUSTOM_ELEMENTS_SCHEMA], }).compileComponents();
}).compileComponents(); });
}),
);
beforeEach(async () => { beforeEach(() => {
dataProvider = TestBed.get(DataProvider); dataProvider = TestBed.get(DataProvider);
translateService = TestBed.get(TranslateService); translateService = TestBed.get(TranslateService);
refresher = jasmine.createSpyObj('refresher', ['complete']); refresher = jasmine.createSpyObj('refresher', ['complete']);
@@ -105,7 +103,7 @@ describe('DataDetailComponent', () => {
Promise.resolve(sampleThing), Promise.resolve(sampleThing),
); );
spyOn(DataDetailComponent.prototype, 'getItem').and.callThrough(); spyOn(DataDetailComponent.prototype, 'getItem').and.callThrough();
fixture = await TestBed.createComponent(DataDetailComponent); fixture = TestBed.createComponent(DataDetailComponent);
comp = fixture.componentInstance; comp = fixture.componentInstance;
detailPage = fixture.debugElement; detailPage = fixture.debugElement;
translateService.use('foo'); translateService.use('foo');

View File

@@ -1,4 +1,4 @@
import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; import {ComponentFixture, TestBed} from '@angular/core/testing';
import {DataListComponent} from './data-list.component'; import {DataListComponent} from './data-list.component';
import {TranslateModule} from '@ngx-translate/core'; import {TranslateModule} from '@ngx-translate/core';
@@ -10,21 +10,19 @@ describe('DataListComponent', () => {
let fixture: ComponentFixture<DataListComponent>; let fixture: ComponentFixture<DataListComponent>;
let configProviderMock: jasmine.SpyObj<ConfigProvider>; let configProviderMock: jasmine.SpyObj<ConfigProvider>;
beforeEach( beforeEach(() => {
waitForAsync(() => { configProviderMock = jasmine.createSpyObj('ConfigProvider', {
configProviderMock = jasmine.createSpyObj('ConfigProvider', { getValue: () => {
getValue: () => { return {lat: 123, lng: 123};
return {lat: 123, lng: 123}; },
}, });
}); TestBed.configureTestingModule({
TestBed.configureTestingModule({ declarations: [DataListComponent],
declarations: [DataListComponent], imports: [TranslateModule.forRoot()],
imports: [TranslateModule.forRoot()], schemas: [CUSTOM_ELEMENTS_SCHEMA],
schemas: [CUSTOM_ELEMENTS_SCHEMA], providers: [{provide: ConfigProvider, useValue: configProviderMock}],
providers: [{provide: ConfigProvider, useValue: configProviderMock}], }).compileComponents();
}).compileComponents(); });
}),
);
beforeEach(() => { beforeEach(() => {
fixture = TestBed.createComponent(DataListComponent); fixture = TestBed.createComponent(DataListComponent);

View File

@@ -14,7 +14,7 @@
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; import {ComponentFixture, TestBed} from '@angular/core/testing';
import {ActivatedRoute, RouterModule} from '@angular/router'; import {ActivatedRoute, RouterModule} from '@angular/router';
import {IonRefresher} from '@ionic/angular'; import {IonRefresher} from '@ionic/angular';
import { import {
@@ -72,43 +72,41 @@ describe('DaiaAvailabilityComponent', () => {
'search', 'search',
]); ]);
beforeEach( beforeEach(() => {
waitForAsync(() => { configProviderMock = jasmine.createSpyObj('ConfigProvider', [
configProviderMock = jasmine.createSpyObj('ConfigProvider', [ 'init',
'init', 'getValue',
'getValue', 'getAnyValue',
'getAnyValue', ]);
]); TestBed.configureTestingModule({
TestBed.configureTestingModule({ imports: [
imports: [ RouterModule.forRoot([], {relativeLinkResolution: 'legacy'}),
RouterModule.forRoot([], {relativeLinkResolution: 'legacy'}), HebisRoutingModule,
HebisRoutingModule, HebisModule,
HebisModule, TranslateModule.forRoot({
TranslateModule.forRoot({ loader: {provide: TranslateLoader, useClass: TranslateFakeLoader},
loader: {provide: TranslateLoader, useClass: TranslateFakeLoader}, }),
}), LoggerModule,
LoggerModule, ],
], providers: [
providers: [ {
{ provide: ActivatedRoute,
provide: ActivatedRoute, useValue: fakeActivatedRoute,
useValue: fakeActivatedRoute, },
}, {
{ provide: StorageProvider,
provide: StorageProvider, useValue: storageProviderSpy,
useValue: storageProviderSpy, },
}, {
{ provide: ConfigProvider,
provide: ConfigProvider, useValue: configProviderMock,
useValue: configProviderMock, },
}, NGXLogger,
NGXLogger, LoggerConfig,
LoggerConfig, ],
], schemas: [CUSTOM_ELEMENTS_SCHEMA],
schemas: [CUSTOM_ELEMENTS_SCHEMA], }).compileComponents();
}).compileComponents(); });
}),
);
beforeEach(async () => { beforeEach(async () => {
dataProvider = TestBed.get(DaiaDataProvider); dataProvider = TestBed.get(DaiaDataProvider);

View File

@@ -1,4 +1,3 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion,@typescript-eslint/no-explicit-any */
/* /*
* Copyright (C) 2018, 2019 StApps * Copyright (C) 2018, 2019 StApps
* This program is free software: you can redistribute it and/or modify it * This program is free software: you can redistribute it and/or modify it
@@ -13,8 +12,9 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
/* eslint-disable @typescript-eslint/no-non-null-assertion,@typescript-eslint/no-explicit-any */
import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; import {ComponentFixture, TestBed} from '@angular/core/testing';
import {ActivatedRoute, RouterModule} from '@angular/router'; import {ActivatedRoute, RouterModule} from '@angular/router';
import {IonRefresher} from '@ionic/angular'; import {IonRefresher} from '@ionic/angular';
import { import {
@@ -69,33 +69,31 @@ describe('HebisDetailComponent', () => {
'search', 'search',
]); ]);
beforeEach( beforeEach(() => {
waitForAsync(() => { TestBed.configureTestingModule({
TestBed.configureTestingModule({ imports: [
imports: [ RouterModule.forRoot([], {relativeLinkResolution: 'legacy'}),
RouterModule.forRoot([], {relativeLinkResolution: 'legacy'}), HebisRoutingModule,
HebisRoutingModule, HebisModule,
HebisModule, TranslateModule.forRoot({
TranslateModule.forRoot({ loader: {provide: TranslateLoader, useClass: TranslateFakeLoader},
loader: {provide: TranslateLoader, useClass: TranslateFakeLoader}, }),
}), ],
], providers: [
providers: [ {
{ provide: ActivatedRoute,
provide: ActivatedRoute, useValue: fakeActivatedRoute,
useValue: fakeActivatedRoute, },
}, {
{ provide: StorageProvider,
provide: StorageProvider, useValue: storageProviderSpy,
useValue: storageProviderSpy, },
}, ],
], schemas: [CUSTOM_ELEMENTS_SCHEMA],
schemas: [CUSTOM_ELEMENTS_SCHEMA], }).compileComponents();
}).compileComponents(); });
}),
);
beforeEach(async () => { beforeEach(() => {
dataProvider = TestBed.get(HebisDataProvider); dataProvider = TestBed.get(HebisDataProvider);
translateService = TestBed.get(TranslateService); translateService = TestBed.get(TranslateService);
refresher = jasmine.createSpyObj('refresher', ['complete']); refresher = jasmine.createSpyObj('refresher', ['complete']);
@@ -103,7 +101,7 @@ describe('HebisDetailComponent', () => {
Promise.resolve(sampleThing), Promise.resolve(sampleThing),
); );
spyOn(HebisDetailComponent.prototype, 'getItem').and.callThrough(); spyOn(HebisDetailComponent.prototype, 'getItem').and.callThrough();
fixture = await TestBed.createComponent(HebisDetailComponent); fixture = TestBed.createComponent(HebisDetailComponent);
comp = fixture.componentInstance; comp = fixture.componentInstance;
translateService.use('foo'); translateService.use('foo');
fixture.detectChanges(); fixture.detectChanges();

View File

@@ -12,6 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
/* eslint-disable @typescript-eslint/no-non-null-assertion,@typescript-eslint/ban-ts-comment */
import { import {
APP_BASE_HREF, APP_BASE_HREF,
CommonModule, CommonModule,
@@ -36,22 +37,21 @@ import {FilterContext, SortContext} from './context-type';
import {Component} from '@angular/core'; import {Component} from '@angular/core';
import {By} from '@angular/platform-browser'; import {By} from '@angular/platform-browser';
// prettier-ignore
@Component({ @Component({
template: ` template: `<ion-content id="foo"></ion-content
<ion-content id="foo"></ion-content> ><stapps-context contentId="foo"></stapps-context>
<stapps-context contentId="foo"></stapps-context> `,
`,
}) })
class ContextMenuComponentContainer { class ContextMenuContainerComponent {}
}
describe('ContextMenuComponent', async () => { describe('ContextMenuComponent', async () => {
let fixture: ComponentFixture<ContextMenuComponentContainer>; let fixture: ComponentFixture<ContextMenuContainerComponent>;
let instance: ContextMenuComponent; let instance: ContextMenuComponent;
beforeEach(() => { beforeEach(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
declarations: [ContextMenuComponent, ContextMenuComponentContainer], declarations: [ContextMenuComponent, ContextMenuContainerComponent],
providers: [ providers: [
ChildrenOutletContexts, ChildrenOutletContexts,
Location, Location,
@@ -70,8 +70,10 @@ describe('ContextMenuComponent', async () => {
], ],
}).compileComponents(); }).compileComponents();
fixture = TestBed.createComponent(ContextMenuComponentContainer); fixture = TestBed.createComponent(ContextMenuContainerComponent);
instance = fixture.debugElement.query(By.directive(ContextMenuComponent)).componentInstance; instance = fixture.debugElement.query(
By.directive(ContextMenuComponent),
).componentInstance;
}); });
it('should show items in sort context', () => { it('should show items in sort context', () => {

View File

@@ -27,11 +27,11 @@ describe('ContextMenuService', () => {
}); });
it('should update filterQuery', done => { it('should update filterQuery', done => {
service.filterContextChanged$.subscribe(() => { service.filterContextChanged$.subscribe(result => {
service.contextFilterChanged(filterContext);
});
service.filterQueryChanged$.subscribe(result => {
expect(result).toBeDefined(); expect(result).toBeDefined();
expect(service.contextFilter.options[0].buckets.length).toEqual(
filterContext.options[0].buckets.length,
);
done(); done();
}); });
service.updateContextFilter(facetsMock); service.updateContextFilter(facetsMock);
@@ -46,10 +46,7 @@ describe('ContextMenuService', () => {
}); });
it('should update sortQuery', done => { it('should update sortQuery', done => {
service.sortContextChanged$.subscribe(() => { service.sortContextChanged$.subscribe(result => {
service.contextSortChanged(sortContext);
});
service.sortQueryChanged$.subscribe(result => {
expect(result).toBeDefined(); expect(result).toBeDefined();
done(); done();
}); });

View File

@@ -14,7 +14,7 @@
*/ */
import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
import {async, ComponentFixture, TestBed} from '@angular/core/testing'; import {ComponentFixture, TestBed} from '@angular/core/testing';
import {HttpClientTestingModule} from '@angular/common/http/testing'; import {HttpClientTestingModule} from '@angular/common/http/testing';
import {RouterTestingModule} from '@angular/router/testing'; import {RouterTestingModule} from '@angular/router/testing';
import {AuthModule} from '../../auth/auth.module'; import {AuthModule} from '../../auth/auth.module';
@@ -30,7 +30,7 @@ describe('ProfilePage', () => {
let configProvider: ConfigProvider; let configProvider: ConfigProvider;
let storageProvider: jasmine.SpyObj<StorageProvider>; let storageProvider: jasmine.SpyObj<StorageProvider>;
beforeEach(async(() => { beforeEach(() => {
configProvider = jasmine.createSpyObj('ConfigProvider', [ configProvider = jasmine.createSpyObj('ConfigProvider', [
'init', 'init',
'getAnyValue', 'getAnyValue',
@@ -59,7 +59,7 @@ describe('ProfilePage', () => {
], ],
schemas: [CUSTOM_ELEMENTS_SCHEMA], schemas: [CUSTOM_ELEMENTS_SCHEMA],
}).compileComponents(); }).compileComponents();
})); });
beforeEach(() => { beforeEach(() => {
fixture = TestBed.createComponent(ProfilePageComponent); fixture = TestBed.createComponent(ProfilePageComponent);

View File

@@ -13,7 +13,7 @@
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/ban-ts-comment */
import {TestBed} from '@angular/core/testing'; import {TestBed} from '@angular/core/testing';
import {Storage} from '@ionic/storage-angular'; import {Storage} from '@ionic/storage-angular';
import {StorageModule} from './storage.module'; import {StorageModule} from './storage.module';
@@ -52,7 +52,7 @@ describe('StorageProvider', () => {
it('should call ready method of storage on init', async () => { it('should call ready method of storage on init', async () => {
// @ts-ignore // @ts-ignore
spyOn(storage, 'create').and.callFake(() => Promise.resolve(undefined)); spyOn(storage, 'create').and.callFake(() => Promise.resolve());
await storageProvider.init(); await storageProvider.init();
expect(storage.create).toHaveBeenCalled(); expect(storage.create).toHaveBeenCalled();
@@ -69,9 +69,9 @@ describe('StorageProvider', () => {
spyOn(storage, 'get').and.callFake(() => Promise.resolve()); spyOn(storage, 'get').and.callFake(() => Promise.resolve());
try { try {
await storageProvider.get('some-uid'); await storageProvider.get('some-uid');
} catch {
// if not caught, causes issues and tests fail
} }
// if not caught, causes issues and tests fail
catch {}
expect(storage.get).toHaveBeenCalledWith('some-uid'); expect(storage.get).toHaveBeenCalledWith('some-uid');
}); });
@@ -144,7 +144,9 @@ describe('StorageProvider', () => {
}); });
it('should delete one or more entries from the storage', async () => { it('should delete one or more entries from the storage', async () => {
const storageRemoveSpy = spyOn(storage, 'remove').and.callFake(() => Promise.resolve()); const storageRemoveSpy = spyOn(storage, 'remove').and.callFake(() =>
Promise.resolve(),
);
await storageProvider.delete('bar'); await storageProvider.delete('bar');
expect(storage.remove).toHaveBeenCalledTimes(1); expect(storage.remove).toHaveBeenCalledTimes(1);