@bigbinary/neeto-playwright-commons 4.7.3 → 4.7.5

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.
Files changed (4) hide show
  1. package/README.md +1 -0
  2. package/index.d.ts +125 -2
  3. package/index.js +106 -11
  4. package/package.json +1 -1
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
  }
@@ -4386,6 +4506,8 @@ declare const IS_STAGING_ENV: boolean;
4386
4506
  */
4387
4507
  declare const IS_DEV_ENV: boolean;
4388
4508
  declare const IS_CI: boolean;
4509
+ declare const IS_DEV_CI: boolean;
4510
+ declare const IS_WEBKIT: boolean;
4389
4511
  declare const DEFAULT_WEBHOOKS_RESPONSE_TEXT: string;
4390
4512
  /**
4391
4513
  *
@@ -9376,6 +9498,7 @@ declare const initializeTestData: (product: NeetoProducts) => {
9376
9498
  baseURL: string;
9377
9499
  };
9378
9500
  declare const imageRegex: (imageName: string) => RegExp;
9501
+ declare const minutesAgo: (minutes: number) => Date;
9379
9502
  /**
9380
9503
  *
9381
9504
  * 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 +10450,5 @@ declare class InboundEmailApis {
10327
10450
  reply: (emailParams: ReplyInboundEmailParams) => Promise<playwright_core.APIResponse | undefined>;
10328
10451
  private deliverSource;
10329
10452
  }
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 };
10453
+ 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_CI, IS_DEV_ENV, IS_MAILPIT_ENABLED, IS_SHADCN_UI, IS_STAGING_ENV, IS_WEBKIT, 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 };
10454
+ 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';
@@ -308,6 +308,8 @@ const EXAMPLE_URL = "https://example.com";
308
308
  const IS_STAGING_ENV = process.env.TEST_ENV === ENVIRONMENT.staging;
309
309
  const IS_DEV_ENV = process.env.TEST_ENV === ENVIRONMENT.development;
310
310
  const IS_CI = isPresent(process.env.NEETO_CI_JOB_ID);
311
+ const IS_DEV_CI = IS_DEV_ENV && IS_CI;
312
+ const IS_WEBKIT = process.env.PLAYWRIGHT_PROJECT === "webkit";
311
313
  const DEFAULT_WEBHOOKS_RESPONSE_TEXT = JSON.stringify({ success: true });
312
314
  const STORAGE_STATE = "./e2e/auth/user.json";
313
315
  const DEFAULT_TIMEZONE_ID = "Asia/Calcutta";
@@ -1394,6 +1396,7 @@ const imageRegex = (imageName) => {
1394
1396
  const [baseName, extension] = imageName.split(".");
1395
1397
  return new RegExp(`${baseName}.*\\.${extension}$`);
1396
1398
  };
1399
+ const minutesAgo = (minutes) => new Date(Date.now() - minutes * 60 * 1000);
1397
1400
 
1398
1401
  const optionSelector = (option) => `neeto-editor-fixed-menu-${option}-option`;
1399
1402
  const fixedMenuSelector = (selector) => `neeto-editor-fixed-menu-${selector}`;
@@ -117047,6 +117050,80 @@ class QRCodeUtils {
117047
117050
  };
117048
117051
  }
117049
117052
 
117053
+ const TESTING_SMS_PATH = "/api/v1/testing/sms";
117054
+ class SmsApi {
117055
+ neetoPlaywrightUtilities;
117056
+ constructor(neetoPlaywrightUtilities) {
117057
+ this.neetoPlaywrightUtilities = neetoPlaywrightUtilities;
117058
+ }
117059
+ fetchSms = async (searchParams = {}) => {
117060
+ const response = await this.neetoPlaywrightUtilities.apiRequest({
117061
+ url: TESTING_SMS_PATH,
117062
+ params: keysToSnakeCase(searchParams),
117063
+ });
117064
+ if (!response) {
117065
+ throw new Error(`Received no response from GET ${TESTING_SMS_PATH}.`);
117066
+ }
117067
+ return keysToCamelCase(await response.json());
117068
+ };
117069
+ deleteSms = (receivedBefore) => this.neetoPlaywrightUtilities.apiRequest({
117070
+ url: `${TESTING_SMS_PATH}/destroy`,
117071
+ method: "delete",
117072
+ params: keysToSnakeCase({ receivedBefore }),
117073
+ });
117074
+ purgeAllSms = () => this.neetoPlaywrightUtilities.apiRequest({
117075
+ url: `${TESTING_SMS_PATH}/purge_all`,
117076
+ method: "delete",
117077
+ });
117078
+ }
117079
+
117080
+ const toBackendTimestamp = (date) => new Date(Math.floor(date.valueOf() / 1000) * 1000 - 1).toISOString();
117081
+ const findLatestSms = (messages) => messages.reduce((latest, sms) => !latest || new Date(sms.receivedAt) > new Date(latest.receivedAt)
117082
+ ? sms
117083
+ : latest, null);
117084
+ class SmsUtils {
117085
+ neetoPlaywrightUtilities;
117086
+ smsApi;
117087
+ constructor(neetoPlaywrightUtilities) {
117088
+ this.neetoPlaywrightUtilities = neetoPlaywrightUtilities;
117089
+ this.smsApi = new SmsApi(neetoPlaywrightUtilities);
117090
+ }
117091
+ toSearchParams = ({ receivedAfter = minutesAgo(60), ...filters }) => ({
117092
+ ...filters,
117093
+ receivedAfter: toBackendTimestamp(receivedAfter),
117094
+ });
117095
+ listSms = (criteria = {}) => this.smsApi.fetchSms(this.toSearchParams(criteria));
117096
+ waitForSms = async (criteria = {}, { timeout = 10_000, expectedSmsCount = 1, shouldThrowErrorOnTimeout = true, } = {}) => {
117097
+ const searchParams = this.toSearchParams(criteria);
117098
+ let latestSms = null;
117099
+ const sms = (await this.neetoPlaywrightUtilities.executeRecursively({
117100
+ callback: () => latestSms,
117101
+ condition: async () => {
117102
+ const messages = await this.smsApi.fetchSms(searchParams);
117103
+ latestSms = findLatestSms(messages);
117104
+ return messages.length >= Math.max(expectedSmsCount, 1);
117105
+ },
117106
+ timeout,
117107
+ }));
117108
+ if (expectedSmsCount === 0) {
117109
+ if (sms) {
117110
+ throw new Error(`Expected no SMS matching ${JSON.stringify(searchParams)}, but received ${JSON.stringify(sms)}.`);
117111
+ }
117112
+ return {};
117113
+ }
117114
+ if (!sms) {
117115
+ if (shouldThrowErrorOnTimeout) {
117116
+ throw new Error(`Timed out waiting for SMS matching ${JSON.stringify(searchParams)}, expected at least ${expectedSmsCount}.`);
117117
+ }
117118
+ return {};
117119
+ }
117120
+ return sms;
117121
+ };
117122
+ expectNoSms = (criteria = {}, { timeout } = {}) => this.waitForSms(criteria, { timeout, expectedSmsCount: 0 });
117123
+ clearStaleSms = (receivedBefore = minutesAgo(10)) => this.smsApi.deleteSms(toBackendTimestamp(receivedBefore));
117124
+ purgeAllSms = () => this.smsApi.purgeAllSms();
117125
+ }
117126
+
117050
117127
  const hexToRGBA = (hex) => {
117051
117128
  let r = 0, g = 0, b = 0, a = 1;
117052
117129
  if (hex.length === 5) {
@@ -117162,6 +117239,19 @@ const commands = {
117162
117239
  await use(mailerUtils);
117163
117240
  IS_DEV_ENV && (await mailerUtils.railsEmailUtils.clearStaleEmails());
117164
117241
  },
117242
+ smsUtils: async ({ neetoPlaywrightUtilities }, use) => {
117243
+ const smsUtils = new SmsUtils(neetoPlaywrightUtilities);
117244
+ await use(smsUtils);
117245
+ if (IS_DEV_ENV) {
117246
+ // Not every host app draws the :dev_sms routes; teardown must not fail the test when they are absent.
117247
+ try {
117248
+ await smsUtils.clearStaleSms();
117249
+ }
117250
+ catch (error) {
117251
+ console.warn("Failed to clear stale SMS:", error);
117252
+ }
117253
+ }
117254
+ },
117165
117255
  colorPicker: async ({ page }, use) => {
117166
117256
  const colorPicker = new ColorPickerUtils(page);
117167
117257
  await use(colorPicker);
@@ -127027,6 +127117,7 @@ const playdashProductionHealthConfig = {
127027
127117
  };
127028
127118
  const railsPort = process.env.RAILS_SERVER_PORT;
127029
127119
  const vitePort = process.env.VITE_PORT;
127120
+ const isPlaywrightRun = process.env.PLAYWRIGHT_RUN === "true";
127030
127121
  const PROJECT_NAMES = {
127031
127122
  setup: "setup",
127032
127123
  chromium: "chromium",
@@ -127106,15 +127197,19 @@ const definePlaywrightConfig = (overrides) => {
127106
127197
  stdout: "ignore",
127107
127198
  stderr: "ignore",
127108
127199
  },
127109
- {
127110
- command: "yarn dev --host",
127111
- url: `http://127.0.0.1:${vitePort}/@vite/client`,
127112
- reuseExistingServer: !IS_CI,
127113
- timeout: 2 * 60 * 1000,
127114
- cwd: "..",
127115
- stdout: "ignore",
127116
- stderr: "ignore",
127117
- },
127200
+ ...(!isPlaywrightRun
127201
+ ? [
127202
+ {
127203
+ command: "yarn dev --host",
127204
+ url: `http://127.0.0.1:${vitePort}/@vite/client`,
127205
+ reuseExistingServer: !IS_CI,
127206
+ timeout: 2 * 60 * 1000,
127207
+ cwd: "..",
127208
+ stdout: "ignore",
127209
+ stderr: "ignore",
127210
+ },
127211
+ ]
127212
+ : []),
127118
127213
  ...webServerOverrides,
127119
127214
  ],
127120
127215
  }),
@@ -127276,4 +127371,4 @@ class InboundEmailApis {
127276
127371
  };
127277
127372
  }
127278
127373
 
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 };
127374
+ 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_CI, IS_DEV_ENV, IS_MAILPIT_ENABLED, IS_SHADCN_UI, IS_STAGING_ENV, IS_WEBKIT, 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.5",
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",