Path: blob/main/src/vs/workbench/test/browser/notificationsList.test.ts
4778 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { NotificationAccessibilityProvider } from '../../browser/parts/notifications/notificationsList.js';7import { NotificationViewItem, INotificationsFilter, INotificationViewItem } from '../../common/notifications.js';8import { Severity, NotificationsFilter } from '../../../platform/notification/common/notification.js';9import { IKeybindingService } from '../../../platform/keybinding/common/keybinding.js';10import { IConfigurationService } from '../../../platform/configuration/common/configuration.js';11import { TestConfigurationService } from '../../../platform/configuration/test/common/testConfigurationService.js';12import { MockKeybindingService } from '../../../platform/keybinding/test/common/mockKeybindingService.js';13import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../base/test/common/utils.js';1415suite('NotificationsList AccessibilityProvider', () => {1617const noFilter: INotificationsFilter = { global: NotificationsFilter.OFF, sources: new Map() };18let configurationService: IConfigurationService;19let keybindingService: IKeybindingService;20let accessibilityProvider: NotificationAccessibilityProvider;21const createdNotifications: INotificationViewItem[] = [];2223setup(() => {24configurationService = new TestConfigurationService();25keybindingService = new MockKeybindingService();26accessibilityProvider = new NotificationAccessibilityProvider({}, keybindingService, configurationService);27});2829teardown(() => {30// Close all created notifications to prevent disposable leaks31for (const notification of createdNotifications) {32notification.close();33}34createdNotifications.length = 0;35});3637ensureNoDisposablesAreLeakedInTestSuite();3839test('getAriaLabel includes severity prefix for Error notifications', () => {40const notification = NotificationViewItem.create({ severity: Severity.Error, message: 'Something went wrong' }, noFilter)!;41createdNotifications.push(notification);42const ariaLabel = accessibilityProvider.getAriaLabel(notification);4344assert.ok(ariaLabel.startsWith('Error: '), `Expected aria label to start with "Error: ", but got: ${ariaLabel}`);45assert.ok(ariaLabel.includes('Something went wrong'), 'Expected aria label to include original message');46assert.ok(ariaLabel.includes('notification'), 'Expected aria label to include "notification"');47});4849test('getAriaLabel includes severity prefix for Warning notifications', () => {50const notification = NotificationViewItem.create({ severity: Severity.Warning, message: 'This is a warning' }, noFilter)!;51createdNotifications.push(notification);52const ariaLabel = accessibilityProvider.getAriaLabel(notification);5354assert.ok(ariaLabel.startsWith('Warning: '), `Expected aria label to start with "Warning: ", but got: ${ariaLabel}`);55assert.ok(ariaLabel.includes('This is a warning'), 'Expected aria label to include original message');56assert.ok(ariaLabel.includes('notification'), 'Expected aria label to include "notification"');57});5859test('getAriaLabel includes severity prefix for Info notifications', () => {60const notification = NotificationViewItem.create({ severity: Severity.Info, message: 'Information message' }, noFilter)!;61createdNotifications.push(notification);62const ariaLabel = accessibilityProvider.getAriaLabel(notification);6364assert.ok(ariaLabel.startsWith('Info: '), `Expected aria label to start with "Info: ", but got: ${ariaLabel}`);65assert.ok(ariaLabel.includes('Information message'), 'Expected aria label to include original message');66assert.ok(ariaLabel.includes('notification'), 'Expected aria label to include "notification"');67});6869test('getAriaLabel includes source when present', () => {70const notification = NotificationViewItem.create({71severity: Severity.Error,72message: 'Error with source',73source: 'TestExtension'74}, noFilter)!;75createdNotifications.push(notification);76const ariaLabel = accessibilityProvider.getAriaLabel(notification);7778assert.ok(ariaLabel.startsWith('Error: '), 'Expected aria label to start with severity prefix');79assert.ok(ariaLabel.includes('Error with source'), 'Expected aria label to include original message');80assert.ok(ariaLabel.includes('source: TestExtension'), 'Expected aria label to include source information');81assert.ok(ariaLabel.includes('notification'), 'Expected aria label to include "notification"');82});8384test('severity prefix consistency', () => {85// Test that the severity prefixes are consistent with the ARIA alerts86const errorNotification = NotificationViewItem.create({ severity: Severity.Error, message: 'Error message' }, noFilter)!;87const warningNotification = NotificationViewItem.create({ severity: Severity.Warning, message: 'Warning message' }, noFilter)!;88const infoNotification = NotificationViewItem.create({ severity: Severity.Info, message: 'Info message' }, noFilter)!;8990createdNotifications.push(errorNotification, warningNotification, infoNotification);9192const errorLabel = accessibilityProvider.getAriaLabel(errorNotification);93const warningLabel = accessibilityProvider.getAriaLabel(warningNotification);94const infoLabel = accessibilityProvider.getAriaLabel(infoNotification);9596// Check that each severity type gets the correct prefix97assert.ok(errorLabel.includes('Error: Error message'), 'Error notifications should have Error prefix');98assert.ok(warningLabel.includes('Warning: Warning message'), 'Warning notifications should have Warning prefix');99assert.ok(infoLabel.includes('Info: Info message'), 'Info notifications should have Info prefix');100});101});102103104