From c9a2f7d718d45fe32f1267e49621f00d226e5b76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20Csaba?= Date: Mon, 19 Oct 2026 17:15:32 +0200 Subject: [PATCH] unit tests fix --- .husky/pre-commit | 3 +- jest.config.ts | 2 ++ .../accordion-item.component.spec.ts | 30 +++++++++++++++--- .../widgets/badge/badge.component.spec.ts | 12 +++---- .../document-scroll-strategy.service.spec.ts | 5 ++- .../form-field/form-field.component.spec.ts | 27 +++++++++++++--- .../components/input/input.directive.spec.ts | 18 ++++++++++- .../option/option-group.component.spec.ts | 16 ++++++++++ .../option/option.component.spec.ts | 16 ++++++++++ .../overlay-panel.component.spec.ts | 2 ++ .../paginator/paginator.component.spec.ts | 2 ++ .../widgets/radio/radio.component.spec.ts | 25 ++++++++++++--- ...nted-control-toggle-item.component.spec.ts | 31 ++++++++++++++++--- ...segmented-control-toggle.directive.spec.ts | 4 ++- .../segmented-control-item.component.spec.ts | 31 ++++++++++++++++--- .../segmented-control.directive.spec.ts | 4 ++- .../widgets/select/select.component.spec.ts | 30 +++++++++++++++--- projects/widgets/setup-jest.ts | 11 ++++++- .../snackbar/snackbar.component.spec.ts | 1 + .../widgets/switch/switch.component.spec.ts | 2 ++ .../widgets/tab/tab-group.component.spec.ts | 25 ++++++++++++--- projects/widgets/tab/tab.component.spec.ts | 26 +++++++++++++--- .../widgets/table/table.component.spec.ts | 8 +++-- 23 files changed, 284 insertions(+), 47 deletions(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index d0a77842..1e5a4dc1 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1,2 @@ -npx lint-staged \ No newline at end of file +npx lint-staged +pnpm run test:widgets \ No newline at end of file diff --git a/jest.config.ts b/jest.config.ts index 569836fe..b47d5da5 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -12,6 +12,8 @@ const jestConfig: Config = { '!core/types/*', '!**/*.type.ts', '!**/*.model.ts', + '!**/*.stories.ts', + '!**/.storybook/**', ], coverageThreshold: { global: { diff --git a/projects/widgets/accordion/accordion-item/accordion-item.component.spec.ts b/projects/widgets/accordion/accordion-item/accordion-item.component.spec.ts index 6f32a05b..c185ac41 100644 --- a/projects/widgets/accordion/accordion-item/accordion-item.component.spec.ts +++ b/projects/widgets/accordion/accordion-item/accordion-item.component.spec.ts @@ -1,20 +1,42 @@ +// The accordion must load before the item because of their circular import. + +import { IdsAccordionComponent } from '../accordion.component'; + +// eslint-disable-next-line import/order import { IdsAccordionItemComponent } from './accordion-item.component'; +import { Component } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { provideNoopAnimations } from '@angular/platform-browser/animations'; + +@Component({ + imports: [ + IdsAccordionComponent, + IdsAccordionItemComponent, + ], + template: ` + + Content + + `, +}) +class TestHostComponent {} describe('IdsAccordionItemComponent', () => { let component: IdsAccordionItemComponent; - let fixture: ComponentFixture; + let fixture: ComponentFixture; beforeEach(async() => { await TestBed.configureTestingModule({ - imports: [IdsAccordionItemComponent], + imports: [TestHostComponent], + providers: [provideNoopAnimations()], }) .compileComponents(); - fixture = TestBed.createComponent(IdsAccordionItemComponent); - component = fixture.componentInstance; + fixture = TestBed.createComponent(TestHostComponent); fixture.detectChanges(); + component = fixture.debugElement.query(By.directive(IdsAccordionItemComponent)).componentInstance as IdsAccordionItemComponent; }); it('should create', () => { diff --git a/projects/widgets/badge/badge.component.spec.ts b/projects/widgets/badge/badge.component.spec.ts index b8ff42b0..518df435 100644 --- a/projects/widgets/badge/badge.component.spec.ts +++ b/projects/widgets/badge/badge.component.spec.ts @@ -1,18 +1,18 @@ -import { BadgeComponent } from './badge.component'; +import { IdsBadgeComponent } from './badge.component'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -describe('BadgeComponent', () => { - let component: BadgeComponent; - let fixture: ComponentFixture; +describe('IdsBadgeComponent', () => { + let component: IdsBadgeComponent; + let fixture: ComponentFixture; beforeEach(async() => { await TestBed.configureTestingModule({ - imports: [BadgeComponent], + imports: [IdsBadgeComponent], }) .compileComponents(); - fixture = TestBed.createComponent(BadgeComponent); + fixture = TestBed.createComponent(IdsBadgeComponent); component = fixture.componentInstance; fixture.detectChanges(); }); diff --git a/projects/widgets/core/services/document-scroll-strategy.service.spec.ts b/projects/widgets/core/services/document-scroll-strategy.service.spec.ts index fc6be335..da5053fa 100644 --- a/projects/widgets/core/services/document-scroll-strategy.service.spec.ts +++ b/projects/widgets/core/services/document-scroll-strategy.service.spec.ts @@ -40,6 +40,8 @@ describe('IdsDocumentScrollStrategyService', () => { afterEach(() => { document.body.style.overflow = originalBodyOverflow; + document.body.style.overflowX = ''; + document.body.style.overflowY = ''; document.documentElement.style.overflow = originalHtmlOverflow; }); @@ -56,7 +58,8 @@ describe('IdsDocumentScrollStrategyService', () => { }); it('does not add a second document lock when body scrolling is already blocked', () => { - document.body.style.overflow = 'hidden'; + document.body.style.overflowX = 'hidden'; + document.body.style.overflowY = 'hidden'; const strategy = service.create(); strategy.enable(); diff --git a/projects/widgets/forms/components/form-field/form-field.component.spec.ts b/projects/widgets/forms/components/form-field/form-field.component.spec.ts index 74f26a88..ce686717 100644 --- a/projects/widgets/forms/components/form-field/form-field.component.spec.ts +++ b/projects/widgets/forms/components/form-field/form-field.component.spec.ts @@ -1,20 +1,39 @@ import { IdsFormFieldComponent } from './form-field.component'; +import { IdsInputDirective } from '../input/input.directive'; + +import { Component } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { FormsModule } from '@angular/forms'; +import { By } from '@angular/platform-browser'; + +@Component({ + imports: [ + FormsModule, + IdsFormFieldComponent, + IdsInputDirective, + ], + template: ` + + + + `, +}) +class TestHostComponent {} describe('IdsFormFieldComponent', () => { let component: IdsFormFieldComponent; - let fixture: ComponentFixture; + let fixture: ComponentFixture; beforeEach(async() => { await TestBed.configureTestingModule({ - imports: [IdsFormFieldComponent], + imports: [TestHostComponent], }) .compileComponents(); - fixture = TestBed.createComponent(IdsFormFieldComponent); - component = fixture.componentInstance; + fixture = TestBed.createComponent(TestHostComponent); fixture.detectChanges(); + component = fixture.debugElement.query(By.directive(IdsFormFieldComponent)).componentInstance as IdsFormFieldComponent; }); it('should create', () => { diff --git a/projects/widgets/forms/components/input/input.directive.spec.ts b/projects/widgets/forms/components/input/input.directive.spec.ts index f86b8e95..d9f033b9 100644 --- a/projects/widgets/forms/components/input/input.directive.spec.ts +++ b/projects/widgets/forms/components/input/input.directive.spec.ts @@ -1,8 +1,24 @@ import { IdsInputDirective } from './input.directive'; +import { Component } from '@angular/core'; +import { TestBed } from '@angular/core/testing'; +import { FormsModule } from '@angular/forms'; +import { By } from '@angular/platform-browser'; + +@Component({ + imports: [ + FormsModule, + IdsInputDirective, + ], + template: '', +}) +class TestHostComponent {} + describe('IdsInputDirective', () => { it('should create an instance', () => { - const directive = new IdsInputDirective(); + const fixture = TestBed.createComponent(TestHostComponent); + fixture.detectChanges(); + const directive = fixture.debugElement.query(By.directive(IdsInputDirective)).injector.get(IdsInputDirective); expect(directive).toBeTruthy(); }); }); diff --git a/projects/widgets/forms/components/option/option-group.component.spec.ts b/projects/widgets/forms/components/option/option-group.component.spec.ts index 8c5a5cf3..9933b3df 100644 --- a/projects/widgets/forms/components/option/option-group.component.spec.ts +++ b/projects/widgets/forms/components/option/option-group.component.spec.ts @@ -1,6 +1,11 @@ import { IdsOptionGroupComponent } from './option-group.component'; +import { IDS_OPTION_PARENT_COMPONENT } from './tokens/option-parent'; +import { IdsFormFieldVariant } from '../form-field/types/form-field-variant.type'; + +import { signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { IdsSize } from '@i-cell/ids-angular/core'; describe('IdsOptionGroupComponent', () => { let component: IdsOptionGroupComponent; @@ -9,6 +14,17 @@ describe('IdsOptionGroupComponent', () => { beforeEach(async() => { await TestBed.configureTestingModule({ imports: [IdsOptionGroupComponent], + providers: [ + { + provide: IDS_OPTION_PARENT_COMPONENT, + useValue: { + multiSelect: signal(false), + parentSize: signal(IdsSize.COMFORTABLE), + parentVariant: signal(IdsFormFieldVariant.SURFACE), + isOptionPreSelectedByValue: (): boolean => false, + }, + }, + ], }) .compileComponents(); diff --git a/projects/widgets/forms/components/option/option.component.spec.ts b/projects/widgets/forms/components/option/option.component.spec.ts index 192d5615..3c3ce643 100644 --- a/projects/widgets/forms/components/option/option.component.spec.ts +++ b/projects/widgets/forms/components/option/option.component.spec.ts @@ -1,6 +1,11 @@ import { IdsOptionComponent } from './option.component'; +import { IDS_OPTION_PARENT_COMPONENT } from './tokens/option-parent'; +import { IdsFormFieldVariant } from '../form-field/types/form-field-variant.type'; + +import { signal } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { IdsSize } from '@i-cell/ids-angular/core'; describe('IdsOptionComponent', () => { let component: IdsOptionComponent; @@ -9,6 +14,17 @@ describe('IdsOptionComponent', () => { beforeEach(async() => { await TestBed.configureTestingModule({ imports: [IdsOptionComponent], + providers: [ + { + provide: IDS_OPTION_PARENT_COMPONENT, + useValue: { + multiSelect: signal(false), + parentSize: signal(IdsSize.COMFORTABLE), + parentVariant: signal(IdsFormFieldVariant.SURFACE), + isOptionPreSelectedByValue: (): boolean => false, + }, + }, + ], }) .compileComponents(); diff --git a/projects/widgets/overlay-panel/overlay-panel.component.spec.ts b/projects/widgets/overlay-panel/overlay-panel.component.spec.ts index a455cb72..4c9885bd 100644 --- a/projects/widgets/overlay-panel/overlay-panel.component.spec.ts +++ b/projects/widgets/overlay-panel/overlay-panel.component.spec.ts @@ -1,5 +1,6 @@ import { IdsOverlayPanelComponent } from './overlay-panel.component'; +import { ElementRef } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; describe('NewOverlayPanelComponent', () => { @@ -14,6 +15,7 @@ describe('NewOverlayPanelComponent', () => { fixture = TestBed.createComponent(IdsOverlayPanelComponent); component = fixture.componentInstance; + fixture.componentRef.setInput('origin', new ElementRef(document.body)); fixture.detectChanges(); }); diff --git a/projects/widgets/paginator/paginator.component.spec.ts b/projects/widgets/paginator/paginator.component.spec.ts index 70538763..0a22006e 100644 --- a/projects/widgets/paginator/paginator.component.spec.ts +++ b/projects/widgets/paginator/paginator.component.spec.ts @@ -14,6 +14,8 @@ describe('IdsPaginatorComponent', () => { fixture = TestBed.createComponent(IdsPaginatorComponent); component = fixture.componentInstance; + const length = 100; + fixture.componentRef.setInput('length', length); fixture.detectChanges(); }); diff --git a/projects/widgets/radio/radio.component.spec.ts b/projects/widgets/radio/radio.component.spec.ts index 8033804d..285ecf64 100644 --- a/projects/widgets/radio/radio.component.spec.ts +++ b/projects/widgets/radio/radio.component.spec.ts @@ -1,20 +1,37 @@ +import { IdsRadioGroupComponent } from './radio-group.component'; import { IdsRadioComponent } from './radio.component'; +import { Component } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; + +@Component({ + imports: [ + IdsRadioGroupComponent, + IdsRadioComponent, + ], + template: ` + + A + B + + `, +}) +class TestHostComponent {} describe('IdsRadioComponent', () => { let component: IdsRadioComponent; - let fixture: ComponentFixture; + let fixture: ComponentFixture; beforeEach(async() => { await TestBed.configureTestingModule({ - imports: [IdsRadioComponent], + imports: [TestHostComponent], }) .compileComponents(); - fixture = TestBed.createComponent(IdsRadioComponent); - component = fixture.componentInstance; + fixture = TestBed.createComponent(TestHostComponent); fixture.detectChanges(); + component = fixture.debugElement.query(By.directive(IdsRadioComponent)).componentInstance as IdsRadioComponent; }); it('should create', () => { diff --git a/projects/widgets/segmented-control-toggle/segmented-control-toggle-item.component.spec.ts b/projects/widgets/segmented-control-toggle/segmented-control-toggle-item.component.spec.ts index 768fdb15..528b2ce5 100644 --- a/projects/widgets/segmented-control-toggle/segmented-control-toggle-item.component.spec.ts +++ b/projects/widgets/segmented-control-toggle/segmented-control-toggle-item.component.spec.ts @@ -1,20 +1,43 @@ +// The directive must load before the item because of their circular import. + +import { IdsSegmentedControlToggleDirective } from './segmented-control-toggle.directive'; +// eslint-disable-next-line import/order import { IdsSegmentedControlToggleItemComponent } from './segmented-control-toggle-item.component'; +import { Component } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { FormsModule } from '@angular/forms'; +import { By } from '@angular/platform-browser'; + +@Component({ + imports: [ + FormsModule, + IdsSegmentedControlToggleDirective, + IdsSegmentedControlToggleItemComponent, + ], + template: ` + + + + + `, +}) +class TestHostComponent {} describe('IdsSegmentedControlToggleItemComponent', () => { let component: IdsSegmentedControlToggleItemComponent; - let fixture: ComponentFixture; + let fixture: ComponentFixture; beforeEach(async() => { await TestBed.configureTestingModule({ - imports: [IdsSegmentedControlToggleItemComponent], + imports: [TestHostComponent], }) .compileComponents(); - fixture = TestBed.createComponent(IdsSegmentedControlToggleItemComponent); - component = fixture.componentInstance; + fixture = TestBed.createComponent(TestHostComponent); fixture.detectChanges(); + const itemElement = fixture.debugElement.query(By.directive(IdsSegmentedControlToggleItemComponent)); + component = itemElement.componentInstance as IdsSegmentedControlToggleItemComponent; }); it('should create', () => { diff --git a/projects/widgets/segmented-control-toggle/segmented-control-toggle.directive.spec.ts b/projects/widgets/segmented-control-toggle/segmented-control-toggle.directive.spec.ts index 02f46bb8..6fb9084c 100644 --- a/projects/widgets/segmented-control-toggle/segmented-control-toggle.directive.spec.ts +++ b/projects/widgets/segmented-control-toggle/segmented-control-toggle.directive.spec.ts @@ -1,8 +1,10 @@ import { IdsSegmentedControlToggleDirective } from './segmented-control-toggle.directive'; +import { TestBed } from '@angular/core/testing'; + describe('IdsSegmentedControlToggleDirective', () => { it('should create an instance', () => { - const directive = new IdsSegmentedControlToggleDirective(); + const directive = TestBed.runInInjectionContext(() => new IdsSegmentedControlToggleDirective()); expect(directive).toBeTruthy(); }); }); diff --git a/projects/widgets/segmented-control/segmented-control-item.component.spec.ts b/projects/widgets/segmented-control/segmented-control-item.component.spec.ts index 396a9132..f819c9b5 100644 --- a/projects/widgets/segmented-control/segmented-control-item.component.spec.ts +++ b/projects/widgets/segmented-control/segmented-control-item.component.spec.ts @@ -1,20 +1,43 @@ +// The directive must load before the item because of their circular import. + +import { IdsSegmentedControlDirective } from './segmented-control.directive'; +// eslint-disable-next-line import/order import { IdsSegmentedControlItemComponent } from './segmented-control-item.component'; +import { Component } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { FormsModule } from '@angular/forms'; +import { By } from '@angular/platform-browser'; + +@Component({ + imports: [ + FormsModule, + IdsSegmentedControlDirective, + IdsSegmentedControlItemComponent, + ], + template: ` + + + + + `, +}) +class TestHostComponent {} describe('IdsSegmentedControlItemComponent', () => { let component: IdsSegmentedControlItemComponent; - let fixture: ComponentFixture; + let fixture: ComponentFixture; beforeEach(async() => { await TestBed.configureTestingModule({ - imports: [IdsSegmentedControlItemComponent], + imports: [TestHostComponent], }) .compileComponents(); - fixture = TestBed.createComponent(IdsSegmentedControlItemComponent); - component = fixture.componentInstance; + fixture = TestBed.createComponent(TestHostComponent); fixture.detectChanges(); + const itemElement = fixture.debugElement.query(By.directive(IdsSegmentedControlItemComponent)); + component = itemElement.componentInstance as IdsSegmentedControlItemComponent; }); it('should create', () => { diff --git a/projects/widgets/segmented-control/segmented-control.directive.spec.ts b/projects/widgets/segmented-control/segmented-control.directive.spec.ts index ee364b59..64f0453f 100644 --- a/projects/widgets/segmented-control/segmented-control.directive.spec.ts +++ b/projects/widgets/segmented-control/segmented-control.directive.spec.ts @@ -1,8 +1,10 @@ import { IdsSegmentedControlDirective } from './segmented-control.directive'; +import { TestBed } from '@angular/core/testing'; + describe('IdsSegmentedControlDirective', () => { it('should create an instance', () => { - const directive = new IdsSegmentedControlDirective(); + const directive = TestBed.runInInjectionContext(() => new IdsSegmentedControlDirective()); expect(directive).toBeTruthy(); }); }); diff --git a/projects/widgets/select/select.component.spec.ts b/projects/widgets/select/select.component.spec.ts index bcdba550..adea96f2 100644 --- a/projects/widgets/select/select.component.spec.ts +++ b/projects/widgets/select/select.component.spec.ts @@ -1,20 +1,42 @@ import { IdsSelectComponent } from './select.component'; +import { Component } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { FormsModule } from '@angular/forms'; +import { By } from '@angular/platform-browser'; +import { IdsFormFieldComponent, IdsOptionComponent } from '@i-cell/ids-angular/forms'; + +@Component({ + imports: [ + FormsModule, + IdsFormFieldComponent, + IdsSelectComponent, + IdsOptionComponent, + ], + template: ` + + + A + B + + + `, +}) +class TestHostComponent {} describe('IdsSelectComponent', () => { let component: IdsSelectComponent; - let fixture: ComponentFixture; + let fixture: ComponentFixture; beforeEach(async() => { await TestBed.configureTestingModule({ - imports: [IdsSelectComponent], + imports: [TestHostComponent], }) .compileComponents(); - fixture = TestBed.createComponent(IdsSelectComponent); - component = fixture.componentInstance; + fixture = TestBed.createComponent(TestHostComponent); fixture.detectChanges(); + component = fixture.debugElement.query(By.directive(IdsSelectComponent)).componentInstance as IdsSelectComponent; }); it('should create', () => { diff --git a/projects/widgets/setup-jest.ts b/projects/widgets/setup-jest.ts index 1100b3e8..940f2f28 100644 --- a/projects/widgets/setup-jest.ts +++ b/projects/widgets/setup-jest.ts @@ -1 +1,10 @@ -import 'jest-preset-angular/setup-jest'; +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv(); + +// jsdom does not implement ResizeObserver +globalThis.ResizeObserver ??= class { + public observe(): void {} + public unobserve(): void {} + public disconnect(): void {} +}; diff --git a/projects/widgets/snackbar/snackbar.component.spec.ts b/projects/widgets/snackbar/snackbar.component.spec.ts index 786cb678..db4f9947 100644 --- a/projects/widgets/snackbar/snackbar.component.spec.ts +++ b/projects/widgets/snackbar/snackbar.component.spec.ts @@ -14,6 +14,7 @@ describe('IdsSnackbarComponent', () => { fixture = TestBed.createComponent(IdsSnackbarComponent); component = fixture.componentInstance; + fixture.componentRef.setInput('message', 'Test message'); fixture.detectChanges(); }); diff --git a/projects/widgets/switch/switch.component.spec.ts b/projects/widgets/switch/switch.component.spec.ts index da8442de..2ffac064 100644 --- a/projects/widgets/switch/switch.component.spec.ts +++ b/projects/widgets/switch/switch.component.spec.ts @@ -1,6 +1,7 @@ import { IdsSwitchComponent } from './switch.component'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { provideNoopAnimations } from '@angular/platform-browser/animations'; describe('IdsSwitchComponent', () => { let component: IdsSwitchComponent; @@ -9,6 +10,7 @@ describe('IdsSwitchComponent', () => { beforeEach(async() => { await TestBed.configureTestingModule({ imports: [IdsSwitchComponent], + providers: [provideNoopAnimations()], }) .compileComponents(); diff --git a/projects/widgets/tab/tab-group.component.spec.ts b/projects/widgets/tab/tab-group.component.spec.ts index 387cbf62..9d965436 100644 --- a/projects/widgets/tab/tab-group.component.spec.ts +++ b/projects/widgets/tab/tab-group.component.spec.ts @@ -1,20 +1,37 @@ import { IdsTabGroupComponent } from './tab-group.component'; +import { IdsTabComponent } from './tab.component'; +import { Component } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; + +@Component({ + imports: [ + IdsTabGroupComponent, + IdsTabComponent, + ], + template: ` + + First content + Second content + + `, +}) +class TestHostComponent {} describe('IdsTabGroupComponent', () => { let component: IdsTabGroupComponent; - let fixture: ComponentFixture; + let fixture: ComponentFixture; beforeEach(async() => { await TestBed.configureTestingModule({ - imports: [IdsTabGroupComponent], + imports: [TestHostComponent], }) .compileComponents(); - fixture = TestBed.createComponent(IdsTabGroupComponent); - component = fixture.componentInstance; + fixture = TestBed.createComponent(TestHostComponent); fixture.detectChanges(); + component = fixture.debugElement.query(By.directive(IdsTabGroupComponent)).componentInstance as IdsTabGroupComponent; }); it('should create', () => { diff --git a/projects/widgets/tab/tab.component.spec.ts b/projects/widgets/tab/tab.component.spec.ts index 60266ed0..f7d24a95 100644 --- a/projects/widgets/tab/tab.component.spec.ts +++ b/projects/widgets/tab/tab.component.spec.ts @@ -1,20 +1,38 @@ +import { IdsTabGroupComponent } from './tab-group.component'; import { IdsTabComponent } from './tab.component'; +import { Component, viewChild } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +@Component({ + imports: [ + IdsTabGroupComponent, + IdsTabComponent, + ], + template: ` + + First content + Second content + + `, +}) +class TestHostComponent { + public tab = viewChild.required(IdsTabComponent); +} + describe('IdsTabComponent', () => { let component: IdsTabComponent; - let fixture: ComponentFixture; + let fixture: ComponentFixture; beforeEach(async() => { await TestBed.configureTestingModule({ - imports: [IdsTabComponent], + imports: [TestHostComponent], }) .compileComponents(); - fixture = TestBed.createComponent(IdsTabComponent); - component = fixture.componentInstance; + fixture = TestBed.createComponent(TestHostComponent); fixture.detectChanges(); + component = fixture.componentInstance.tab(); }); it('should create', () => { diff --git a/projects/widgets/table/table.component.spec.ts b/projects/widgets/table/table.component.spec.ts index 7d712b3b..5a3ec81f 100644 --- a/projects/widgets/table/table.component.spec.ts +++ b/projects/widgets/table/table.component.spec.ts @@ -128,12 +128,12 @@ it('keeps the default toggle in the last sticky-end column and opens and closes toggleButton().click(); await render(); expect(toggleButton().getAttribute('aria-expanded')).toBe('true'); - expect(toggleButton().textContent).toContain('chevron-up'); + expect(toggleButton().querySelector('ids-icon')?.getAttribute('fonticon')).toBe('chevron-up'); expect(element.querySelector('.ids-table__detail-row--expanded')?.textContent).toContain('Details for First'); toggleButton().click(); await render(); expect(toggleButton().getAttribute('aria-expanded')).toBe('false'); - expect(toggleButton().textContent).toContain('chevron-down'); + expect(toggleButton().querySelector('ids-icon')?.getAttribute('fonticon')).toBe('chevron-down'); expect(element.querySelector('.ids-table__detail-row--expanded')).toBeNull(); }); @@ -144,7 +144,9 @@ it.each([ host.target = target; await render(); expect(element.querySelector('.ids-table__cell--master-detail-toggle')).toBeNull(); - expect(toggleButton().closest('td, th')?.classList.contains(`cdk-column-${target}`)).toBe(true); + // CdkCell only matches td[cdk-cell], so identifier cells (th) have no cdk-column-* class + const targetCellClass = target === 'name' ? 'ids-table__cell--identifier' : `cdk-column-${target}`; + expect(toggleButton().closest('td, th')?.classList.contains(targetCellClass)).toBe(true); expect(element.querySelector('.cdk-column-permissions strong')?.textContent).toBe('Read'); expect(element.querySelectorAll('.ids-table__button--master-detail')).toHaveLength(1); toggleButton().click();