{"version":3,"file":"skyux-avatar-testing.mjs","sources":["../../../../../libs/components/avatar/testing/src/legacy/avatar-fixture.ts","../../../../../libs/components/avatar/testing/src/modules/avatar/avatar-harness.ts","../../../../../libs/components/avatar/testing/src/skyux-avatar-testing.ts"],"sourcesContent":["import { DebugElement } from '@angular/core';\nimport { ComponentFixture } from '@angular/core/testing';\nimport { By } from '@angular/platform-browser';\nimport { SkyAppTestUtility } from '@skyux-sdk/testing';\n\n/**\n * Allows interaction with a SKY UX avatar component.\n * @deprecated Use `SkyAvatarHarness` instead.\n * @internal\n */\nexport class SkyAvatarFixture {\n  /**\n   * The initials displayed when no image URL is specified.\n   */\n  public get initials(): string | undefined {\n    const initialsEl = this.#debugEl.query(By.css('.sky-avatar-initials'));\n\n    if (SkyAppTestUtility.isVisible(initialsEl)) {\n      return SkyAppTestUtility.getText(\n        initialsEl.query(By.css('.sky-avatar-initials-inner')),\n      );\n    }\n\n    return undefined;\n  }\n\n  /**\n   * The avatar's current image URL.\n   */\n  public get imageUrl(): string | undefined {\n    const imageEl = this.#debugEl.query(By.css('.sky-avatar-image'));\n\n    if (SkyAppTestUtility.isVisible(imageEl)) {\n      return SkyAppTestUtility.getBackgroundImageUrl(imageEl);\n    }\n\n    return undefined;\n  }\n\n  #debugEl: DebugElement;\n\n  constructor(fixture: ComponentFixture<any>, skyTestId: string) {\n    this.#debugEl = SkyAppTestUtility.getDebugElementByTestId(\n      fixture,\n      skyTestId,\n      'sky-avatar',\n    );\n  }\n}\n","import { HarnessPredicate, TestElement } from '@angular/cdk/testing';\nimport { SkyComponentHarness, SkyHarnessUtility } from '@skyux/core/testing';\nimport { SkyErrorModalHarness } from '@skyux/errors/testing';\nimport { SkyFileDropHarness } from '@skyux/forms/testing';\n\nimport { SkyAvatarHarnessFilters } from './avatar-harness-filters';\n\nconst WAIT_INTERVAL = 10;\nconst WAIT_TIMEOUT = 3000;\n\nasync function isHidden(el: TestElement): Promise<boolean> {\n  return (await el.getCssValue('display')) === 'none';\n}\n\n/**\n * Harness for interacting with an avatar component in tests.\n */\nexport class SkyAvatarHarness extends SkyComponentHarness {\n  /**\n   * @internal\n   */\n  public static hostSelector = 'sky-avatar';\n\n  #documentRootLocator = this.documentRootLocatorFactory();\n\n  #getFileDrop = this.locatorForOptional(SkyFileDropHarness);\n  #errorModal =\n    this.#documentRootLocator.locatorForOptional(SkyErrorModalHarness);\n\n  /**\n   * Gets a `HarnessPredicate` that can be used to search for a\n   * `SkyAvatarHarness` that meets certain criteria.\n   */\n  public static with(\n    filters: SkyAvatarHarnessFilters,\n  ): HarnessPredicate<SkyAvatarHarness> {\n    return SkyAvatarHarness.getDataSkyIdPredicate(filters);\n  }\n\n  /**\n   * Gets the initials displayed when no image URL is specified.\n   */\n  public async getInitials(): Promise<string | undefined> {\n    const initialsEl = await this.locatorFor('.sky-avatar-initials')();\n\n    if (await isHidden(initialsEl)) {\n      return undefined;\n    }\n\n    return await initialsEl.text();\n  }\n\n  /**\n   * Gets the avatar's current image URL or Blob.\n   */\n  public async getSrc(): Promise<string | Blob | undefined> {\n    const url = await this.#getImageUrl();\n\n    if (url?.startsWith('blob:')) {\n      return await (await fetch(url)).blob();\n    }\n\n    return url;\n  }\n\n  /**\n   * Gets whether users can change the image.\n   */\n  public async getCanChange(): Promise<boolean> {\n    return !!(await this.#getFileDrop());\n  }\n\n  /**\n   * Simulates the user selecting or dropping an image onto the component.\n   */\n  public async dropAvatarFile(\n    file: File,\n    waitForChange?: boolean,\n  ): Promise<void> {\n    const fileDrop = await this.#getFileDrop();\n\n    if (!fileDrop) {\n      throw new Error(\n        'A new avatar cannot be selected because the canChange input is not set to true.',\n      );\n    }\n\n    if (waitForChange) {\n      await this.#dropAndWait(fileDrop, file);\n    } else {\n      await fileDrop.loadFile(file);\n    }\n  }\n\n  /**\n   * Gets whether an error indicating an invalid file type is displayed.\n   */\n  public async hasFileTypeError(): Promise<boolean> {\n    const errorModal = await this.#errorModal();\n\n    return !!(await errorModal?.getTitle())?.includes('File is not an image.');\n  }\n\n  /**\n   * Gets whether an error indicating an invalid file size is displayed.\n   */\n  public async hasMaxSizeError(): Promise<boolean> {\n    const errorModal = await this.#errorModal();\n\n    return !!(await errorModal?.getTitle())?.includes('File is too large.');\n  }\n\n  /**\n   * Closes the currently displayed error.\n   */\n  public async closeError(): Promise<void> {\n    const errorModal = await this.#errorModal();\n\n    if (!errorModal) {\n      throw new Error('No error is currently displayed.');\n    }\n\n    await errorModal.clickCloseButton();\n  }\n\n  async #getImageUrl(): Promise<string | undefined> {\n    const imageEl = await this.locatorFor('.sky-avatar-image')();\n\n    if (await isHidden(imageEl)) {\n      return undefined;\n    }\n\n    return await SkyHarnessUtility.getBackgroundImageUrl(imageEl);\n  }\n\n  async #dropAndWait(fileDrop: SkyFileDropHarness, file: File): Promise<void> {\n    const currentUrl = await this.#getImageUrl();\n\n    await fileDrop.loadFile(file);\n\n    return await new Promise<void>((resolve, reject) => {\n      const checkForFileChange = async (attempts: number): Promise<void> => {\n        if ((await this.#getImageUrl()) !== currentUrl) {\n          resolve();\n        } else if (attempts * WAIT_INTERVAL < WAIT_TIMEOUT) {\n          setTimeout(\n            () => void checkForFileChange(attempts + 1),\n            WAIT_INTERVAL,\n          );\n        } else {\n          reject(\n            new Error(\n              'The avatar src did not change within the expected time span',\n            ),\n          );\n        }\n      };\n\n      void checkForFileChange(0);\n    });\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}