import { ComponentFixture, TestBed } from '@angular/core/testing';
import { Component } from '@angular/core';
import { By } from '@angular/platform-browser';
import {
DropdownComponent,
DropdownTriggerDirective,
DropdownMenuComponent,
DropdownItemComponent,
} from './dropdown.component';
@Component({
standalone: true,
imports: [
DropdownComponent,
DropdownTriggerDirective,
DropdownMenuComponent,
DropdownItemComponent,
],
template: `
Item 1
Item 2 (disabled)
`,
})
class TestHostComponent {
align: 'left' | 'right' | 'center' = 'left';
lastClicked = '';
}
describe('DropdownComponent', () => {
let component: TestHostComponent;
let fixture: ComponentFixture;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [TestHostComponent],
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(TestHostComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('menu is closed by default', () => {
const menu = fixture.debugElement.query(By.css('.mv-dropdown-menu'));
expect(menu.nativeElement.className).not.toContain('mv-dropdown-menu--open');
});
it('opens menu when trigger is clicked', () => {
const trigger = fixture.debugElement.query(By.css('[data-testid="trigger"]')).nativeElement;
trigger.click();
fixture.detectChanges();
const menu = fixture.debugElement.query(By.css('.mv-dropdown-menu'));
expect(menu.nativeElement.className).toContain('mv-dropdown-menu--open');
});
it('closes menu when trigger is clicked again', () => {
const trigger = fixture.debugElement.query(By.css('[data-testid="trigger"]')).nativeElement;
trigger.click();
fixture.detectChanges();
trigger.click();
fixture.detectChanges();
const menu = fixture.debugElement.query(By.css('.mv-dropdown-menu'));
expect(menu.nativeElement.className).not.toContain('mv-dropdown-menu--open');
});
it('closes menu and emits itemClick when an item is clicked', () => {
const trigger = fixture.debugElement.query(By.css('[data-testid="trigger"]')).nativeElement;
trigger.click();
fixture.detectChanges();
// DropdownItemComponent renders a