cypress/support/commands.js
// Copyright © 2022 Ory Corp
// SPDX-License-Identifier: Apache-2.0
// ***********************************************
// This example commands.js shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add("login", (email, password) => { ... })
//
//
// -- This is a child command --
// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This is will overwrite an existing command --
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
import { createClient, prng } from "../helpers"
Cypress.Commands.add(
"authCodeFlow",
(
client,
{
override: { scope, client_id, client_secret } = {},
consent: {
accept: acceptConsent = true,
skip: skipConsent = false,
remember: rememberConsent = false,
scope: acceptScope = [],
} = {},
login: {
accept: acceptLogin = true,
skip: skipLogin = false,
remember: rememberLogin = false,
username = "foo@bar.com",
password = "foobar",
} = {},
prompt = "",
createClient: doCreateClient = true,
} = {},
path = "oauth2",
) => {
const run = (client) => {
cy.visit(
`${Cypress.env("client_url")}/${path}/code?client_id=${
client_id || client.client_id
}&client_secret=${client_secret || client.client_secret}&scope=${(
scope || client.scope
).replace(" ", "+")}&prompt=${prompt}`,
{ failOnStatusCode: false },
)
if (!skipLogin) {
cy.get("#email").type(username, { delay: 1 })
cy.get("#password").type(password, { delay: 1 })
if (rememberLogin) {
cy.get("#remember").click()
}
if (acceptLogin) {
cy.get("#accept").click()
} else {
cy.get("#reject").click()
}
}
if (!skipConsent) {
acceptScope.forEach((s) => {
cy.get(`#${s}`).click()
})
if (rememberConsent) {
cy.get("#remember").click()
}
if (acceptConsent) {
cy.get("#accept").click()
} else {
cy.get("#reject").click()
}
}
}
if (doCreateClient) {
createClient(client).should((client) => {
run(client)
})
return
}
run(client)
},
)
Cypress.Commands.add(
"authCodeFlowBrowser",
(
client,
{
consent: {
accept: acceptConsent = true,
skip: skipConsent = false,
remember: rememberConsent = false,
scope: acceptScope = [],
} = {},
login: {
accept: acceptLogin = true,
skip: skipLogin = false,
remember: rememberLogin = false,
username = "foo@bar.com",
password = "foobar",
} = {},
createClient: doCreateClient = true,
} = {},
) => {
const run = (client) => {
const codeChallenge = "QeNVR-BHuB6I2d0HycQzp2qUNNKi_-5QoR4fQSifLH0"
const codeVerifier =
"ZmRrenFxZ3pid3A0T0xqY29falJNUS5lWlY4SDBxS182U21uQkhjZ3UuOXpnd3NOak56d2lLMTVYemNNdHdNdlE5TW03WC1RZUlaM0N5R2FhdGRpNW1oVGhjbzVuRFBD"
const state = prng()
const authURL = new URL(`${Cypress.env("public_url")}/oauth2/auth`)
authURL.searchParams.set("response_type", "code")
authURL.searchParams.set("client_id", client.client_id)
authURL.searchParams.set("redirect_uri", client.redirect_uris[0])
authURL.searchParams.set("scope", client.scope)
authURL.searchParams.set("state", state)
authURL.searchParams.set("code_challenge", codeChallenge)
authURL.searchParams.set("code_challenge_method", "S256")
cy.window().then((win) => {
return win.open(authURL, "_self")
})
if (!skipLogin) {
cy.get("#email").type(username, { delay: 1 })
cy.get("#password").type(password, { delay: 1 })
if (rememberLogin) {
cy.get("#remember").click()
}
if (acceptLogin) {
cy.get("#accept").click()
} else {
cy.get("#reject").click()
}
}
if (!skipConsent) {
acceptScope.forEach((s) => {
cy.get(`#${s}`).click()
})
if (rememberConsent) {
cy.get("#remember").click()
}
if (acceptConsent) {
cy.get("#accept").click()
} else {
cy.get("#reject").click()
}
}
return cy.location("search").then((search) => {
const callbackParams = new URLSearchParams(search)
const code = callbackParams.get("code")
expect(code).to.not.be.empty
return cy.request({
url: `${Cypress.env("public_url")}/oauth2/token`,
method: "POST",
form: true,
body: {
grant_type: "authorization_code",
client_id: client.client_id,
redirect_uri: client.redirect_uris[0],
code: code,
code_verifier: codeVerifier,
},
})
})
}
if (doCreateClient) {
createClient(client).then(run)
return
}
run(client)
},
)
Cypress.Commands.add("refreshTokenBrowser", (client, token) =>
cy.request({
url: `${Cypress.env("public_url")}/oauth2/token`,
method: "POST",
form: true,
body: {
grant_type: "refresh_token",
client_id: client.client_id,
refresh_token: token,
},
failOnStatusCode: false,
}),
)