@bigbinary/neeto-playwright-commons 4.7.3 → 4.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -127,6 +127,7 @@ This package is published as ESM-only. Use `import` syntax and avoid CommonJS `r
127
127
  - [Routes](./docs/routes.md)
128
128
  - [Custom commands](./docs/custom-commands.md)
129
129
  - [MailerUtils](./docs/utils/mailer-utils.md)
130
+ - [SmsUtils](./docs/utils/sms-utils.md)
130
131
  - [EmailDeliveryUtils](./docs/utils/email-delivery-utils.md)
131
132
  - [InboundEmailApis](./docs/utils/inbound-email-apis.md)
132
133
  - [NeetoAuthServer](./docs/utils/neeto-auth-server.md)
package/index.d.ts CHANGED
@@ -2175,6 +2175,125 @@ declare class QRCodeUtils {
2175
2175
  */
2176
2176
  decodeQRCodeFromFile: (filePath: string) => Promise<string | undefined>;
2177
2177
  }
2178
+ type SmsProvider = "twilio" | "telnyx";
2179
+ interface SmsFilters {
2180
+ to: string;
2181
+ from: string;
2182
+ body: string;
2183
+ provider: SmsProvider;
2184
+ }
2185
+ type SmsSearchParams = Partial<SmsFilters & {
2186
+ receivedAfter: string;
2187
+ }>;
2188
+ interface Sms extends SmsFilters {
2189
+ options?: Record<string, unknown>;
2190
+ receivedAt: string;
2191
+ }
2192
+ declare class SmsApi {
2193
+ private neetoPlaywrightUtilities;
2194
+ constructor(neetoPlaywrightUtilities: CustomCommands);
2195
+ fetchSms: (searchParams?: SmsSearchParams) => Promise<Sms[]>;
2196
+ deleteSms: (receivedBefore: string) => Promise<playwright_core.APIResponse | undefined>;
2197
+ /**
2198
+ *
2199
+ * Deletes every captured SMS for the app. Use it only when no other test or parallel worker asserts on SMS at the same time.
2200
+ *
2201
+ * @example
2202
+ *
2203
+ * await smsUtils.purgeAllSms();
2204
+ * @endexample
2205
+ */
2206
+ purgeAllSms: () => Promise<playwright_core.APIResponse | undefined>;
2207
+ }
2208
+ type SmsSearchCriteria = Omit<SmsSearchParams, "receivedAfter"> & {
2209
+ receivedAfter?: Date;
2210
+ };
2211
+ interface WaitForSmsOptions {
2212
+ timeout?: number;
2213
+ expectedSmsCount?: number;
2214
+ shouldThrowErrorOnTimeout?: boolean;
2215
+ }
2216
+ declare class SmsUtils {
2217
+ private neetoPlaywrightUtilities;
2218
+ smsApi: SmsApi;
2219
+ constructor(neetoPlaywrightUtilities: CustomCommands);
2220
+ private toSearchParams;
2221
+ /**
2222
+ *
2223
+ * Lists the captured SMS that match the criteria.
2224
+ *
2225
+ * @example
2226
+ *
2227
+ * const messages = await smsUtils.listSms({
2228
+ * to: process.env.TWILIO_INCOMING_PHONE_NUMBER,
2229
+ * from: process.env.TWILIO_DEFAULT_PHONE_NUMBER,
2230
+ * body: smsContent,
2231
+ * provider: "twilio",
2232
+ * receivedAfter: bookingCreatedAt,
2233
+ * });
2234
+ * @endexample
2235
+ */
2236
+ listSms: (criteria?: SmsSearchCriteria) => Promise<Sms[]>;
2237
+ /**
2238
+ *
2239
+ * Polls until a matching SMS arrives or the timeout fires. Returns the latest matching SMS.
2240
+ *
2241
+ * @example
2242
+ *
2243
+ * const receivedAfter = new Date();
2244
+ *
2245
+ * await automationRulesApis.triggerAutomationRules(bookingSid, "before_meeting_starts");
2246
+ *
2247
+ * const sms = await smsUtils.waitForSms(
2248
+ * {
2249
+ * to: process.env.TWILIO_INCOMING_PHONE_NUMBER,
2250
+ * from: process.env.TWILIO_DEFAULT_PHONE_NUMBER,
2251
+ * body: smsContents.client,
2252
+ * provider: "twilio",
2253
+ * receivedAfter,
2254
+ * },
2255
+ * { timeout: MESSAGE_DELIVERY_TIMEOUT_WITH_BUFFER }
2256
+ * );
2257
+ * @endexample
2258
+ */
2259
+ waitForSms: (criteria?: SmsSearchCriteria, {
2260
+ timeout,
2261
+ expectedSmsCount,
2262
+ shouldThrowErrorOnTimeout
2263
+ }?: WaitForSmsOptions) => Promise<Sms | Record<string, never>>;
2264
+ /**
2265
+ *
2266
+ * Asserts that no matching SMS arrives: polls for the full timeout and throws as soon as any matching SMS is captured. On success (no SMS arrived) it returns {}.
2267
+ *
2268
+ * @example
2269
+ *
2270
+ * await smsUtils.expectNoSms({ to: unsubscribedPhoneNumber, receivedAfter });
2271
+ * @endexample
2272
+ */
2273
+ expectNoSms: (criteria?: SmsSearchCriteria, {
2274
+ timeout
2275
+ }?: Pick<WaitForSmsOptions, "timeout">) => Promise<Record<string, never> | Sms>;
2276
+ /**
2277
+ *
2278
+ * Deletes the captured SMS that are older than the cutoff. Use this, not purgeAllSms, between tests. All parallel workers share one capture list. A full purge from one worker deletes the SMS that other workers still poll for.
2279
+ *
2280
+ * @example
2281
+ *
2282
+ * await smsUtils.clearStaleSms(minutesAgo(10));
2283
+ * @endexample
2284
+ */
2285
+ clearStaleSms: (receivedBefore?: Date) => Promise<playwright_core.APIResponse | undefined>;
2286
+ /**
2287
+ *
2288
+ * Deletes every captured SMS for the app. Use it only when no other test or parallel worker asserts on SMS at the same time.
2289
+ *
2290
+ * @example
2291
+ *
2292
+ * await smsUtils.purgeAllSms();
2293
+ * @endexample
2294
+ */
2295
+ purgeAllSms: () => Promise<playwright_core.APIResponse | undefined>;
2296
+ }
2178
2297
  type Hex = Lowercase<`#${string}`>;
2179
2298
  interface BaseThemeStyle {
2180
2299
  primaryColor: Hex;
@@ -2248,6 +2367,7 @@ interface CustomFixture {
2248
2367
  page: Page;
2249
2368
  health: Health;
2250
2369
  mailerUtils: MailerUtils;
2370
+ smsUtils: SmsUtils;
2251
2371
  colorPicker: ColorPickerUtils;
2252
2372
  qrCodeUtils: QRCodeUtils;
2253
2373
  }
@@ -9376,6 +9496,7 @@ declare const initializeTestData: (product: NeetoProducts) => {
9376
9496
  baseURL: string;
9377
9497
  };
9378
9498
  declare const imageRegex: (imageName: string) => RegExp;
9499
+ declare const minutesAgo: (minutes: number) => Date;
9379
9500
  /**
9380
9501
  *
9381
9502
  * Wraps a login function with a Redis-backed cookie cache so that only one Playwright shard per provider performs a full OAuth login. Subsequent shards skip the login by restoring the cached cookies from Redis.
@@ -10327,5 +10448,5 @@ declare class InboundEmailApis {
10327
10448
  reply: (emailParams: ReplyInboundEmailParams) => Promise<playwright_core.APIResponse | undefined>;
10328
10449
  private deliverSource;
10329
10450
  }
10330
- export { ACTIONS, ADMIN_PANEL_SELECTORS, ALL_RESOURCES, ANALYTICS_RESOURCES, API_KEYS_SELECTORS, API_ROUTES, APP_RESOURCES, AUDIT_LOGS_SELECTORS, ApiKeysApi, ApiKeysPage, ApiKeysPageV2, AuditLogsPage, BASE_URL, CALENDAR_LABELS, CERTIFICATE_LIMIT_EXCEEDED_MESSAGE, CERTIFICATE_LIMIT_EXCEEDED_REGEXP, CHANGELOG_WIDGET_SELECTORS, CHAT_WIDGET_SELECTORS, CHAT_WIDGET_TEXTS, COLOR, COMMON_SELECTORS, COMMON_TEXTS, COMMUNITY_TEXTS, CREDENTIALS, CURRENT_TIME_RANGES, CUSTOM_DOMAIN_SELECTORS, CUSTOM_DOMAIN_SUFFIX, ColorPickerUtils, CustomCommands, CustomCommandsV2, CustomDomainApi, CustomDomainPage, DATE_FORMATS, DATE_PICKER_SELECTORS, DATE_RANGES, DATE_TEXTS, DEFAULT_TIMEZONE_ID, DEFAULT_WEBHOOKS_RESPONSE_TEXT, DESCRIPTION_EDITOR_TEXTS, EDITOR_VERIFY_TEXT_COLOR, EMBED_SELECTORS, EMOJI_LABEL, EMPTY_STORAGE_STATE, ENGAGE_TEXTS, ENVIRONMENT, EXAMPLE_URL, EXPANDED_FONT_SIZE, EXPORT_FILE_TYPES, EditorPage, EmailDeliveryUtils, EmbedBase, FILE_FORMATS, FONTS_RESOURCES, FONT_SIZE_SELECTORS, FROM_EMAIL_ENV_KEYS, GLOBAL_TRANSLATIONS_PATTERN, GOOGLE_ANALYTICS_SELECTORS, GOOGLE_CALENDAR_DATE_FORMAT, GOOGLE_LOGIN_SELECTORS, GOOGLE_LOGIN_TEXTS, GOOGLE_SHEETS_SELECTORS, GooglePage, HELP_CENTER_ROUTES, HELP_CENTER_SELECTORS, HelpAndProfilePage, HelpAndProfilePageV2, INTEGRATIONS_TEXTS, INTEGRATION_SELECTORS, IPRestrictionsPage, IP_RESTRICTIONS_SELECTORS, IS_CI, IS_DEV_ENV, IS_MAILPIT_ENABLED, IS_SHADCN_UI, IS_STAGING_ENV, ImageUploader, InboundEmailApis, IntegrationBase, IpRestrictionsApi, KEYBOARD_SHORTCUTS_SELECTORS, KEYBOARD_SHORTCUT_TEST_CASES, LIST_MODIFIER_SELECTORS, LIST_MODIFIER_TAGS, LOGIN_SELECTORS, MAILPIT_BASE_URL, MAILPIT_DOMAIN_NAME, MEMBER_FORM_SELECTORS, MEMBER_SELECTORS, MEMBER_TEXTS, MERGE_TAGS_SELECTORS, MICROSOFT_LOGIN_SELECTORS, MICROSOFT_LOGIN_TEXTS, MailerUtils, MailpitApi, Member, MemberApis, MicrosoftPage, NEETO_AUTH_BASE_URL, NEETO_EDITOR_SELECTORS, NEETO_FILTERS_SELECTORS, NEETO_IMAGE_UPLOADER_SELECTORS, NEETO_ROUTES, NEETO_SEO_SELECTORS, NEETO_TEXT_MODIFIER_SELECTORS, NeetoAuthServer, NeetoChatWidget, NeetoEmailDeliveryApi, NeetoTowerApi, ONBOARDING_SELECTORS, ORGANIZATION_TEXTS, OTP_EMAIL_PATTERN, OrganizationPage, PAST_TIME_RANGES, PHONE_NUMBER_FORMATS, PLURAL, PRODUCT_ROLES_ROUTE_MAP, PROFILE_LINKS, PROFILE_SECTION_SELECTORS, PROJECT_NAMES, PROJECT_TRANSLATIONS_PATH, ROLES_SELECTORS, ROUTES, RailsEmailApiClient, RailsEmailUtils, RoleApis, RolesPage, RolesPageV2, SIGNUP_SELECTORS, SINGULAR, SLACK_DATA_QA_SELECTORS, SLACK_DEFAULT_CHANNEL, SLACK_SELECTORS, SLACK_WEB_TEXTS, STATUS_TEXTS, STORAGE_STATE, SecurityApi, SidebarSection, SlackApi, SlackPage, TABLE_SELECTORS, TAB_SELECTORS, TAGS_SELECTORS, TEAM_MEMBER_TEXTS, TEXT_MODIFIER_ROLES, TEXT_MODIFIER_SELECTORS, TEXT_MODIFIER_TAGS, THANK_YOU_SELECTORS, THEMES_SELECTORS, THEMES_TEXTS, THIRD_PARTY_RESOURCES, THIRD_PARTY_ROUTES, TIME_RANGES, TOASTR_MESSAGES, TWILIO_SELECTORS, TagsApi, TagsPage, TeamMembers, TeamMembersV2, ThankYouApi, ThankYouPage, TwilioApi, USER_AGENTS, WEBHOOK_SELECTORS, WebhookSiteApi, WebhooksPage, ZAPIER_LIMIT_EXHAUSTED_MESSAGE, ZAPIER_SELECTORS, ZAPIER_TEST_EMAIL, ZAPIER_TEST_EMAIL_V2, ZAPIER_WEB_TEXTS, ZapierPage, authenticateUser, baseURLGenerator, basicHTMLContent, clearCredentials, commands, cpuThrottlingUsingCDP, createOrganizationViaApi, createOrganizationViaRake, currencyUtils, dataQa, decodeQRCodeFromFile, definePlaywrightConfig, executeWithThrottledResources, extractSubdomainFromError, filterUtils, fixedMenuSelector, generatePhoneNumber, generatePhoneNumberDetails, generateRandomBypassEmail, generateRandomFile, generateStagingData, getByDataQA, getClipboardContent, getDirname, getFormattedPhoneNumber, getFullUrl, getGlobalUserProps, getGlobalUserState, getImagePathAndName, getIsoCodeFromPhoneCode, getListCount, globalShortcuts, grantClipboardPermissions, hexToRGB, hexToRGBA, i18nFixture, imageRegex, initializeCredentials, initializeTestData, initializeTotp, isGithubIssueOpen, isStagingOrganizationExpired, joinHyphenCase, joinString, login, mailpitDomainName, networkConditions, networkThrottlingUsingCDP, optionSelector, readFileAsBrowserFile, readFileSyncIfExists, removeCredentialFile, serializeFileForBrowser, shouldSkipCustomDomainSetup, shouldSkipSetupAndTeardown, simulateClickWithDelay, simulateTypingWithDelay, skipTest, squish, _default as stealthTest, tableUtils, toCamelCase, updateCredentials, warmup, withCookieCache, writeDataToFile };
10331
- export type { BaseThemeStyle, BaseThemeStyleType, ColumnMenuAction, CountryProps, CustomFixture, EmailDeliveryConnectParams, EmailDeliveryProvider, EmailDeliveryVerifiedEmail, EmailDeliveryVerifyEmailParams, EmailDeliveryVerifyEmailResponse, EmailMatchCriteria, InboundEmailParams, IntroPageThemeStyle, IntroPageThemeStyleType, OAuthEmailDeliveryProvider, ProjectName, ReplyInboundEmailParams, ThemeCategory, ValueOf };
10451
+ export { ACTIONS, ADMIN_PANEL_SELECTORS, ALL_RESOURCES, ANALYTICS_RESOURCES, API_KEYS_SELECTORS, API_ROUTES, APP_RESOURCES, AUDIT_LOGS_SELECTORS, ApiKeysApi, ApiKeysPage, ApiKeysPageV2, AuditLogsPage, BASE_URL, CALENDAR_LABELS, CERTIFICATE_LIMIT_EXCEEDED_MESSAGE, CERTIFICATE_LIMIT_EXCEEDED_REGEXP, CHANGELOG_WIDGET_SELECTORS, CHAT_WIDGET_SELECTORS, CHAT_WIDGET_TEXTS, COLOR, COMMON_SELECTORS, COMMON_TEXTS, COMMUNITY_TEXTS, CREDENTIALS, CURRENT_TIME_RANGES, CUSTOM_DOMAIN_SELECTORS, CUSTOM_DOMAIN_SUFFIX, ColorPickerUtils, CustomCommands, CustomCommandsV2, CustomDomainApi, CustomDomainPage, DATE_FORMATS, DATE_PICKER_SELECTORS, DATE_RANGES, DATE_TEXTS, DEFAULT_TIMEZONE_ID, DEFAULT_WEBHOOKS_RESPONSE_TEXT, DESCRIPTION_EDITOR_TEXTS, EDITOR_VERIFY_TEXT_COLOR, EMBED_SELECTORS, EMOJI_LABEL, EMPTY_STORAGE_STATE, ENGAGE_TEXTS, ENVIRONMENT, EXAMPLE_URL, EXPANDED_FONT_SIZE, EXPORT_FILE_TYPES, EditorPage, EmailDeliveryUtils, EmbedBase, FILE_FORMATS, FONTS_RESOURCES, FONT_SIZE_SELECTORS, FROM_EMAIL_ENV_KEYS, GLOBAL_TRANSLATIONS_PATTERN, GOOGLE_ANALYTICS_SELECTORS, GOOGLE_CALENDAR_DATE_FORMAT, GOOGLE_LOGIN_SELECTORS, GOOGLE_LOGIN_TEXTS, GOOGLE_SHEETS_SELECTORS, GooglePage, HELP_CENTER_ROUTES, HELP_CENTER_SELECTORS, HelpAndProfilePage, HelpAndProfilePageV2, INTEGRATIONS_TEXTS, INTEGRATION_SELECTORS, IPRestrictionsPage, IP_RESTRICTIONS_SELECTORS, IS_CI, IS_DEV_ENV, IS_MAILPIT_ENABLED, IS_SHADCN_UI, IS_STAGING_ENV, ImageUploader, InboundEmailApis, IntegrationBase, IpRestrictionsApi, KEYBOARD_SHORTCUTS_SELECTORS, KEYBOARD_SHORTCUT_TEST_CASES, LIST_MODIFIER_SELECTORS, LIST_MODIFIER_TAGS, LOGIN_SELECTORS, MAILPIT_BASE_URL, MAILPIT_DOMAIN_NAME, MEMBER_FORM_SELECTORS, MEMBER_SELECTORS, MEMBER_TEXTS, MERGE_TAGS_SELECTORS, MICROSOFT_LOGIN_SELECTORS, MICROSOFT_LOGIN_TEXTS, MailerUtils, MailpitApi, Member, MemberApis, MicrosoftPage, NEETO_AUTH_BASE_URL, NEETO_EDITOR_SELECTORS, NEETO_FILTERS_SELECTORS, NEETO_IMAGE_UPLOADER_SELECTORS, NEETO_ROUTES, NEETO_SEO_SELECTORS, NEETO_TEXT_MODIFIER_SELECTORS, NeetoAuthServer, NeetoChatWidget, NeetoEmailDeliveryApi, NeetoTowerApi, ONBOARDING_SELECTORS, ORGANIZATION_TEXTS, OTP_EMAIL_PATTERN, OrganizationPage, PAST_TIME_RANGES, PHONE_NUMBER_FORMATS, PLURAL, PRODUCT_ROLES_ROUTE_MAP, PROFILE_LINKS, PROFILE_SECTION_SELECTORS, PROJECT_NAMES, PROJECT_TRANSLATIONS_PATH, ROLES_SELECTORS, ROUTES, RailsEmailApiClient, RailsEmailUtils, RoleApis, RolesPage, RolesPageV2, SIGNUP_SELECTORS, SINGULAR, SLACK_DATA_QA_SELECTORS, SLACK_DEFAULT_CHANNEL, SLACK_SELECTORS, SLACK_WEB_TEXTS, STATUS_TEXTS, STORAGE_STATE, SecurityApi, SidebarSection, SlackApi, SlackPage, SmsApi, SmsUtils, TABLE_SELECTORS, TAB_SELECTORS, TAGS_SELECTORS, TEAM_MEMBER_TEXTS, TEXT_MODIFIER_ROLES, TEXT_MODIFIER_SELECTORS, TEXT_MODIFIER_TAGS, THANK_YOU_SELECTORS, THEMES_SELECTORS, THEMES_TEXTS, THIRD_PARTY_RESOURCES, THIRD_PARTY_ROUTES, TIME_RANGES, TOASTR_MESSAGES, TWILIO_SELECTORS, TagsApi, TagsPage, TeamMembers, TeamMembersV2, ThankYouApi, ThankYouPage, TwilioApi, USER_AGENTS, WEBHOOK_SELECTORS, WebhookSiteApi, WebhooksPage, ZAPIER_LIMIT_EXHAUSTED_MESSAGE, ZAPIER_SELECTORS, ZAPIER_TEST_EMAIL, ZAPIER_TEST_EMAIL_V2, ZAPIER_WEB_TEXTS, ZapierPage, authenticateUser, baseURLGenerator, basicHTMLContent, clearCredentials, commands, cpuThrottlingUsingCDP, createOrganizationViaApi, createOrganizationViaRake, currencyUtils, dataQa, decodeQRCodeFromFile, definePlaywrightConfig, executeWithThrottledResources, extractSubdomainFromError, filterUtils, fixedMenuSelector, generatePhoneNumber, generatePhoneNumberDetails, generateRandomBypassEmail, generateRandomFile, generateStagingData, getByDataQA, getClipboardContent, getDirname, getFormattedPhoneNumber, getFullUrl, getGlobalUserProps, getGlobalUserState, getImagePathAndName, getIsoCodeFromPhoneCode, getListCount, globalShortcuts, grantClipboardPermissions, hexToRGB, hexToRGBA, i18nFixture, imageRegex, initializeCredentials, initializeTestData, initializeTotp, isGithubIssueOpen, isStagingOrganizationExpired, joinHyphenCase, joinString, login, mailpitDomainName, minutesAgo, networkConditions, networkThrottlingUsingCDP, optionSelector, readFileAsBrowserFile, readFileSyncIfExists, removeCredentialFile, serializeFileForBrowser, shouldSkipCustomDomainSetup, shouldSkipSetupAndTeardown, simulateClickWithDelay, simulateTypingWithDelay, skipTest, squish, _default as stealthTest, tableUtils, toCamelCase, updateCredentials, warmup, withCookieCache, writeDataToFile };
10452
+ export type { BaseThemeStyle, BaseThemeStyleType, ColumnMenuAction, CountryProps, CustomFixture, EmailDeliveryConnectParams, EmailDeliveryProvider, EmailDeliveryVerifiedEmail, EmailDeliveryVerifyEmailParams, EmailDeliveryVerifyEmailResponse, EmailMatchCriteria, InboundEmailParams, IntroPageThemeStyle, IntroPageThemeStyleType, OAuthEmailDeliveryProvider, ProjectName, ReplyInboundEmailParams, Sms, SmsFilters, SmsProvider, SmsSearchCriteria, SmsSearchParams, ThemeCategory, ValueOf, WaitForSmsOptions };
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { isPresent, keysToSnakeCase, hyphenate, humanize, isNotPresent, noop as noop$2, findBy, dynamicArray, truncate, isNotEmpty, isNotEqualDeep, randomPick } from '@bigbinary/neeto-cist';
1
+ import { isPresent, keysToSnakeCase, hyphenate, humanize, isNotPresent, noop as noop$2, keysToCamelCase, findBy, dynamicArray, truncate, isNotEmpty, isNotEqualDeep, randomPick } from '@bigbinary/neeto-cist';
2
2
  import { faker } from '@faker-js/faker';
3
3
  import * as fs from 'fs';
4
4
  import fs__default, { readFileSync, promises, existsSync, writeFileSync, unlinkSync, mkdirSync, rmSync, createWriteStream } from 'fs';
@@ -1394,6 +1394,7 @@ const imageRegex = (imageName) => {
1394
1394
  const [baseName, extension] = imageName.split(".");
1395
1395
  return new RegExp(`${baseName}.*\\.${extension}$`);
1396
1396
  };
1397
+ const minutesAgo = (minutes) => new Date(Date.now() - minutes * 60 * 1000);
1397
1398
 
1398
1399
  const optionSelector = (option) => `neeto-editor-fixed-menu-${option}-option`;
1399
1400
  const fixedMenuSelector = (selector) => `neeto-editor-fixed-menu-${selector}`;
@@ -117047,6 +117048,80 @@ class QRCodeUtils {
117047
117048
  };
117048
117049
  }
117049
117050
 
117051
+ const TESTING_SMS_PATH = "/api/v1/testing/sms";
117052
+ class SmsApi {
117053
+ neetoPlaywrightUtilities;
117054
+ constructor(neetoPlaywrightUtilities) {
117055
+ this.neetoPlaywrightUtilities = neetoPlaywrightUtilities;
117056
+ }
117057
+ fetchSms = async (searchParams = {}) => {
117058
+ const response = await this.neetoPlaywrightUtilities.apiRequest({
117059
+ url: TESTING_SMS_PATH,
117060
+ params: keysToSnakeCase(searchParams),
117061
+ });
117062
+ if (!response) {
117063
+ throw new Error(`Received no response from GET ${TESTING_SMS_PATH}.`);
117064
+ }
117065
+ return keysToCamelCase(await response.json());
117066
+ };
117067
+ deleteSms = (receivedBefore) => this.neetoPlaywrightUtilities.apiRequest({
117068
+ url: `${TESTING_SMS_PATH}/destroy`,
117069
+ method: "delete",
117070
+ params: keysToSnakeCase({ receivedBefore }),
117071
+ });
117072
+ purgeAllSms = () => this.neetoPlaywrightUtilities.apiRequest({
117073
+ url: `${TESTING_SMS_PATH}/purge_all`,
117074
+ method: "delete",
117075
+ });
117076
+ }
117077
+
117078
+ const toBackendTimestamp = (date) => new Date(Math.floor(date.valueOf() / 1000) * 1000 - 1).toISOString();
117079
+ const findLatestSms = (messages) => messages.reduce((latest, sms) => !latest || new Date(sms.receivedAt) > new Date(latest.receivedAt)
117080
+ ? sms
117081
+ : latest, null);
117082
+ class SmsUtils {
117083
+ neetoPlaywrightUtilities;
117084
+ smsApi;
117085
+ constructor(neetoPlaywrightUtilities) {
117086
+ this.neetoPlaywrightUtilities = neetoPlaywrightUtilities;
117087
+ this.smsApi = new SmsApi(neetoPlaywrightUtilities);
117088
+ }
117089
+ toSearchParams = ({ receivedAfter = minutesAgo(60), ...filters }) => ({
117090
+ ...filters,
117091
+ receivedAfter: toBackendTimestamp(receivedAfter),
117092
+ });
117093
+ listSms = (criteria = {}) => this.smsApi.fetchSms(this.toSearchParams(criteria));
117094
+ waitForSms = async (criteria = {}, { timeout = 10_000, expectedSmsCount = 1, shouldThrowErrorOnTimeout = true, } = {}) => {
117095
+ const searchParams = this.toSearchParams(criteria);
117096
+ let latestSms = null;
117097
+ const sms = (await this.neetoPlaywrightUtilities.executeRecursively({
117098
+ callback: () => latestSms,
117099
+ condition: async () => {
117100
+ const messages = await this.smsApi.fetchSms(searchParams);
117101
+ latestSms = findLatestSms(messages);
117102
+ return messages.length >= Math.max(expectedSmsCount, 1);
117103
+ },
117104
+ timeout,
117105
+ }));
117106
+ if (expectedSmsCount === 0) {
117107
+ if (sms) {
117108
+ throw new Error(`Expected no SMS matching ${JSON.stringify(searchParams)}, but received ${JSON.stringify(sms)}.`);
117109
+ }
117110
+ return {};
117111
+ }
117112
+ if (!sms) {
117113
+ if (shouldThrowErrorOnTimeout) {
117114
+ throw new Error(`Timed out waiting for SMS matching ${JSON.stringify(searchParams)}, expected at least ${expectedSmsCount}.`);
117115
+ }
117116
+ return {};
117117
+ }
117118
+ return sms;
117119
+ };
117120
+ expectNoSms = (criteria = {}, { timeout } = {}) => this.waitForSms(criteria, { timeout, expectedSmsCount: 0 });
117121
+ clearStaleSms = (receivedBefore = minutesAgo(10)) => this.smsApi.deleteSms(toBackendTimestamp(receivedBefore));
117122
+ purgeAllSms = () => this.smsApi.purgeAllSms();
117123
+ }
117124
+
117050
117125
  const hexToRGBA = (hex) => {
117051
117126
  let r = 0, g = 0, b = 0, a = 1;
117052
117127
  if (hex.length === 5) {
@@ -117162,6 +117237,19 @@ const commands = {
117162
117237
  await use(mailerUtils);
117163
117238
  IS_DEV_ENV && (await mailerUtils.railsEmailUtils.clearStaleEmails());
117164
117239
  },
117240
+ smsUtils: async ({ neetoPlaywrightUtilities }, use) => {
117241
+ const smsUtils = new SmsUtils(neetoPlaywrightUtilities);
117242
+ await use(smsUtils);
117243
+ if (IS_DEV_ENV) {
117244
+ // Not every host app draws the :dev_sms routes; teardown must not fail the test when they are absent.
117245
+ try {
117246
+ await smsUtils.clearStaleSms();
117247
+ }
117248
+ catch (error) {
117249
+ console.warn("Failed to clear stale SMS:", error);
117250
+ }
117251
+ }
117252
+ },
117165
117253
  colorPicker: async ({ page }, use) => {
117166
117254
  const colorPicker = new ColorPickerUtils(page);
117167
117255
  await use(colorPicker);
@@ -127276,4 +127364,4 @@ class InboundEmailApis {
127276
127364
  };
127277
127365
  }
127278
127366
 
127279
- export { ACTIONS, ADMIN_PANEL_SELECTORS, ALL_RESOURCES, ANALYTICS_RESOURCES, API_KEYS_SELECTORS, API_ROUTES, APP_RESOURCES, AUDIT_LOGS_SELECTORS, ApiKeysApi, ApiKeysPage, ApiKeysPageV2, AuditLogsPage, BASE_URL, CALENDAR_LABELS, CERTIFICATE_LIMIT_EXCEEDED_MESSAGE, CERTIFICATE_LIMIT_EXCEEDED_REGEXP, CHANGELOG_WIDGET_SELECTORS, CHAT_WIDGET_SELECTORS, CHAT_WIDGET_TEXTS, COLOR, COMMON_SELECTORS, COMMON_TEXTS, COMMUNITY_TEXTS, CREDENTIALS, CURRENT_TIME_RANGES, CUSTOM_DOMAIN_SELECTORS, CUSTOM_DOMAIN_SUFFIX, ColorPickerUtils, CustomCommands, CustomCommandsV2, CustomDomainApi, CustomDomainPage, DATE_FORMATS, DATE_PICKER_SELECTORS, DATE_RANGES, DATE_TEXTS, DEFAULT_TIMEZONE_ID, DEFAULT_WEBHOOKS_RESPONSE_TEXT, DESCRIPTION_EDITOR_TEXTS, EDITOR_VERIFY_TEXT_COLOR, EMBED_SELECTORS, EMOJI_LABEL, EMPTY_STORAGE_STATE, ENGAGE_TEXTS, ENVIRONMENT, EXAMPLE_URL, EXPANDED_FONT_SIZE, EXPORT_FILE_TYPES, EditorPage, EmailDeliveryUtils, EmbedBase, FILE_FORMATS, FONTS_RESOURCES, FONT_SIZE_SELECTORS, FROM_EMAIL_ENV_KEYS, GLOBAL_TRANSLATIONS_PATTERN, GOOGLE_ANALYTICS_SELECTORS, GOOGLE_CALENDAR_DATE_FORMAT, GOOGLE_LOGIN_SELECTORS, GOOGLE_LOGIN_TEXTS, GOOGLE_SHEETS_SELECTORS, GooglePage, HELP_CENTER_ROUTES, HELP_CENTER_SELECTORS, HelpAndProfilePage, HelpAndProfilePageV2, INTEGRATIONS_TEXTS, INTEGRATION_SELECTORS, IPRestrictionsPage, IP_RESTRICTIONS_SELECTORS, IS_CI, IS_DEV_ENV, IS_MAILPIT_ENABLED, IS_SHADCN_UI, IS_STAGING_ENV, ImageUploader, InboundEmailApis, IntegrationBase, IpRestrictionsApi, KEYBOARD_SHORTCUTS_SELECTORS, KEYBOARD_SHORTCUT_TEST_CASES, LIST_MODIFIER_SELECTORS, LIST_MODIFIER_TAGS, LOGIN_SELECTORS, MAILPIT_BASE_URL, MAILPIT_DOMAIN_NAME, MEMBER_FORM_SELECTORS, MEMBER_SELECTORS, MEMBER_TEXTS, MERGE_TAGS_SELECTORS, MICROSOFT_LOGIN_SELECTORS, MICROSOFT_LOGIN_TEXTS, MailerUtils, MailpitApi, Member, MemberApis, MicrosoftPage, NEETO_AUTH_BASE_URL, NEETO_EDITOR_SELECTORS, NEETO_FILTERS_SELECTORS, NEETO_IMAGE_UPLOADER_SELECTORS, NEETO_ROUTES, NEETO_SEO_SELECTORS, NEETO_TEXT_MODIFIER_SELECTORS, NeetoAuthServer, NeetoChatWidget, NeetoEmailDeliveryApi, NeetoTowerApi, ONBOARDING_SELECTORS, ORGANIZATION_TEXTS, OTP_EMAIL_PATTERN, OrganizationPage, PAST_TIME_RANGES, PHONE_NUMBER_FORMATS, PLURAL, PRODUCT_ROLES_ROUTE_MAP, PROFILE_LINKS, PROFILE_SECTION_SELECTORS, PROJECT_NAMES, PROJECT_TRANSLATIONS_PATH, ROLES_SELECTORS, ROUTES, RailsEmailApiClient, RailsEmailUtils, RoleApis, RolesPage, RolesPageV2, SIGNUP_SELECTORS, SINGULAR, SLACK_DATA_QA_SELECTORS, SLACK_DEFAULT_CHANNEL, SLACK_SELECTORS, SLACK_WEB_TEXTS, STATUS_TEXTS, STORAGE_STATE, SecurityApi, SidebarSection, SlackApi, SlackPage, TABLE_SELECTORS, TAB_SELECTORS, TAGS_SELECTORS, TEAM_MEMBER_TEXTS, TEXT_MODIFIER_ROLES, TEXT_MODIFIER_SELECTORS, TEXT_MODIFIER_TAGS, THANK_YOU_SELECTORS, THEMES_SELECTORS, THEMES_TEXTS, THIRD_PARTY_RESOURCES, THIRD_PARTY_ROUTES, TIME_RANGES, TOASTR_MESSAGES, TWILIO_SELECTORS, TagsApi, TagsPage, TeamMembers, TeamMembersV2, ThankYouApi, ThankYouPage, TwilioApi, USER_AGENTS, WEBHOOK_SELECTORS, WebhookSiteApi, WebhooksPage, ZAPIER_LIMIT_EXHAUSTED_MESSAGE, ZAPIER_SELECTORS, ZAPIER_TEST_EMAIL, ZAPIER_TEST_EMAIL_V2, ZAPIER_WEB_TEXTS, ZapierPage, authenticateUser, baseURLGenerator, basicHTMLContent, clearCredentials, commands, cpuThrottlingUsingCDP, createOrganizationViaApi, createOrganizationViaRake, currencyUtils, dataQa, decodeQRCodeFromFile, definePlaywrightConfig, executeWithThrottledResources, extractSubdomainFromError, filterUtils, fixedMenuSelector, generatePhoneNumber, generatePhoneNumberDetails, generateRandomBypassEmail, generateRandomFile, generateStagingData, getByDataQA, getClipboardContent, getDirname, getFormattedPhoneNumber, getFullUrl, getGlobalUserProps, getGlobalUserState, getImagePathAndName, getIsoCodeFromPhoneCode, getListCount, globalShortcuts, grantClipboardPermissions, hexToRGB, hexToRGBA, i18nFixture, imageRegex, initializeCredentials, initializeTestData, initializeTotp, isGithubIssueOpen, isStagingOrganizationExpired, joinHyphenCase, joinString, login, mailpitDomainName, networkConditions, networkThrottlingUsingCDP, optionSelector, readFileAsBrowserFile, readFileSyncIfExists, removeCredentialFile, serializeFileForBrowser, shouldSkipCustomDomainSetup, shouldSkipSetupAndTeardown, simulateClickWithDelay, simulateTypingWithDelay, skipTest, squish, stealth as stealthTest, tableUtils, toCamelCase, updateCredentials, warmup, withCookieCache, writeDataToFile };
127367
+ export { ACTIONS, ADMIN_PANEL_SELECTORS, ALL_RESOURCES, ANALYTICS_RESOURCES, API_KEYS_SELECTORS, API_ROUTES, APP_RESOURCES, AUDIT_LOGS_SELECTORS, ApiKeysApi, ApiKeysPage, ApiKeysPageV2, AuditLogsPage, BASE_URL, CALENDAR_LABELS, CERTIFICATE_LIMIT_EXCEEDED_MESSAGE, CERTIFICATE_LIMIT_EXCEEDED_REGEXP, CHANGELOG_WIDGET_SELECTORS, CHAT_WIDGET_SELECTORS, CHAT_WIDGET_TEXTS, COLOR, COMMON_SELECTORS, COMMON_TEXTS, COMMUNITY_TEXTS, CREDENTIALS, CURRENT_TIME_RANGES, CUSTOM_DOMAIN_SELECTORS, CUSTOM_DOMAIN_SUFFIX, ColorPickerUtils, CustomCommands, CustomCommandsV2, CustomDomainApi, CustomDomainPage, DATE_FORMATS, DATE_PICKER_SELECTORS, DATE_RANGES, DATE_TEXTS, DEFAULT_TIMEZONE_ID, DEFAULT_WEBHOOKS_RESPONSE_TEXT, DESCRIPTION_EDITOR_TEXTS, EDITOR_VERIFY_TEXT_COLOR, EMBED_SELECTORS, EMOJI_LABEL, EMPTY_STORAGE_STATE, ENGAGE_TEXTS, ENVIRONMENT, EXAMPLE_URL, EXPANDED_FONT_SIZE, EXPORT_FILE_TYPES, EditorPage, EmailDeliveryUtils, EmbedBase, FILE_FORMATS, FONTS_RESOURCES, FONT_SIZE_SELECTORS, FROM_EMAIL_ENV_KEYS, GLOBAL_TRANSLATIONS_PATTERN, GOOGLE_ANALYTICS_SELECTORS, GOOGLE_CALENDAR_DATE_FORMAT, GOOGLE_LOGIN_SELECTORS, GOOGLE_LOGIN_TEXTS, GOOGLE_SHEETS_SELECTORS, GooglePage, HELP_CENTER_ROUTES, HELP_CENTER_SELECTORS, HelpAndProfilePage, HelpAndProfilePageV2, INTEGRATIONS_TEXTS, INTEGRATION_SELECTORS, IPRestrictionsPage, IP_RESTRICTIONS_SELECTORS, IS_CI, IS_DEV_ENV, IS_MAILPIT_ENABLED, IS_SHADCN_UI, IS_STAGING_ENV, ImageUploader, InboundEmailApis, IntegrationBase, IpRestrictionsApi, KEYBOARD_SHORTCUTS_SELECTORS, KEYBOARD_SHORTCUT_TEST_CASES, LIST_MODIFIER_SELECTORS, LIST_MODIFIER_TAGS, LOGIN_SELECTORS, MAILPIT_BASE_URL, MAILPIT_DOMAIN_NAME, MEMBER_FORM_SELECTORS, MEMBER_SELECTORS, MEMBER_TEXTS, MERGE_TAGS_SELECTORS, MICROSOFT_LOGIN_SELECTORS, MICROSOFT_LOGIN_TEXTS, MailerUtils, MailpitApi, Member, MemberApis, MicrosoftPage, NEETO_AUTH_BASE_URL, NEETO_EDITOR_SELECTORS, NEETO_FILTERS_SELECTORS, NEETO_IMAGE_UPLOADER_SELECTORS, NEETO_ROUTES, NEETO_SEO_SELECTORS, NEETO_TEXT_MODIFIER_SELECTORS, NeetoAuthServer, NeetoChatWidget, NeetoEmailDeliveryApi, NeetoTowerApi, ONBOARDING_SELECTORS, ORGANIZATION_TEXTS, OTP_EMAIL_PATTERN, OrganizationPage, PAST_TIME_RANGES, PHONE_NUMBER_FORMATS, PLURAL, PRODUCT_ROLES_ROUTE_MAP, PROFILE_LINKS, PROFILE_SECTION_SELECTORS, PROJECT_NAMES, PROJECT_TRANSLATIONS_PATH, ROLES_SELECTORS, ROUTES, RailsEmailApiClient, RailsEmailUtils, RoleApis, RolesPage, RolesPageV2, SIGNUP_SELECTORS, SINGULAR, SLACK_DATA_QA_SELECTORS, SLACK_DEFAULT_CHANNEL, SLACK_SELECTORS, SLACK_WEB_TEXTS, STATUS_TEXTS, STORAGE_STATE, SecurityApi, SidebarSection, SlackApi, SlackPage, SmsApi, SmsUtils, TABLE_SELECTORS, TAB_SELECTORS, TAGS_SELECTORS, TEAM_MEMBER_TEXTS, TEXT_MODIFIER_ROLES, TEXT_MODIFIER_SELECTORS, TEXT_MODIFIER_TAGS, THANK_YOU_SELECTORS, THEMES_SELECTORS, THEMES_TEXTS, THIRD_PARTY_RESOURCES, THIRD_PARTY_ROUTES, TIME_RANGES, TOASTR_MESSAGES, TWILIO_SELECTORS, TagsApi, TagsPage, TeamMembers, TeamMembersV2, ThankYouApi, ThankYouPage, TwilioApi, USER_AGENTS, WEBHOOK_SELECTORS, WebhookSiteApi, WebhooksPage, ZAPIER_LIMIT_EXHAUSTED_MESSAGE, ZAPIER_SELECTORS, ZAPIER_TEST_EMAIL, ZAPIER_TEST_EMAIL_V2, ZAPIER_WEB_TEXTS, ZapierPage, authenticateUser, baseURLGenerator, basicHTMLContent, clearCredentials, commands, cpuThrottlingUsingCDP, createOrganizationViaApi, createOrganizationViaRake, currencyUtils, dataQa, decodeQRCodeFromFile, definePlaywrightConfig, executeWithThrottledResources, extractSubdomainFromError, filterUtils, fixedMenuSelector, generatePhoneNumber, generatePhoneNumberDetails, generateRandomBypassEmail, generateRandomFile, generateStagingData, getByDataQA, getClipboardContent, getDirname, getFormattedPhoneNumber, getFullUrl, getGlobalUserProps, getGlobalUserState, getImagePathAndName, getIsoCodeFromPhoneCode, getListCount, globalShortcuts, grantClipboardPermissions, hexToRGB, hexToRGBA, i18nFixture, imageRegex, initializeCredentials, initializeTestData, initializeTotp, isGithubIssueOpen, isStagingOrganizationExpired, joinHyphenCase, joinString, login, mailpitDomainName, minutesAgo, networkConditions, networkThrottlingUsingCDP, optionSelector, readFileAsBrowserFile, readFileSyncIfExists, removeCredentialFile, serializeFileForBrowser, shouldSkipCustomDomainSetup, shouldSkipSetupAndTeardown, simulateClickWithDelay, simulateTypingWithDelay, skipTest, squish, stealth as stealthTest, tableUtils, toCamelCase, updateCredentials, warmup, withCookieCache, writeDataToFile };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bigbinary/neeto-playwright-commons",
3
- "version": "4.7.3",
3
+ "version": "4.7.4",
4
4
  "description": "A package encapsulating common playwright code across neeto projects.",
5
5
  "repository": "git@github.com:bigbinary/neeto-playwright-commons.git",
6
6
  "license": "apache-2.0",