Browse Source

Merge pull request #10108 from abpframework/remove-deprecated-code

Angular UI: Fix testing errors
pull/10117/head
Mehmet Erim 5 years ago
committed by GitHub
parent
commit
b2452a23ef
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 27
      npm/ng-packs/packages/core/src/lib/tests/application-configuration.service.spec.ts
  2. 12
      npm/ng-packs/packages/core/src/lib/tests/config-state.service.spec.ts
  3. 29
      npm/ng-packs/packages/core/src/lib/tests/localization.service.spec.ts
  4. 2
      npm/ng-packs/packages/core/src/lib/tests/permission.directive.spec.ts
  5. 126
      npm/ng-packs/packages/core/src/lib/tests/visibility.directive.spec.ts
  6. 7
      npm/ng-packs/packages/theme-shared/extensions/src/tests/enum.util.spec.ts
  7. 5
      npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts
  8. 34
      npm/ng-packs/packages/theme-shared/src/lib/tests/modal-container.component.spec.ts
  9. 2
      npm/ng-packs/packages/theme-shared/src/lib/tests/modal.component.spec.ts
  10. 87
      npm/ng-packs/packages/theme-shared/src/lib/tests/modal.service.spec.ts
  11. 46
      npm/ng-packs/packages/theme-shared/src/lib/tests/sort-order-icon.component.spec.ts
  12. 36
      npm/ng-packs/packages/theme-shared/src/lib/tests/validation-utils.spec.ts
  13. 1
      npm/ng-packs/packages/theme-shared/src/lib/tokens/suppress-unsaved-changes-warning.token.ts
  14. 9
      npm/ng-packs/scripts/prod-build.ts

27
npm/ng-packs/packages/core/src/lib/tests/application-configuration.service.spec.ts

@ -1,27 +0,0 @@
import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest';
import { of } from 'rxjs';
import { ApplicationConfigurationService, RestService } from '../services';
describe('ApplicationConfigurationService', () => {
let spectator: SpectatorService<ApplicationConfigurationService>;
const createService = createServiceFactory({
service: ApplicationConfigurationService,
mocks: [RestService],
});
beforeEach(() => (spectator = createService()));
it('should send a GET to application-configuration API', () => {
const rest = spectator.inject(RestService);
const requestSpy = jest.spyOn(rest, 'request');
requestSpy.mockReturnValue(of(null));
spectator.service.getConfiguration().subscribe();
expect(requestSpy).toHaveBeenCalledWith(
{ method: 'GET', url: '/api/abp/application-configuration' },
{},
);
});
});

12
npm/ng-packs/packages/core/src/lib/tests/config-state.service.spec.ts

@ -1,5 +1,7 @@
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { createServiceFactory, SpectatorService } from '@ngneat/spectator/jest';
import { of } from 'rxjs';
import { AbpApplicationConfigurationService } from '../proxy/volo/abp/asp-net-core/mvc/application-configurations/abp-application-configuration.service';
import {
ApplicationConfigurationDto,
CurrentUserDto,
@ -107,14 +109,20 @@ describe('ConfigStateService', () => {
const createService = createServiceFactory({
service: ConfigStateService,
imports: [HttpClientTestingModule],
providers: [{ provide: CORE_OPTIONS, useValue: { skipGetAppConfiguration: true } }],
providers: [
{ provide: CORE_OPTIONS, useValue: { skipGetAppConfiguration: true } },
{
provide: AbpApplicationConfigurationService,
useValue: { get: () => of(CONFIG_STATE_DATA) },
},
],
});
beforeEach(() => {
spectator = createService();
configState = spectator.service;
configState.setState(CONFIG_STATE_DATA);
configState.refreshAppState();
});
describe('#getAll', () => {

29
npm/ng-packs/packages/core/src/lib/tests/localization.service.spec.ts

@ -1,13 +1,15 @@
import { Injector } from '@angular/core';
import { Router } from '@angular/router';
import { createServiceFactory, SpectatorService, SpyObject } from '@ngneat/spectator/jest';
import { of } from 'rxjs';
import { BehaviorSubject } from 'rxjs';
import { AbpApplicationConfigurationService } from '../proxy/volo/abp/asp-net-core/mvc/application-configurations/abp-application-configuration.service';
import { ConfigStateService, SessionStateService } from '../services';
import { LocalizationService } from '../services/localization.service';
import { CORE_OPTIONS } from '../tokens/options.token';
import { CONFIG_STATE_DATA } from './config-state.service.spec';
const appConfigData$ = new BehaviorSubject(CONFIG_STATE_DATA);
describe('LocalizationService', () => {
let spectator: SpectatorService<LocalizationService>;
let sessionState: SpyObject<SessionStateService>;
@ -25,7 +27,7 @@ describe('LocalizationService', () => {
},
{
provide: AbpApplicationConfigurationService,
useValue: { get: () => of(CONFIG_STATE_DATA) },
useValue: { get: () => appConfigData$ },
},
],
});
@ -36,8 +38,9 @@ describe('LocalizationService', () => {
configState = spectator.inject(ConfigStateService);
service = spectator.service;
configState.setState(CONFIG_STATE_DATA);
configState.refreshAppState();
sessionState.setLanguage('tr');
appConfigData$.next(CONFIG_STATE_DATA);
});
describe('#currentLang', () => {
@ -108,12 +111,13 @@ describe('LocalizationService', () => {
`(
'should return observable $expected when resource name is $resource and key is $key',
async ({ resource, key, defaultValue, expected }) => {
configState.setState({
appConfigData$.next({
localization: {
values: { foo: { bar: 'baz' }, x: { y: 'z' } },
defaultResourceName: 'x',
},
});
} as any);
configState.refreshAppState();
service.localize(resource, key, defaultValue).subscribe(result => {
expect(result).toBe(expected);
@ -149,12 +153,13 @@ describe('LocalizationService', () => {
`(
'should return $expected when resource name is $resource and key is $key',
({ resource, key, defaultValue, expected }) => {
configState.setState({
appConfigData$.next({
localization: {
values: { foo: { bar: 'baz' }, x: { y: 'z' } },
defaultResourceName: 'x',
},
});
} as any);
configState.refreshAppState();
const result = service.localizeSync(resource, key, defaultValue);
@ -195,12 +200,13 @@ describe('LocalizationService', () => {
`(
'should return observable $expected when resource names are $resources and keys are $keys',
async ({ resources, keys, defaultValue, expected }) => {
configState.setState({
appConfigData$.next({
localization: {
values: { foo: { bar: 'baz' }, x: { y: 'z' } },
defaultResourceName: 'x',
},
});
} as any);
configState.refreshAppState();
service.localizeWithFallback(resources, keys, defaultValue).subscribe(result => {
expect(result).toBe(expected);
@ -241,12 +247,13 @@ describe('LocalizationService', () => {
`(
'should return $expected when resource names are $resources and keys are $keys',
({ resources, keys, defaultValue, expected }) => {
configState.setState({
appConfigData$.next({
localization: {
values: { foo: { bar: 'baz' }, x: { y: 'z' } },
defaultResourceName: 'x',
},
});
} as any);
configState.refreshAppState();
const result = service.localizeWithFallbackSync(resources, keys, defaultValue);

2
npm/ng-packs/packages/core/src/lib/tests/permission.directive.spec.ts

@ -17,7 +17,7 @@ describe('PermissionDirective', () => {
describe('with condition', () => {
beforeEach(() => {
spectator = createDirective(
`<div id="test-element" [abpPermission]="'test'">Testing Permission Directive</div>`,
`<div id="test-element" *abpPermission="'test'">Testing Permission Directive</div>`,
);
directive = spectator.directive;
});

126
npm/ng-packs/packages/core/src/lib/tests/visibility.directive.spec.ts

@ -1,126 +0,0 @@
import { SpectatorDirective, createDirectiveFactory } from '@ngneat/spectator/jest';
import { VisibilityDirective } from '../directives/visibility.directive';
describe('VisibilityDirective', () => {
let spectator: SpectatorDirective<VisibilityDirective>;
let directive: VisibilityDirective;
const createDirective = createDirectiveFactory({
directive: VisibilityDirective,
});
describe('without content', () => {
beforeEach(() => {
spectator = createDirective('<div [abpVisibility]></div>');
directive = spectator.directive;
});
it('should be created', () => {
expect(directive).toBeTruthy();
});
xit('should be removed', done => {
setTimeout(() => {
expect(spectator.query('div')).toBeFalsy();
done();
}, 0);
});
});
describe('without mutation observer and with content', () => {
beforeEach(() => {
spectator = createDirective('<div [abpVisibility]><p id="content">Content</p></div>');
directive = spectator.directive;
});
it('should not removed', done => {
setTimeout(() => {
expect(spectator.query('div')).toBeTruthy();
done();
}, 0);
});
});
describe('without mutation observer and with focused element', () => {
beforeEach(() => {
spectator = createDirective(
'<div id="main" [abpVisibility]="container"></div><div #container><p id="content">Content</p></div>',
);
directive = spectator.directive;
});
it('should not removed', done => {
setTimeout(() => {
expect(spectator.query('#main')).toBeTruthy();
done();
}, 0);
});
});
describe('without content and with focused element', () => {
beforeEach(() => {
spectator = createDirective(
'<div id="main" [abpVisibility]="container"></div><div #container></div>',
);
directive = spectator.directive;
});
xit('should be removed', done => {
setTimeout(() => {
expect(spectator.query('#main')).toBeFalsy();
done();
}, 0);
});
});
describe('with mutation observer and with content', () => {
beforeEach(() => {
spectator = createDirective('<div [abpVisibility]><div id="content">Content</div></div>');
directive = spectator.directive;
});
xit('should remove the main div element when content removed', done => {
spectator.query('#content').remove();
setTimeout(() => {
expect(spectator.query('div')).toBeFalsy();
done();
}, 0);
});
it('should not remove the main div element', done => {
spectator.query('div').appendChild(document.createElement('div'));
setTimeout(() => {
expect(spectator.query('div')).toBeTruthy();
done();
}, 100);
});
});
describe('with mutation observer and with focused element', () => {
beforeEach(() => {
spectator = createDirective(
'<div id="main" [abpVisibility]="container"></div><div #container><p id="content">Content</p></div>',
);
directive = spectator.directive;
});
xit('should remove the main div element when content removed', done => {
spectator.query('#content').remove();
setTimeout(() => {
expect(spectator.query('#main')).toBeFalsy();
done();
}, 0);
});
it('should not remove the main div element', done => {
spectator.query('#content').appendChild(document.createElement('div'));
setTimeout(() => {
expect(spectator.query('#main')).toBeTruthy();
done();
}, 100);
});
});
});

7
npm/ng-packs/packages/theme-shared/extensions/src/tests/enum.util.spec.ts

@ -1,5 +1,5 @@
import { ConfigStateService, LocalizationService } from '@abp/ng.core';
import { BehaviorSubject } from 'rxjs';
import { BehaviorSubject, of } from 'rxjs';
import { take } from 'rxjs/operators';
import { PropData } from '../lib/models/props';
import { createEnum, createEnumOptions, createEnumValueResolver } from '../lib/utils/enum.util';
@ -109,8 +109,9 @@ describe('Enum Utils', () => {
});
function createMockLocalizationService() {
const configState = new ConfigStateService(null);
configState.setState({ localization: mockL10n } as any);
const fakeAppConfigService = { get: () => of({ localization: mockL10n }) } as any;
const configState = new ConfigStateService(fakeAppConfigService);
configState.refreshAppState();
return new LocalizationService(mockSessionState, null, null, configState);
}

5
npm/ng-packs/packages/theme-shared/extensions/src/tests/state.util.spec.ts

@ -10,8 +10,9 @@ import {
mapEntitiesToContributors,
} from '../lib/utils/state.util';
const configState = new ConfigStateService(null);
configState.setState(createMockState() as any);
const fakeAppConfigService = { get: () => of(createMockState()) } as any;
const configState = new ConfigStateService(fakeAppConfigService);
configState.refreshAppState();
describe('State Utils', () => {
describe('#getObjectExtensionEntitiesFromStore', () => {

34
npm/ng-packs/packages/theme-shared/src/lib/tests/modal-container.component.spec.ts

@ -1,34 +0,0 @@
import { Component, ComponentFactoryResolver, ComponentRef } from '@angular/core';
import { createComponentFactory, Spectator } from '@ngneat/spectator/jest';
import { ModalContainerComponent } from '../components/modal/modal-container.component';
describe('ModalContainerComponent', () => {
@Component({ template: '<div class="foo">bar</div>' })
class TestComponent {}
let componentRef: ComponentRef<TestComponent>;
let spectator: Spectator<ModalContainerComponent>;
const createComponent = createComponentFactory({
component: ModalContainerComponent,
entryComponents: [TestComponent],
});
beforeEach(() => (spectator = createComponent()));
afterEach(() => componentRef.destroy());
describe('#container', () => {
it('should be a ViewContainerRef', () => {
let foo = document.querySelector('div.foo');
expect(foo).toBeNull();
const cfResolver = spectator.inject(ComponentFactoryResolver);
const factory = cfResolver.resolveComponentFactory(TestComponent);
componentRef = spectator.component.container.createComponent(factory);
foo = document.querySelector('div.foo');
expect(foo.textContent).toBe('bar');
});
});
});

2
npm/ng-packs/packages/theme-shared/src/lib/tests/modal.component.spec.ts

@ -103,7 +103,7 @@ describe('ModalComponent', () => {
xit('should close with the abpClose', async () => {
await wait0ms();
spectator.dispatchMouseEvent(spectator.component.abpClose, 'click');
spectator.dispatchMouseEvent(spectator.query('[abpClose]'), 'click');
await wait0ms();

87
npm/ng-packs/packages/theme-shared/src/lib/tests/modal.service.spec.ts

@ -1,87 +0,0 @@
import { Component, TemplateRef, ViewChild } from '@angular/core';
import { createComponentFactory, Spectator } from '@ngneat/spectator/jest';
import { ModalContainerComponent } from '../components/modal/modal-container.component';
import { ModalService } from '../services';
describe('ModalContainerComponent', () => {
@Component({
template: `
<ng-template #ref>
<div class="foo">bar</div>
</ng-template>
`,
})
class TestComponent {
@ViewChild('ref', { static: true })
template: TemplateRef<any>;
constructor(public modalService: ModalService) {}
}
let spectator: Spectator<TestComponent>;
let service: ModalService;
const createComponent = createComponentFactory({
component: TestComponent,
entryComponents: [ModalContainerComponent],
});
beforeEach(() => {
spectator = createComponent();
service = spectator.component.modalService;
});
afterEach(() => {
service.getContainer().clear();
service['containerComponentRef'].changeDetectorRef.detectChanges();
service['containerComponentRef'].destroy();
});
describe('#getContainer', () => {
it('should return the ViewContainerRef of ModalContainerComponent', () => {
let foo = document.querySelector('div.foo');
expect(foo).toBeNull();
const containerRef = service.getContainer();
const embeddedViewRef = containerRef.createEmbeddedView(spectator.component.template);
foo = document.querySelector('div.foo');
expect(foo).toBe(embeddedViewRef.rootNodes[0]);
expect(foo.textContent).toBe('bar');
});
});
describe('#renderTemplate', () => {
it('should render given template using the ViewContainerRef of ModalContainerComponent', () => {
let foo = document.querySelector('div.foo');
expect(foo).toBeNull();
service.renderTemplate(spectator.component.template);
foo = document.querySelector('div.foo');
expect(foo.textContent).toBe('bar');
});
});
describe('#detectChanges', () => {
it('should call detectChanges on the containerComponentRef', () => {
const spy = jest.spyOn(service['containerComponentRef'].changeDetectorRef, 'detectChanges');
service.detectChanges();
expect(spy).toHaveBeenCalledTimes(1);
});
});
describe('#clearModal', () => {
it('should call clear on the ViewContainerRef and detectChanges', () => {
const clear = jest.spyOn(service.getContainer(), 'clear');
const detectChanges = jest.spyOn(service, 'detectChanges');
service.clearModal();
expect(clear).toHaveBeenCalledTimes(1);
expect(detectChanges).toHaveBeenCalledTimes(1);
});
});
});

46
npm/ng-packs/packages/theme-shared/src/lib/tests/sort-order-icon.component.spec.ts

@ -1,46 +0,0 @@
import { createHostFactory, SpectatorHost } from '@ngneat/spectator/jest';
import { SortOrderIconComponent } from '../components/sort-order-icon/sort-order-icon.component';
describe('SortOrderIconComponent', () => {
let spectator: SpectatorHost<SortOrderIconComponent>;
let component: SortOrderIconComponent;
const createHost = createHostFactory(SortOrderIconComponent);
beforeEach(() => {
spectator = createHost(
'<abp-sort-order-icon sortKey="testKey" [(selectedSortKey)]="selectedSortKey" [(order)]="order"></abp-sort-order-icon>',
{
hostProps: {
selectedSortKey: '',
order: '',
},
},
);
component = spectator.component;
});
test('should have correct icon class when selectedSortKey and sortKey are the same', () => {
const newKey = 'testKey';
component.sort(newKey);
expect(component.selectedSortKey).toBe(newKey);
expect(component.order).toBe('asc');
expect(component.icon).toBe('sorting_asc');
});
test("shouldn't have any icon class when sortKey and selectedSortKey are different", () => {
const newKey = 'otherKey';
component.sort(newKey);
expect(component.selectedSortKey).toBe(newKey);
expect(component.order).toBe('asc');
expect(component.icon).toBe('sorting');
});
test('should change order correctly when sort function called', () => {
component.sort('testKey');
expect(component.order).toBe('asc');
component.sort('testKey');
expect(component.order).toBe('desc');
component.sort('testKey');
expect(component.order).toBe('');
});
});

36
npm/ng-packs/packages/theme-shared/src/lib/tests/validation-utils.spec.ts

@ -1,4 +1,4 @@
import { ConfigStateService } from '@abp/ng.core';
import { AbpApplicationConfigurationService, ConfigStateService } from '@abp/ng.core';
import { CoreTestingModule } from '@abp/ng.core/testing';
import { HttpClient } from '@angular/common/http';
import { Component, Injector } from '@angular/core';
@ -6,6 +6,7 @@ import { Validators } from '@angular/forms';
import { createComponentFactory, Spectator } from '@ngneat/spectator/jest';
import { NgxValidateCoreModule, validatePassword } from '@ngx-validate/core';
import { OAuthService } from 'angular-oauth2-oidc';
import { of } from 'rxjs';
import { getPasswordValidators } from '../utils';
@Component({ template: '', selector: 'abp-dummy' })
class DummyComponent {}
@ -16,6 +17,26 @@ describe('ValidationUtils', () => {
component: DummyComponent,
imports: [CoreTestingModule.withConfig(), NgxValidateCoreModule.forRoot()],
mocks: [HttpClient, OAuthService],
providers: [
{
provide: AbpApplicationConfigurationService,
useValue: {
get: () =>
of({
setting: {
values: {
'Abp.Identity.Password.RequiredLength': '6',
'Abp.Identity.Password.RequiredUniqueChars': '1',
'Abp.Identity.Password.RequireNonAlphanumeric': 'True',
'Abp.Identity.Password.RequireLowercase': 'True',
'Abp.Identity.Password.RequireUppercase': 'True',
'Abp.Identity.Password.RequireDigit': 'True',
},
},
}),
},
},
],
});
beforeEach(() => (spectator = createComponent()));
@ -23,18 +44,7 @@ describe('ValidationUtils', () => {
describe('#getPasswordValidators', () => {
it('should return password valdiators', () => {
const configState = spectator.inject(ConfigStateService);
configState.setState({
setting: {
values: {
'Abp.Identity.Password.RequiredLength': '6',
'Abp.Identity.Password.RequiredUniqueChars': '1',
'Abp.Identity.Password.RequireNonAlphanumeric': 'True',
'Abp.Identity.Password.RequireLowercase': 'True',
'Abp.Identity.Password.RequireUppercase': 'True',
'Abp.Identity.Password.RequireDigit': 'True',
},
},
});
configState.refreshAppState();
const validators = getPasswordValidators(spectator.inject(Injector));
const expectedValidators = [

1
npm/ng-packs/packages/theme-shared/src/lib/tokens/suppress-unsaved-changes-warning.token.ts

@ -1,6 +1,5 @@
import { InjectionToken } from '@angular/core';
// TODO: Should be documented
export const SUPPRESS_UNSAVED_CHANGES_WARNING = new InjectionToken<boolean>(
'SUPPRESS_UNSAVED_CHANGES_WARNING',
);

9
npm/ng-packs/scripts/prod-build.ts

@ -17,15 +17,6 @@ import fse from 'fs-extra';
overwrite: true,
});
// TODO: Will be removed in v3.1, it is added to fix the prod build error
await fse.copy(
'../node_modules/@swimlane',
'../../../templates/app/angular/node_modules/@swimlane',
{
overwrite: true,
},
);
await execa('yarn', ['ng', 'build', '--prod'], {
stdout: 'inherit',
cwd: '../../../templates/app/angular',

Loading…
Cancel
Save