import { ComponentFixture, TestBed } from '@angular/core/testing';
import { Component } from '@angular/core';
import { By } from '@angular/platform-browser';
import {
ModalComponent,
ModalHeaderComponent,
ModalBodyComponent,
ModalFooterComponent,
} from './modal.component';
@Component({
standalone: true,
imports: [ModalComponent, ModalHeaderComponent, ModalBodyComponent, ModalFooterComponent],
template: `
My Title
My Body
My Footer
`,
})
class TestHostComponent {
isOpen = true;
closed = false;
handleClose() {
this.closed = true;
this.isOpen = false;
}
}
describe('ModalComponent', () => {
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('renders correctly when open', () => {
const modalEl = fixture.debugElement.query(By.css('.mv-modal'));
expect(modalEl).toBeTruthy();
expect(modalEl.nativeElement.className).toContain('mv-modal--lg');
const headerEl = fixture.debugElement.query(By.css('.mv-modal-header'));
expect(headerEl.nativeElement.textContent).toContain('My Title');
const bodyEl = fixture.debugElement.query(By.css('.mv-modal-body'));
expect(bodyEl.nativeElement.textContent).toContain('My Body');
const footerEl = fixture.debugElement.query(By.css('.mv-modal-footer'));
expect(footerEl.nativeElement.textContent).toContain('My Footer');
});
it('hides overlay when isOpen is false', async () => {
// Instead of mutating the existing fixture, let's create a new one to avoid NG0100 in OnPush setups with vitest
const newFixture = TestBed.createComponent(TestHostComponent);
newFixture.componentInstance.isOpen = false;
newFixture.detectChanges();
await newFixture.whenStable();
const overlay = newFixture.debugElement.query(By.css('.mv-modal-overlay'));
expect(overlay.nativeElement.className).not.toContain('mv-modal-overlay--open');
expect(overlay.nativeElement.getAttribute('aria-hidden')).toBe('true');
});
it('calls onClose when close button in header is clicked', () => {
const closeBtn = fixture.debugElement.query(By.css('.mv-modal-close')).nativeElement;
closeBtn.click();
expect(component.closed).toBe(true);
});
it('calls onClose when overlay is clicked', () => {
const overlay = fixture.debugElement.query(By.css('.mv-modal-overlay')).nativeElement;
overlay.click(); // Trigger click on overlay
expect(component.closed).toBe(true);
});
});