UNPKG

@clerk/testing

Version:

Utilities to help you create E2E test suites for apps using Clerk

10 lines (6 loc) • 6.99 kB
"use strict";var K=Object.create;var l=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var P=Object.getPrototypeOf,v=Object.prototype.hasOwnProperty;var O=(e,n)=>{for(var r in n)l(e,r,{get:n[r],enumerable:!0})},k=(e,n,r,t)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of b(n))!v.call(e,o)&&o!==r&&l(e,o,{get:()=>n[o],enumerable:!(t=L(n,o))||t.enumerable});return e};var F=(e,n,r)=>(r=e!=null?K(P(e)):{},k(n||!e||!e.__esModule?l(r,"default",{value:e,enumerable:!0}):r,e)),N=e=>k(l({},"__esModule",{value:!0}),e);var H={};O(H,{addClerkCommands:()=>I,clerkSetup:()=>w,createAgentTestingTask:()=>A,setupClerkTestingToken:()=>d});module.exports=N(H);var m=require("@clerk/backend"),U="A secretKey is required to create agent tasks. Pass it directly or set the CLERK_SECRET_KEY environment variable.";var x="Failed to create agent task: ";async function _(e){let{apiUrl:n,secretKey:r,clerkClient:t,...o}=e;if(!t&&!r)throw new Error(U);let a=t??(0,m.createClerkClient)({apiUrl:n,secretKey:r});try{return await a.agentTasks.create(o)}catch(s){throw new Error(x+(s instanceof Error?s.message:String(s)))}}var u="__clerk_testing_token";var T=require("@clerk/backend"),p=require("@clerk/shared/error"),h=require("@clerk/shared/keys"),f=F(require("dotenv")),C=5,M=1e3,Y=500,g=3e4,B=new Set([408,429,500,502,503,504]),G=new Set(["ECONNREFUSED","ECONNRESET","ENOTFOUND","ETIMEDOUT","EAI_AGAIN"]);function D(e){return e instanceof Error&&"code"in e&&G.has(e.code??"")}async function $(e,n){for(let r=0;r<=C;r++)try{return await e()}catch(t){let o=(0,p.isClerkAPIResponseError)(t)&&B.has(t.status),a=D(t);if(!o&&!a||r===C)throw t;let s=(0,p.isClerkAPIResponseError)(t)?t.status:t.code,c=M*Math.pow(2,r)+Math.random()*Y,i=(0,p.isClerkAPIResponseError)(t)&&typeof t.retryAfter=="number"?Math.min(Math.max(t.retryAfter*1e3,c),g):Math.min(c,g);console.warn(`[Retry] ${s} for ${n}, attempt ${r+1}/${C}, waiting ${Math.round(i)}ms`),await new Promise(E=>setTimeout(E,i))}throw new Error("Unreachable")}var S=async e=>{let{debug:n=!1,dotenv:r=!0,...t}=e||{},o=i=>{n&&console.log(`Clerk: ${i}`)};o("Setting up Clerk..."),r&&f.default.config({path:[".env.local",".env"]});let a=t.publishableKey||process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY||process.env.VITE_CLERK_PUBLISHABLE_KEY||process.env.CLERK_PUBLISHABLE_KEY||process.env.REACT_APP_CLERK_PUBLISHABLE_KEY||process.env.EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY,s=t.secretKey||process.env.CLERK_SECRET_KEY,c=process.env.CLERK_TESTING_TOKEN;if(!a)throw new Error("You need to set the CLERK_PUBLISHABLE_KEY environment variable.");if(!s&&!c)throw new Error("You need to set the CLERK_SECRET_KEY or the CLERK_TESTING_TOKEN environment variable.");if(s&&!c){o("Fetching testing token from Clerk Backend API...");try{let i=t?.apiUrl||process.env.CLERK_API_URL,E=(0,T.createClerkClient)({secretKey:s,apiUrl:i});c=(await $(()=>E.testingTokens.createTestingToken(),"testingTokens.createTestingToken")).token}catch(i){throw console.error("Failed to fetch testing token from Clerk API."),i}}return{CLERK_FAPI:e?.frontendApiUrl||(0,h.parsePublishableKey)(a)?.frontendApi,CLERK_TESTING_TOKEN:c}};var y="The Clerk Frontend API URL is required to bypass bot protection. Make sure the clerkSetup function is called during your global setup before setupClerkTestingToken is called.";var R=async({signInParams:e,windowObject:n})=>{try{let r=n||window;if(!r.Clerk.client)return;let t=r.Clerk.client.signIn;switch(e.strategy){case"password":{let o=await t.create(e);await r.Clerk.setActive({session:o.createdSessionId});break}case"ticket":{let o=await t.create({strategy:"ticket",ticket:e.ticket});if(o.status==="complete")await r.Clerk.setActive({session:o.createdSessionId});else throw new Error(`Sign-in with ticket failed. Status: ${o.status}`);break}case"phone_code":{if(!/^\+1\d{3}55501\d{2}$/.test(e.identifier))throw new Error(`Phone number should be a test phone number. Example: +1XXX55501XX. Learn more here: https://clerk.com/docs/testing/test-emails-and-phones#phone-numbers`);let{supportedFirstFactors:o}=await t.create({identifier:e.identifier}),a=o?.find(s=>s.strategy==="phone_code");if(a){await t.prepareFirstFactor({strategy:"phone_code",phoneNumberId:a.phoneNumberId});let s=await t.attemptFirstFactor({strategy:"phone_code",code:"424242"});if(s.status==="complete")await r.Clerk.setActive({session:s.createdSessionId});else throw new Error(`Status is ${s.status}`)}else throw new Error("phone_code is not enabled.");break}case"email_code":{if(!e.identifier.includes("+clerk_test"))throw new Error(`Email should be a test email. Any email with the +clerk_test subaddress is a test email address. Learn more here: https://clerk.com/docs/testing/test-emails-and-phones#email-addresses`);let{supportedFirstFactors:o}=await t.create({identifier:e.identifier}),a=o?.find(s=>s.strategy==="email_code");if(a){await t.prepareFirstFactor({strategy:"email_code",emailAddressId:a.emailAddressId});let s=await t.attemptFirstFactor({strategy:"email_code",code:"424242"});if(s.status==="complete")await r.Clerk.setActive({session:s.createdSessionId});else throw new Error(`Status is ${s.status}`)}else throw new Error("email_code is not enabled.");break}default:throw new Error(`Unsupported strategy: ${e.strategy}`)}}catch(r){throw new Error(`Clerk: Failed to sign in: ${r?.message}`)}};var w=async({config:e,options:n})=>{if(!e)throw new Error("The Cypress config object is required.");let{CLERK_FAPI:r,CLERK_TESTING_TOKEN:t}=await S(n);return e.env.CLERK_FAPI=r,e.env.CLERK_TESTING_TOKEN=t,e};function A(e){return _({...e,apiUrl:e.apiUrl||Cypress.env("CLERK_API_URL")||process.env.CLERK_API_URL,secretKey:e.secretKey||Cypress.env("CLERK_SECRET_KEY")||process.env.CLERK_SECRET_KEY})}var d=e=>{let n=e?.options?.frontendApiUrl||Cypress.env("CLERK_FAPI");if(!n)throw new Error(y);let r=`https://${n}/v1/**`;cy.intercept(r,t=>{let o=Cypress.env("CLERK_TESTING_TOKEN");o&&(t.query[u]=o),t.continue(),t.on("response",a=>{a.body?.response?.captcha_bypass===!1&&(a.body.response.captcha_bypass=!0),a.body?.client?.captcha_bypass===!1&&(a.body.client.captcha_bypass=!0)})})};var I=({Cypress:e,cy:n})=>{e.Commands.add("clerkSignIn",r=>{d(),n.log("Clerk: Signing in..."),n.window().should(t=>{expect(t).to.not.have.property("Clerk",void 0),expect(t.Clerk.loaded).to.eq(!0)}).then(async t=>{await R({windowObject:t,signInParams:r}),n.log("Clerk: Finished signing in.")})}),e.Commands.add("clerkSignOut",r=>{n.log("Clerk: Signing out..."),n.window().should(t=>{expect(t).to.not.have.property("Clerk",void 0),expect(t.Clerk.loaded).to.eq(!0)}).then(async t=>{await t.Clerk.signOut(r),n.log("Clerk: Finished signing out.")})}),e.Commands.add("clerkLoaded",()=>{n.window().should(r=>{expect(r).to.not.have.property("Clerk",void 0),expect(r.Clerk.loaded).to.eq(!0)})})};0&&(module.exports={addClerkCommands,clerkSetup,createAgentTestingTask,setupClerkTestingToken}); //# sourceMappingURL=index.js.map