switch to remix
This commit is contained in:
commit
52a0ba1b3b
77 changed files with 13468 additions and 0 deletions
77
cypress/support/commands.ts
Normal file
77
cypress/support/commands.ts
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
import faker from "@faker-js/faker";
|
||||
|
||||
declare global {
|
||||
namespace Cypress {
|
||||
interface Chainable {
|
||||
/**
|
||||
* Logs in with a random user. Yields the user and adds an alias to the user
|
||||
*
|
||||
* @returns {typeof login}
|
||||
* @memberof Chainable
|
||||
* @example
|
||||
* cy.login()
|
||||
* @example
|
||||
* cy.login({ email: 'whatever@example.com' })
|
||||
*/
|
||||
login: typeof login;
|
||||
|
||||
/**
|
||||
* Deletes the current @user
|
||||
*
|
||||
* @returns {typeof cleanupUser}
|
||||
* @memberof Chainable
|
||||
* @example
|
||||
* cy.cleanupUser()
|
||||
* @example
|
||||
* cy.cleanupUser({ email: 'whatever@example.com' })
|
||||
*/
|
||||
cleanupUser: typeof cleanupUser;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function login({
|
||||
email = faker.internet.email(undefined, undefined, "example.com"),
|
||||
}: {
|
||||
email?: string;
|
||||
} = {}) {
|
||||
cy.then(() => ({ email })).as("user");
|
||||
cy.exec(
|
||||
`node --require esbuild-register ./cypress/support/create-user.ts "${email}"`
|
||||
).then(({ stdout }) => {
|
||||
const cookieValue = stdout
|
||||
.replace(/.*<cookie>(?<cookieValue>.*)<\/cookie>.*/s, "$<cookieValue>")
|
||||
.trim();
|
||||
cy.setCookie("__session", cookieValue);
|
||||
});
|
||||
return cy.get("@user");
|
||||
}
|
||||
|
||||
function cleanupUser({ email }: { email?: string } = {}) {
|
||||
if (email) {
|
||||
deleteUserByEmail(email);
|
||||
} else {
|
||||
cy.get("@user").then((user) => {
|
||||
const email = (user as { email?: string }).email;
|
||||
if (email) {
|
||||
deleteUserByEmail(email);
|
||||
}
|
||||
});
|
||||
}
|
||||
cy.clearCookie("__session");
|
||||
}
|
||||
|
||||
function deleteUserByEmail(email: string) {
|
||||
cy.exec(
|
||||
`node --require esbuild-register ./cypress/support/delete-user.ts "${email}"`
|
||||
);
|
||||
cy.clearCookie("__session");
|
||||
}
|
||||
|
||||
Cypress.Commands.add("login", login);
|
||||
Cypress.Commands.add("cleanupUser", cleanupUser);
|
||||
|
||||
/*
|
||||
eslint
|
||||
@typescript-eslint/no-namespace: "off",
|
||||
*/
|
||||
47
cypress/support/create-user.ts
Normal file
47
cypress/support/create-user.ts
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
// Use this to create a new user and login with that user
|
||||
// Simply call this with:
|
||||
// node --require esbuild-register ./cypress/support/create-user.ts username@example.com
|
||||
// and it will log out the cookie value you can use to interact with the server
|
||||
// as that new user.
|
||||
|
||||
import { parse } from "cookie";
|
||||
import { installGlobals } from "@remix-run/node/globals";
|
||||
import { createUserSession } from "~/session.server";
|
||||
import { createUser } from "~/models/user.server";
|
||||
|
||||
installGlobals();
|
||||
|
||||
async function createAndLogin(email: string) {
|
||||
if (!email) {
|
||||
throw new Error("email required for login");
|
||||
}
|
||||
if (!email.endsWith("@example.com")) {
|
||||
throw new Error("All test emails must end in @example.com");
|
||||
}
|
||||
|
||||
const user = await createUser(email, "myreallystrongpassword");
|
||||
|
||||
const response = await createUserSession({
|
||||
request: new Request(""),
|
||||
userId: user.id,
|
||||
remember: false,
|
||||
redirectTo: "/",
|
||||
});
|
||||
|
||||
const cookieValue = response.headers.get("Set-Cookie");
|
||||
if (!cookieValue) {
|
||||
throw new Error("Cookie missing from createUserSession response");
|
||||
}
|
||||
const parsedCookie = parse(cookieValue);
|
||||
// we log it like this so our cypress command can parse it out and set it as
|
||||
// the cookie value.
|
||||
console.log(
|
||||
`
|
||||
<cookie>
|
||||
${parsedCookie.__session}
|
||||
</cookie>
|
||||
`.trim()
|
||||
);
|
||||
}
|
||||
|
||||
createAndLogin(process.argv[2]);
|
||||
22
cypress/support/delete-user.ts
Normal file
22
cypress/support/delete-user.ts
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
// Use this to delete a user by their email
|
||||
// Simply call this with:
|
||||
// node --require esbuild-register ./cypress/support/delete-user.ts username@example.com
|
||||
// and that user will get deleted
|
||||
|
||||
import { installGlobals } from "@remix-run/node/globals";
|
||||
import { prisma } from "~/db.server";
|
||||
|
||||
installGlobals();
|
||||
|
||||
async function deleteUser(email: string) {
|
||||
if (!email) {
|
||||
throw new Error("email required for login");
|
||||
}
|
||||
if (!email.endsWith("@example.com")) {
|
||||
throw new Error("All test emails must end in @example.com");
|
||||
}
|
||||
|
||||
await prisma.user.delete({ where: { email } });
|
||||
}
|
||||
|
||||
deleteUser(process.argv[2]);
|
||||
2
cypress/support/index.ts
Normal file
2
cypress/support/index.ts
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
import "@testing-library/cypress/add-commands";
|
||||
import "./commands";
|
||||
Loading…
Add table
Add a link
Reference in a new issue