{"version":3,"file":"ngx-com-components-toast-testing.mjs","sources":["../../../projects/com/components/toast/testing/toast.harness.ts","../../../projects/com/components/toast/testing/index.ts","../../../projects/com/components/toast/testing/ngx-com-components-toast-testing.ts"],"sourcesContent":["import {\n  ComponentHarness,\n  HarnessPredicate,\n  parallel,\n} from '@angular/cdk/testing';\nimport type { BaseHarnessFilters } from '@angular/cdk/testing';\n\n/** Harness filters for ComToastHarness. */\nexport interface ComToastHarnessFilters extends BaseHarnessFilters {\n  /** Filter by the toast's message text. */\n  message?: string | RegExp;\n  /** Filter by the toast's title text. */\n  title?: string | RegExp;\n}\n\n/** Harness filters for ComToastContainerHarness. */\nexport type ComToastContainerHarnessFilters = BaseHarnessFilters;\n\n/**\n * Harness for interacting with an individual toast notification in tests.\n *\n * Because toasts are rendered inside a CDK overlay, use\n * `TestbedHarnessEnvironment.documentRootLoader(fixture)` or\n * `documentRootLocatorFactory()` to locate them.\n */\nexport class ComToastHarness extends ComponentHarness {\n  static hostSelector = 'com-toast';\n\n  private readonly innerDiv = this.locatorFor('div[role]');\n  private readonly titleEl = this.locatorForOptional('[data-part=\"title\"]');\n  private readonly messageEl = this.locatorForOptional(\n    '[data-part=\"message\"]',\n  );\n  private readonly closeButton = this.locatorForOptional(\n    'button[aria-label=\"Dismiss notification\"]',\n  );\n  private readonly actionButton = this.locatorForOptional('.flex-1 button');\n\n  /**\n   * Gets a HarnessPredicate for matching toasts.\n   * @param options Filter options.\n   */\n  static with(\n    options: ComToastHarnessFilters = {},\n  ): HarnessPredicate<ComToastHarness> {\n    return new HarnessPredicate(ComToastHarness, options)\n      .addOption('message', options.message, async (harness, message) => {\n        const text = await harness.getMessageText();\n        return HarnessPredicate.stringMatches(text, message);\n      })\n      .addOption('title', options.title, async (harness, title) => {\n        const text = await harness.getTitleText();\n        return HarnessPredicate.stringMatches(text, title);\n      });\n  }\n\n  /** Gets the ARIA role of the toast (`\"alert\"` or `\"status\"`). */\n  async getRole(): Promise<string | null> {\n    const div = await this.innerDiv();\n    return div.getAttribute('role');\n  }\n\n  /** Gets the `aria-live` value of the toast (`\"assertive\"` or `\"polite\"`). */\n  async getAriaLive(): Promise<string | null> {\n    const div = await this.innerDiv();\n    return div.getAttribute('aria-live');\n  }\n\n  /** Gets the `data-state` attribute (`\"open\"` or `\"closed\"`). */\n  async getState(): Promise<string | null> {\n    const div = await this.innerDiv();\n    return div.getAttribute('data-state');\n  }\n\n  /**\n   * Gets the toast's title text, or `null` if no title is present.\n   */\n  async getTitleText(): Promise<string | null> {\n    const el = await this.titleEl();\n    if (!el) {\n      return null;\n    }\n    return el.text();\n  }\n\n  /** Gets the toast's message text. */\n  async getMessageText(): Promise<string> {\n    const el = await this.messageEl();\n    if (!el) {\n      const host = await this.host();\n      return host.text();\n    }\n    return el.text();\n  }\n\n  /** Whether the toast has an action button. */\n  async hasAction(): Promise<boolean> {\n    const btn = await this.actionButton();\n    return btn !== null;\n  }\n\n  /** Gets the action button's text, or `null` if no action exists. */\n  async getActionText(): Promise<string | null> {\n    const btn = await this.actionButton();\n    if (!btn) {\n      return null;\n    }\n    return btn.text();\n  }\n\n  /**\n   * Clicks the action button.\n   * @throws If no action button is present.\n   */\n  async clickAction(): Promise<void> {\n    const btn = await this.actionButton();\n    if (!btn) {\n      throw new Error(\n        'Cannot click action: toast does not have an action button.',\n      );\n    }\n    return btn.click();\n  }\n\n  /** Whether the toast has a close (dismiss) button. */\n  async isDismissible(): Promise<boolean> {\n    const btn = await this.closeButton();\n    return btn !== null;\n  }\n\n  /**\n   * Clicks the close button to dismiss the toast.\n   * @throws If no close button is present.\n   */\n  async dismiss(): Promise<void> {\n    const btn = await this.closeButton();\n    if (!btn) {\n      throw new Error(\n        'Cannot dismiss: toast does not have a close button. '\n          + 'Check that showClose is enabled.',\n      );\n    }\n    return btn.click();\n  }\n\n  /** Whether the toast is disabled. */\n  async isDisabled(): Promise<boolean> {\n    const host = await this.host();\n    return (await host.getAttribute('aria-disabled')) === 'true';\n  }\n\n  /** Whether the toast host is focused. */\n  async isFocused(): Promise<boolean> {\n    const host = await this.host();\n    return host.isFocused();\n  }\n\n  /** Focuses the toast host element. */\n  async focus(): Promise<void> {\n    const host = await this.host();\n    return host.focus();\n  }\n\n  /** Blurs the toast host element. */\n  async blur(): Promise<void> {\n    const host = await this.host();\n    return host.blur();\n  }\n}\n\n/**\n * Harness for interacting with the toast container in tests.\n *\n * The container is rendered in a CDK overlay. Use\n * `TestbedHarnessEnvironment.documentRootLoader(fixture)` to locate it.\n */\nexport class ComToastContainerHarness extends ComponentHarness {\n  static hostSelector = 'com-toast-container';\n\n  private readonly regionDiv = this.locatorFor('[role=\"region\"]');\n\n  /**\n   * Gets a HarnessPredicate for matching toast containers.\n   * @param options Filter options.\n   */\n  static with(\n    options: ComToastContainerHarnessFilters = {},\n  ): HarnessPredicate<ComToastContainerHarness> {\n    return new HarnessPredicate(ComToastContainerHarness, options);\n  }\n\n  /** Gets the container's `aria-label` attribute. */\n  async getAriaLabel(): Promise<string | null> {\n    const region = await this.regionDiv();\n    return region.getAttribute('aria-label');\n  }\n\n  /** Gets all toast harnesses inside the container, optionally filtered. */\n  async getToasts(\n    filters: ComToastHarnessFilters = {},\n  ): Promise<ComToastHarness[]> {\n    return this.locatorForAll(ComToastHarness.with(filters))();\n  }\n\n  /** Gets the number of toasts currently in the container. */\n  async getToastCount(): Promise<number> {\n    const toasts = await this.getToasts();\n    return toasts.length;\n  }\n\n  /** Gets the message text of all toasts. */\n  async getToastMessages(): Promise<string[]> {\n    const toasts = await this.getToasts();\n    return parallel(() => toasts.map((t) => t.getMessageText()));\n  }\n}\n","// Testing utilities for the toast component\n\nexport {\n  ComToastHarness,\n  ComToastContainerHarness,\n} from './toast.harness';\n\nexport type {\n  ComToastHarnessFilters,\n  ComToastContainerHarnessFilters,\n} from './toast.harness';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}