mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-05-12 17:04:57 +00:00
* remove useless module * upgrade to angular 8 * upgrade material to v8 * upgrade adf libs * migrate demo shell to v8 * upgrade to angular 9 * upgrade material to v9 * remove hammer * upgrade nx * upgrade datetime picker * upgrade flex layout * update core api * remove entry components * code fixes * upgrade testbed usage * code fixes * remove unnecessary core-js from tests * upgrade CLI * ts config fixes * fix builds * fix testing config * compile fixes * fix demo shell dev setup * fix core tests * fix card view import * upgrade nx * disable smart builds for now * remove fdescribe * restore smart builds * fix issues * unify tsconfigs and fix newly found issues * fix configuration and cleanup package scripts * improved production build from the same config * use ADF libs directly instead of node_modules * disable smart build * single app configuration (angular) * fix core build * fix build scripts * lint fixes * fix linting setup * fix linting rules * various fixes * disable affected libs for unit tests * cleanup insights package.json * simplify smart-build * fix content tests * fix tests * test fixes * fix tests * fix test * fix tests * disable AppExtensionsModule (monaco example) * remove monaco extension module * upgrade bundle check rules * fix insights tests and karma config * fix protractor config * e2e workaround * upgrade puppeteer and split linting and build * reusable resources config * update protractor config * fix after rebase * fix protractor config * fix e2e tsconfig * update e2e setup * Save demoshell artifact on S3 and remove travis cache * Push the libs on S3 and fetch before releasing it * Add deps * Add dependencies among libs and run only affected unit test and build * fix the travis stage name * fix after renaming dev to demoshell * force the order of the projects * remove unused dependencies * fix content e2e script * exit codes fix * add extra exit codes to core e2e * postinstall hook and package cleanup * cleanup packages * remove deprecated code and dependency on router * improve bundle analyzer script * minor code fixes * update spec * fix code after rebase * upgrade protractor after rebase * fix e2e mapping lib * Update tsconfig.e2e.json * update e2e tsconfig * fix angular config * fix protractor runs * cache dist folder for libs * update material selectors for dropdowns * selector fixes * remove duplicated e2e that have unit tests already * fix login selector * fix e2e * fix test * fix import issues * fix selector * cleanup old monaco extension files * cleanup demo shell login * add protractor max retries * disable customisations of protractor * fix login validation * fix after rebase * fix after rebase, disable latest versions of libs * Hide the report tab and rollback the localstorage * rename protractor config back to js * restore lint as part of build * cleanup code * do not copy anything to node_modules on dist test * fix unit tests * config fixes * fix code * fix code after rebase * fix tests * remove existing words from spellcheck * remove useless directive decorators * update package.json after rebase * add js-api back * code fixes * add missing export * update configs * fix code * try fix the sso login test * fix * remove puppeteer unit * fix e2e script * fix * make provider easy * fix routes module before upgrade * fix unit tests * upgrade angular cli * upgrade to angular 10 Co-authored-by: maurizio vitale <maurizio.vitale@alfresco.com> Co-authored-by: Eugenio Romano <eugenio.romano@alfresco.com> Co-authored-by: Eugenio Romano <eromano@users.noreply.github.com>
293 lines
8.9 KiB
TypeScript
293 lines
8.9 KiB
TypeScript
/*!
|
|
* @license
|
|
* Copyright 2019 Alfresco Software, Ltd.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import { OverlayContainer } from '@angular/cdk/overlay';
|
|
import { ViewportRuler } from '@angular/cdk/scrolling';
|
|
import { fakeAsync, ComponentFixture, TestBed, tick } from '@angular/core/testing';
|
|
import { ContextMenuHolderComponent } from './context-menu-holder.component';
|
|
import { ContextMenuModule } from './context-menu.module';
|
|
import { ContextMenuService } from './context-menu.service';
|
|
import { setupTestBed } from '../testing/setup-test-bed';
|
|
import { CoreTestingModule } from '../testing';
|
|
import { TranslateModule } from '@ngx-translate/core';
|
|
|
|
describe('ContextMenuHolderComponent', () => {
|
|
let fixture: ComponentFixture<ContextMenuHolderComponent>;
|
|
let component: ContextMenuHolderComponent;
|
|
let contextMenuService: ContextMenuService;
|
|
const overlayContainer = {
|
|
getContainerElement: () => ({
|
|
addEventListener: () => {},
|
|
querySelector: (val) => ({
|
|
name: val,
|
|
clientWidth: 0,
|
|
clientHeight: 0,
|
|
parentElement: {
|
|
style: {
|
|
left: 0,
|
|
top: 0
|
|
}
|
|
}
|
|
})
|
|
|
|
})
|
|
};
|
|
|
|
const getViewportRect = {
|
|
getViewportRect: () => ({
|
|
left: 0, top: 0, width: 1014, height: 686, bottom: 0, right: 0
|
|
})
|
|
};
|
|
|
|
setupTestBed({
|
|
imports: [
|
|
TranslateModule.forRoot(),
|
|
CoreTestingModule,
|
|
ContextMenuModule
|
|
],
|
|
providers: [
|
|
{
|
|
provide: OverlayContainer,
|
|
useValue: overlayContainer
|
|
},
|
|
{
|
|
provide: ViewportRuler,
|
|
useValue: getViewportRect
|
|
}
|
|
]
|
|
});
|
|
|
|
beforeEach(() => {
|
|
fixture = TestBed.createComponent(ContextMenuHolderComponent);
|
|
component = fixture.componentInstance;
|
|
contextMenuService = TestBed.inject(ContextMenuService);
|
|
|
|
component.ngOnDestroy = () => {};
|
|
fixture.detectChanges();
|
|
});
|
|
|
|
beforeEach(() => {
|
|
spyOn(component.menuTrigger, 'openMenu');
|
|
});
|
|
|
|
describe('Events', () => {
|
|
it('should show menu on service event', () => {
|
|
spyOn(component, 'showMenu');
|
|
|
|
contextMenuService.show.next(<any> {});
|
|
|
|
expect(component.showMenu).toHaveBeenCalled();
|
|
});
|
|
|
|
it('should set DOM element reference on menu open event', () => {
|
|
component.menuTrigger.onMenuOpen.next();
|
|
|
|
expect(component.mdMenuElement.name).toBe('.context-menu');
|
|
});
|
|
|
|
it('should reset DOM element reference on menu close event', () => {
|
|
component.menuTrigger.onMenuClose.next();
|
|
|
|
expect(component.mdMenuElement).toBe(null);
|
|
});
|
|
});
|
|
|
|
describe('onMenuItemClick()', () => {
|
|
|
|
it('should emit when link is not disabled', () => {
|
|
const menuItem = {
|
|
model: {
|
|
disabled: false
|
|
},
|
|
subject: {
|
|
next: (val) => val
|
|
}
|
|
};
|
|
|
|
spyOn(menuItem.subject, 'next');
|
|
|
|
const event = {
|
|
preventDefault: () => null,
|
|
stopImmediatePropagation: () => null
|
|
};
|
|
|
|
component.onMenuItemClick(<any> event, menuItem);
|
|
|
|
expect(menuItem.subject.next).toHaveBeenCalledWith(menuItem);
|
|
});
|
|
|
|
it('should not emit when link is disabled', () => {
|
|
const menuItem = {
|
|
model: {
|
|
disabled: false
|
|
},
|
|
subject: {
|
|
next: (val) => val
|
|
}
|
|
};
|
|
|
|
spyOn(menuItem.subject, 'next');
|
|
|
|
const event = {
|
|
preventDefault: () => null,
|
|
stopImmediatePropagation: () => null
|
|
};
|
|
|
|
menuItem.model.disabled = true;
|
|
component.onMenuItemClick(<any> event, menuItem);
|
|
|
|
expect(menuItem.subject.next).not.toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
describe('showMenu()', () => {
|
|
it('should open menu panel', () => {
|
|
component.showMenu(<any> {}, [{}]);
|
|
|
|
expect(component.menuTrigger.openMenu).toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
describe('Menu position', () => {
|
|
beforeEach(() => {
|
|
component.menuTrigger.onMenuOpen.next();
|
|
component.mdMenuElement.clientHeight = 160;
|
|
component.mdMenuElement.clientWidth = 200;
|
|
});
|
|
|
|
it('should set position to mouse position', fakeAsync(() => {
|
|
const contextMenuEvent = {
|
|
clientX: 100,
|
|
clientY: 210
|
|
};
|
|
|
|
component.showMenu(<any> contextMenuEvent, [{}]);
|
|
tick();
|
|
|
|
expect(component.mdMenuElement.parentElement.style).toEqual({
|
|
left: '100px',
|
|
top: '210px'
|
|
});
|
|
}));
|
|
|
|
it('should adjust position relative to right margin of the screen', fakeAsync(() => {
|
|
const contextMenuEvent = {
|
|
clientX: 1000,
|
|
clientY: 210
|
|
};
|
|
|
|
component.showMenu(<any> contextMenuEvent, [{}]);
|
|
tick();
|
|
|
|
expect(component.mdMenuElement.parentElement.style).toEqual({
|
|
left: '800px',
|
|
top: '210px'
|
|
});
|
|
}));
|
|
|
|
it('should adjust position relative to bottom margin of the screen', fakeAsync(() => {
|
|
const contextMenuEvent = {
|
|
clientX: 100,
|
|
clientY: 600
|
|
};
|
|
|
|
component.showMenu(<any> contextMenuEvent, [{}]);
|
|
tick();
|
|
|
|
expect(component.mdMenuElement.parentElement.style).toEqual({
|
|
left: '100px',
|
|
top: '440px'
|
|
});
|
|
}));
|
|
|
|
it('should adjust position relative to bottom - right margin of the screen', fakeAsync(() => {
|
|
const contextMenuEvent = {
|
|
clientX: 900,
|
|
clientY: 610
|
|
};
|
|
|
|
component.showMenu(<any> contextMenuEvent, [{}]);
|
|
tick();
|
|
|
|
expect(component.mdMenuElement.parentElement.style).toEqual({
|
|
left: '700px',
|
|
top: '450px'
|
|
});
|
|
}));
|
|
});
|
|
|
|
describe('Menu direction', () => {
|
|
beforeEach(() => {
|
|
component.menuTrigger.onMenuOpen.next();
|
|
component.mdMenuElement.clientHeight = 160;
|
|
component.mdMenuElement.clientWidth = 200;
|
|
});
|
|
|
|
it('should set default menu direction', fakeAsync(() => {
|
|
const contextMenuEvent = {
|
|
clientX: 100,
|
|
clientY: 210
|
|
};
|
|
|
|
component.showMenu(<any> contextMenuEvent, [{}]);
|
|
tick();
|
|
|
|
expect(component.menuTrigger.menu.xPosition).toBe('after');
|
|
expect(component.menuTrigger.menu.yPosition).toBe('below');
|
|
}));
|
|
|
|
it('should adjust direction relative to right margin of the screen', fakeAsync(() => {
|
|
const contextMenuEvent = {
|
|
clientX: 1000,
|
|
clientY: 210
|
|
};
|
|
|
|
component.showMenu(<any> contextMenuEvent, [{}]);
|
|
tick();
|
|
|
|
expect(component.menuTrigger.menu.xPosition).toBe('before');
|
|
expect(component.menuTrigger.menu.yPosition).toBe('below');
|
|
}));
|
|
|
|
it('should adjust direction relative to bottom margin of the screen', fakeAsync(() => {
|
|
const contextMenuEvent = {
|
|
clientX: 100,
|
|
clientY: 600
|
|
};
|
|
|
|
component.showMenu(<any> contextMenuEvent, [{}]);
|
|
tick();
|
|
|
|
expect(component.menuTrigger.menu.xPosition).toBe('after');
|
|
expect(component.menuTrigger.menu.yPosition).toBe('above');
|
|
}));
|
|
|
|
it('should adjust position relative to bottom - right margin of the screen', fakeAsync(() => {
|
|
const contextMenuEvent = {
|
|
clientX: 900,
|
|
clientY: 610
|
|
};
|
|
|
|
component.showMenu(<any> contextMenuEvent, [{}]);
|
|
tick();
|
|
|
|
expect(component.menuTrigger.menu.xPosition).toBe('before');
|
|
expect(component.menuTrigger.menu.yPosition).toBe('above');
|
|
}));
|
|
});
|
|
});
|