import { TooltipDirective } from './tooltip.directive';
import {ComponentFixture, fakeAsync, TestBed, tick} from '@angular/core/testing';
import {Component, DebugElement, NO_ERRORS_SCHEMA} from '@angular/core';
import {By} from '@angular/platform-browser';
import {DocumentService} from '../services/document.service';
import {WindowService} from '../services/window.service';
@Component({
selector: 'app-test-component',
template: '
'
})
class TestComponent {}
describe('TooltipDirective', () => {
let fixture: ComponentFixture;
let directive: TooltipDirective;
let container: DebugElement;
beforeEach(() => {
fixture = TestBed.configureTestingModule({
declarations: [ TestComponent, TooltipDirective ],
schemas: [ NO_ERRORS_SCHEMA ],
providers: [
DocumentService,
WindowService
]
})
.createComponent(TestComponent);
fixture.detectChanges(); // initial binding
const tooltipDirectives = fixture.debugElement.queryAll(By.directive(TooltipDirective));
directive = tooltipDirectives[0].injector.get(TooltipDirective) as TooltipDirective;
container = fixture.debugElement.query(By.css('#testContainer'));
});
it('have a tooltip on mouseover', fakeAsync( () => {
container.triggerEventHandler('mouseenter', {});
fixture.detectChanges();
tick(100);
const tooltip = document.getElementsByClassName('ng-tooltip')[0] as HTMLSpanElement | undefined;
expect(tooltip?.innerText).toEqual('Hello World');
}));
it('should its position above its parent', () => {
directive.placement = 'top';
directive.create();
expect(directive.tooltip).toBeDefined();
expect(directive.tooltip?.getBoundingClientRect().bottom).toBeGreaterThanOrEqual(container.nativeElement.getBoundingClientRect().top);
});
it('should position itself below its parent', () => {
directive.placement = 'bottom';
directive.create();
expect(directive.tooltip).toBeDefined();
expect(directive.tooltip?.getBoundingClientRect().top).toBeGreaterThanOrEqual(container.nativeElement.getBoundingClientRect().bottom);
});
it('should position itself to the left of its parent', () => {
directive.placement = 'left';
directive.create();
expect(directive.tooltip).toBeDefined();
// @ts-ignore uhm - Im pretty sure we're good here'
const directiveRightMostPoint = directive.tooltip?.getBoundingClientRect().left + directive.tooltip?.clientWidth;
expect(directiveRightMostPoint).toBeGreaterThanOrEqual(container.nativeElement.getBoundingClientRect().left);
});
it('should position itself to the right of its container', () => {
directive.placement = 'right';
directive.create();
expect(directive.tooltip).toBeDefined();
expect(directive.tooltip?.getBoundingClientRect().left).toBeLessThanOrEqual(container.nativeElement.getBoundingClientRect().right);
});
it('appears on the cursor if placement = "cursor"', () => {
directive.placement = 'cursor';
directive.onMouseMove({clientX: 200, clientY: 100} as MouseEvent);
directive.show();
expect(directive.tooltip).toBeDefined();
expect(directive.tooltip?.getBoundingClientRect().left).toBeGreaterThanOrEqual(200);
expect(directive.tooltip?.getBoundingClientRect().top).toBeGreaterThanOrEqual(100);
});
});