@clerk/testing
Version:
Utilities to help you create E2E test suites for apps using Clerk
2 lines • 14.1 kB
JavaScript
import{a as g}from"../../chunk-YVI6XYHN.mjs";import"../../chunk-M5YIJ3SE.mjs";var m=(a,e)=>{let{page:r,useTestingToken:t=!0}=a,n=Object.create(r);return Object.assign(n,{goToAppHome:async()=>{if(!e.baseURL)throw new Error("Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.");try{t&&await g({page:r}),await r.goto(e.baseURL)}catch{}},goToRelative:async(s,l={})=>{if(!e.baseURL)throw new Error("Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.");let c;try{r.url().includes("about:blank")?c=new URL(s,e.baseURL):c=new URL(s,r.url())}catch{c=new URL(s,e.baseURL)}return l.searchParams&&(c.search=l.searchParams.toString()),t&&await g({page:r}),r.goto(c.toString(),{timeout:l.timeout??2e4,waitUntil:l.waitUntil})},waitForClerkJsLoaded:async()=>r.waitForFunction(()=>window.Clerk?.loaded),signOut:async()=>r.waitForFunction(()=>window.Clerk?.signOut({})),waitForClerkComponentMounted:async()=>r.waitForSelector(".cl-rootBox",{state:"attached"}),waitForAppUrl:async s=>{if(!e.baseURL)throw new Error("Attempted to call method requiring baseURL, but baseURL was not provided to createPageObjects.");return r.waitForURL(new URL(s,e.baseURL).toString())},cookies:async()=>{let s=await r.context().cookies(),l=s.reduce((c,u)=>(u.name.match(/^(__.*_)(.{8})$/)?c.set(u.name.replace(/^(__.*_)(.{8})$/,"$1*"),u):c.set(u.name,u),c),new Map);return Object.assign(l,{raw:()=>s})}})};var i=({page:a})=>{let e={continue:()=>a.getByRole("button",{name:"Continue",exact:!0}).click(),setEmailAddress:r=>e.getEmailAddressInput().fill(r),setPassword:r=>e.getPasswordInput().fill(r),setPasswordConfirmation:r=>a.locator("input[name=confirmPassword]").fill(r),enterOtpCode:async r=>{await a.getByRole("textbox",{name:/digit 1/i}).click(),await a.keyboard.type(r,{delay:100})},enterTestOtpCode:async()=>e.enterOtpCode("424242"),fillTestOtpCode:async r=>a.getByRole("textbox",{name:r}).fill("424242"),getIdentifierInput:()=>a.locator("input[name=identifier]"),getEmailAddressInput:()=>a.locator("input[name=emailAddress]"),getPhoneNumberInput:()=>a.locator("input[name=phoneNumber]"),getUsernameInput:()=>a.locator("input[name=username]"),getPasswordInput:()=>a.locator("input[name=password]"),getLegalAccepted:()=>a.locator("input[name=legalAccepted]"),getFirstNameInput:()=>a.locator("input[name=firstName]"),getLastNameInput:()=>a.locator("input[name=lastName]"),waitForSession:async()=>a.waitForFunction(()=>!!window.Clerk?.session)};return e};var d=a=>{let{page:e}=a,r={...i(a),waitForMounted:(t=".cl-checkout-root")=>e.waitForSelector(t,{state:"attached"}),closeDrawer:()=>e.locator(".cl-drawerClose").click(),fillTestCard:async()=>{await r.fillCard({number:"4242424242424242",expiration:"1234",cvc:"123",country:"United States",zip:"12345"})},fillCard:async t=>{let n=e.frameLocator('iframe[src*="elements-inner-payment"]');await n.getByLabel("Card number").fill(t.number),await n.getByLabel("Expiration date").fill(t.expiration),await n.getByLabel("Security code").fill(t.cvc),await n.getByLabel("Country").selectOption(t.country),await n.getByLabel("ZIP code").fill(t.zip)},waitForStipeElements:async()=>e.frameLocator('iframe[src*="elements-inner-payment"]').getByLabel("Card number").waitFor({state:"visible"}),clickPayOrSubscribe:async()=>{await r.root.getByRole("button",{name:/subscribe|pay\s\$/i}).click()},waitForSubscribeButton:async()=>{await r.root.getByRole("button",{name:/^subscribe$/i}).waitFor({state:"visible"})},confirmAndContinue:async()=>{await r.root.getByRole("button",{name:/^continue$/i}).click()},clickAddPaymentMethod:async()=>{await r.root.getByRole("radio",{name:"Add payment method"}).click()},clickPaymentMethods:async()=>{await r.root.getByRole("radio",{name:"Payment Methods"}).click()},root:e.locator(".cl-checkout-root")};return r};var p=({page:a})=>({toBeLoaded:async()=>a.waitForFunction(()=>!!window.Clerk?.loaded),getClientSideActor:()=>a.evaluate(()=>window.Clerk?.session?.actor),toBeLoading:async()=>a.waitForFunction(()=>window.Clerk?.status==="loading"),toBeReady:async()=>a.waitForFunction(()=>window.Clerk?.status==="ready"),toBeDegraded:async()=>a.waitForFunction(()=>window.Clerk?.status==="degraded"),getClientSideUser:()=>a.evaluate(()=>window.Clerk?.user)});import{expect as w}from"@playwright/test";var f=({page:a})=>({toBeHandshake:async e=>{let r=await e.request().redirectedFrom()?.redirectedFrom()?.response();w(r?.status()).toBe(307),w(r?.headers()["x-clerk-auth-status"]).toContain("handshake")},toBeSignedOut:e=>a.waitForFunction(()=>!window.Clerk?.user,null,{timeout:e?.timeOut}),toBeSignedIn:async()=>a.waitForFunction(()=>!!window.Clerk?.user),toBeSignedInAsActor:async()=>a.waitForFunction(()=>!!window.Clerk?.session?.actor),toHaveResolvedTask:async()=>a.waitForFunction(()=>!window.Clerk?.session?.currentTask)});var y=a=>{let{page:e}=a;return{waitForMounted:(t=".cl-impersonationFab")=>e.waitForSelector(t,{state:"attached"}),getSignOutLink:()=>e.locator(".cl-impersonationFab").getByText("Sign out")}};var h=a=>{let{page:e}=a,r="#--clerk-keyless-prompt-button";return{waitForMounted:()=>e.waitForSelector(r,{state:"attached"}),waitForUnmounted:()=>e.waitForSelector(r,{state:"detached"}),isExpanded:()=>e.locator(r).getAttribute("aria-expanded").then(n=>n==="true"),toggle:()=>e.locator(r).click(),promptsToClaim:()=>e.getByRole("link",{name:/^claim application$/i}),promptToUseClaimedKeys:()=>e.getByRole("link",{name:/^get api keys$/i}),promptToDismiss:()=>e.getByRole("button",{name:/^dismiss$/i})}};import{expect as b}from"@playwright/test";var P=a=>{let{page:e}=a,r={...i(a),goTo:async(t="/switcher")=>(await e.goToRelative(t),r.waitForMounted()),waitForMounted:()=>e.waitForSelector(".cl-organizationSwitcher-root",{state:"attached"}),expectNoOrganizationSelected:()=>b(e.getByText(/No organization selected/i)).toBeVisible(),expectPersonalAccount:()=>b(e.getByText(/personal account/i)).toBeVisible(),toggleTrigger:()=>e.locator(".cl-organizationSwitcherTrigger").click(),waitForAnOrganizationToSelected:()=>e.waitForSelector(".cl-userPreviewMainIdentifier__personalWorkspace",{state:"detached"})};return r};var F=a=>{let{page:e}=a,r={toggle:o=>e.locator(`.cl-pricingTableCard__${o} .cl-pricingTableCardPeriodToggle`),indicator:o=>e.locator(`.cl-pricingTableCard__${o} .cl-switchIndicator`),badge:o=>e.locator(`.cl-pricingTableCard__${o} .cl-badge`),footer:o=>e.locator(`.cl-pricingTableCard__${o} .cl-pricingTableCardFooter`)},t=async(o,s)=>{async function l(u,I,L,j=5e3){return e.waitForFunction(({sel:A,attr:v,val:M})=>document.querySelector(A)?.getAttribute(v)===M,{sel:u,attr:I,val:L},{timeout:j}).then(()=>!0).catch(()=>!1)}let c=await l(`.cl-pricingTableCard__${o} .cl-switchIndicator`,"data-checked","true",500);c&&s==="monthly"&&await r.toggle(o).click(),!c&&s==="annually"&&await r.toggle(o).click()};return{...i(a),waitForMounted:(o=".cl-pricingTable-root")=>e.waitForSelector(o,{state:"attached"}),clickResubscribe:async()=>{await e.getByText("Re-subscribe").click()},waitToBeActive:async({planSlug:o})=>r.badge(o).getByText("Active").waitFor({state:"visible"}),getPlanCardCTA:({planSlug:o})=>r.footer(o).getByRole("button",{name:/get|switch|subscribe/i}),startCheckout:async({planSlug:o,shouldSwitch:s,period:l})=>{let c=s===!0?"Switch to this plan":s===!1?/subscribe/i:/get|switch|subscribe/i;l&&await t(o,l),await r.footer(o).getByRole("button",{name:c}).click()}}};import{expect as k}from"@playwright/test";var S=a=>{let{page:e}=a;return{...i(a),resolveForceOrganizationSelectionTask:async t=>{let n=e.getByRole("button",{name:/create organization/i});await k(n).toBeVisible(),k(e.url()).toContain("add-organization"),await e.locator("input[name=name]").fill(t.name),await e.locator("input[name=slug]").fill(t.slug),await n.click()}}};import{expect as B}from"@playwright/test";var C=a=>{let{page:e}=a,r={...i(a),goTo:async t=>{let n=await e.goToRelative("/sign-in",t);return typeof t?.headlessSelector<"u"?await r.waitForMounted(t.headlessSelector):await r.waitForMounted(),n},waitForMounted:(t=".cl-signIn-root")=>e.waitForSelector(t,{state:"attached"}),waitForModal:t=>e.waitForSelector(".cl-modalContent:has(.cl-signIn-root)",{state:t==="closed"?"detached":"attached"}),setIdentifier:t=>r.getIdentifierInput().fill(t),setInstantPassword:async t=>{let n=r.getPasswordInput();await B(n).toBeVisible(),await n.fill(t,{force:!0})},usePhoneNumberIdentifier:()=>e.getByRole("link",{name:/^use phone/i}),useEmailIdentifier:()=>e.getByRole("link",{name:/^use email/i}),useUsernameIdentifier:()=>e.getByRole("link",{name:/^username$/i}),getForgotPassword:()=>e.getByRole("link",{name:/forgot password/i}),getGoToSignUp:()=>e.getByRole("link",{name:/sign up/i}),getResetPassword:()=>e.getByRole("button",{name:/(reset password|reset your password)/i}),getUseAnotherMethodLink:()=>e.getByRole("link",{name:/use another method/i}),getAltMethodsEmailCodeButton:()=>e.getByRole("button",{name:/email code to/i}),getAltMethodsEmailLinkButton:()=>e.getByRole("button",{name:/email link to/i}),signInWithOauth:t=>e.getByRole("button",{name:new RegExp(`continue with ${t}`,"gi")}),signInWithEmailAndInstantPassword:async({email:t,password:n,waitForSession:o=!0})=>{let s=r.getIdentifierInput();await B(s).toBeVisible(),await s.fill(t),await r.setInstantPassword(n),await r.continue(),o&&await r.waitForSession()}};return r};var R=a=>{let{page:e}=a,r={...i(a),goTo:async t=>(await e.goToRelative("/sign-up",{searchParams:t?.searchParams}),typeof t?.headlessSelector<"u"?r.waitForMounted(t.headlessSelector):r.waitForMounted()),waitForMounted:(t=".cl-signUp-root")=>e.waitForSelector(t,{state:"attached"}),waitForModal:t=>e.waitForSelector(".cl-modalContent:has(.cl-signUp-root)",{state:t==="closed"?"detached":"attached"}),signUpWithOauth:t=>e.getByRole("button",{name:new RegExp(`continue with ${t}`,"gi")}),signUp:async t=>{t.firstName&&await r.getFirstNameInput().fill(t.firstName),t.lastName&&await r.getLastNameInput().fill(t.lastName),t.email&&await r.getEmailAddressInput().fill(t.email),t.username&&await r.getUsernameInput().fill(t.username),t.phoneNumber&&await r.getPhoneNumberInput().fill(t.phoneNumber),t.password&&await r.getPasswordInput().fill(t.password),t.legalAccepted&&await r.getLegalAccepted().check(),await r.continue()},signUpWithEmailAndPassword:async t=>{await r.signUp({email:t.email,password:t.password})},waitForEmailVerificationScreen:async()=>{await e.waitForURL(/verify/),await e.getByRole("heading",{name:/Verify your email/i}).waitFor()}};return r};var T=({page:a})=>({setup:async()=>g({page:a})});import{expect as N}from"@playwright/test";var U=a=>{let{page:e}=a;return{waitForMounted:()=>e.waitForSelector(".cl-userButtonTrigger",{state:"attached"}),toggleTrigger:()=>e.locator(".cl-userButtonTrigger").click(),waitForPopover:()=>e.waitForSelector(".cl-userButtonPopoverCard",{state:"visible"}),waitForPopoverClosed:()=>e.waitForSelector(".cl-userButtonPopoverCard",{state:"detached"}),toHaveVisibleMenuItems:async t=>{(typeof t=="string"||t instanceof RegExp)&&(t=[t]);for(let n of t)await N(e.getByRole("menuitem",{name:n})).toBeVisible()},triggerSignOut:()=>e.getByRole("menuitem",{name:/Sign out$/i}).click(),triggerManageAccount:()=>e.getByRole("menuitem",{name:/Manage account/i}).click()}};var x=a=>{let{page:e}=a,r={...i(a),goTo:async t=>(await e.goToRelative("/user",t),r.waitForMounted()),switchToSecurityTab:async()=>{await e.getByText(/Security/i).click()},switchToBillingTab:async()=>{await e.getByText(/Billing/i).click()},waitForMounted:()=>e.waitForSelector(".cl-userProfile-root",{state:"attached"}),clickSetUsername:()=>e.getByText(/Set username/i).click(),clickToUpdateProfile:()=>e.getByText(/update profile/i).click(),clickUpdateUsername:()=>e.getByText(/update username/i).click(),clickSetPassword:()=>e.getByText(/Set password/i).click(),waitForSectionCard:(t,n)=>e.waitForSelector(`.cl-profileSectionContent__${t} .cl-headerTitle`,{state:n?"visible":"detached"}),waitForSectionCardOpened:t=>r.waitForSectionCard(t,!0),waitForSectionCardClosed:t=>r.waitForSectionCard(t,!1),typeUsername:t=>r.getUsernameInput().fill(t),typeFirstName:t=>r.getFirstNameInput().fill(t),typeLastName:t=>r.getLastNameInput().fill(t),typePhoneNumber:t=>r.getPhoneNumberInput().fill(t),clickAddEmailAddress:()=>e.getByText(/add email address/i).click(),clickAddPhoneNumber:()=>e.getByText(/add phone number/i).click(),typeEmailAddress:t=>e.getByLabel(/Email address/i).fill(t),waitForUserProfileModal:t=>e.waitForSelector(".cl-modalContent:has(.cl-userProfile-root)",{state:t==="closed"?"detached":"attached"})};return r};var E=a=>{let{page:e}=a;return{...i(a),waitForMounted:(t=".cl-userVerification-root")=>e.waitForSelector(t,{state:"attached"}),waitForClosed:(t=".cl-userVerification-root")=>e.waitForSelector(t,{state:"detached"}),closeReverificationModal:()=>e.getByLabel("Close modal").click(),getUseAnotherMethodLink:()=>e.getByRole("link",{name:/use another method/i}),getAltMethodsEmailCodeButton:()=>e.getByRole("button",{name:/email code to/i}),getAltMethodsEmailLinkButton:()=>e.getByRole("button",{name:/email link to/i})}};var O=a=>{let{page:e}=a,r={...i(a),goTo:async t=>(await e.goToRelative("/waitlist",{searchParams:t?.searchParams}),typeof t?.headlessSelector<"u"?r.waitForMounted(t.headlessSelector):r.waitForMounted()),waitForMounted:(t=".cl-waitlist-root")=>e.waitForSelector(t,{state:"attached"}),joinWaitlist:async t=>{await r.getEmailAddressInput().fill(t.email),await r.joinWaitlistContinue()},joinWaitlistContinue:()=>e.getByRole("button",{name:"Join the waitlist",exact:!0}).click()};return r};var _=({page:a,useTestingToken:e=!0,baseURL:r})=>{let t=m({page:a,useTestingToken:e},{baseURL:r}),n={page:t};return{page:t,clerk:p(n),checkout:d(n),expect:f(n),impersonation:y(n),keylessPopover:h(n),organizationSwitcher:P(n),pricingTable:F(n),sessionTask:S(n),signIn:C(n),signUp:R(n),testingToken:T(n),userButton:U(n),userProfile:x(n),userVerification:E(n),waitlist:O(n)}};export{m as createAppPageObject,_ as createPageObjects};
//# sourceMappingURL=index.mjs.map