From ba4010ff46ef0cf3779a2213eab41ddb9949631c Mon Sep 17 00:00:00 2001 From: Aarni Halinen Date: Fri, 15 Jan 2021 00:23:30 +0200 Subject: [PATCH] Add cleanup hooks for E2E tests --- src/models/Event.ts | 15 +++ src/models/Signup.ts | 2 +- src/models/SignupForm.ts | 17 ++- tests/testcafe/admin/common/login.ts | 10 -- tests/testcafe/admin/create-event.test.ts | 22 +++- tests/testcafe/admin/create-signup.test.ts | 15 ++- tests/testcafe/admin/login.test.ts | 3 +- tests/testcafe/signupToEvent.test.ts | 16 ++- tests/testcafe/utils.ts | 134 ++++++++++++++++++++- 9 files changed, 211 insertions(+), 23 deletions(-) delete mode 100644 tests/testcafe/admin/common/login.ts diff --git a/src/models/Event.ts b/src/models/Event.ts index a29c236..2fe98b3 100644 --- a/src/models/Event.ts +++ b/src/models/Event.ts @@ -3,6 +3,7 @@ import { getAuthHeader } from "@utils/auth"; import { Tag } from "./Tag"; import qs from "query-string"; import { SignupForm } from "./SignupForm"; + const url = `${process.env.API_URL}/events/`; export interface Event { @@ -89,3 +90,17 @@ export async function updateEvent(data): Promise { throw err; } } + +export async function deleteEvent(id: number) { + try { + const resp = await axios.delete(`${url}${id}`, { + headers: { + "Authorization": getAuthHeader() + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } +} diff --git a/src/models/Signup.ts b/src/models/Signup.ts index d788e8f..06e7ed0 100644 --- a/src/models/Signup.ts +++ b/src/models/Signup.ts @@ -60,7 +60,7 @@ export const getSignupUUID = async (id: number, uuid: string): Promise = } } -export const deleteSignup = async (id: number): Promise => { +export const deleteSignup = async (id: number) => { try { const resp = await axios.delete(`${url}${id}`, { headers: { diff --git a/src/models/SignupForm.ts b/src/models/SignupForm.ts index b17f737..d131370 100644 --- a/src/models/SignupForm.ts +++ b/src/models/SignupForm.ts @@ -1,9 +1,10 @@ import axios from "axios"; import { getAuthHeader } from "@utils/auth"; -const url = `${process.env.API_URL}/signupForm/`; import { Question } from "@components/Widgets/SignupQuestionsWidget"; import { Signup } from "./Signup"; +const url = `${process.env.API_URL}/signupForm/`; + export interface SignupForm { id?: number; title_fi: string; @@ -79,6 +80,20 @@ export async function updateForm(data): Promise { } } +export async function deleteForm(id: number) { + try { + const resp = await axios.delete(`${url}${id}`, { + headers: { + "Authorization": getAuthHeader() + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } +} + export const signupFormSendEmail = async (data, id): Promise => { try { const resp = await axios.post(`${process.env.API_URL}/signupForm/${id}/sendemail/`, data, { diff --git a/tests/testcafe/admin/common/login.ts b/tests/testcafe/admin/common/login.ts deleted file mode 100644 index 3b43c3c..0000000 --- a/tests/testcafe/admin/common/login.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Selector } from "testcafe"; - -const USERNAME = "admin"; -const PASSWORD = "password123"; - -export const doLogin = async (t: TestController) => { - await t.typeText(Selector("#login-username"), USERNAME); - await t.typeText(Selector("#login-password"), PASSWORD); - await t.click(Selector("#login-submit")); -} \ No newline at end of file diff --git a/tests/testcafe/admin/create-event.test.ts b/tests/testcafe/admin/create-event.test.ts index e881461..f0f9417 100644 --- a/tests/testcafe/admin/create-event.test.ts +++ b/tests/testcafe/admin/create-event.test.ts @@ -1,8 +1,21 @@ import { Selector } from "testcafe"; -import { getSiteRoot, getPageUrl } from "../utils"; -import { doLogin } from "./common/login"; +import { getSiteRoot, getPageUrl, generateTestForm, deleteEvent, deleteForm, doLogin, generateToken, getPostRequestLogger } from "../utils"; -fixture`Admin events`.page(`${getSiteRoot()}/admin/events`); +const LOGGER = getPostRequestLogger("events/"); + +fixture`Admin events`.page(`${getSiteRoot()}/admin/events`) + .requestHooks(LOGGER) + .before(async (ctx) => { + const token = await generateToken(); + const form = await generateTestForm(token); + ctx.formId = form.id; + }) + .after(async (ctx) => { + const token = await generateToken(); + const eResp = await deleteEvent(ctx.eventId, token); + await deleteForm(ctx.formId, token); + console.error(eResp); + }); test("Logged in user can create event", async t => { const loginForm = Selector("form.admin-login-form"); @@ -63,6 +76,9 @@ test("Logged in user can create event", async t => { await t.click(submit); + const parsed = JSON.parse(LOGGER.requests[0].response.body); + t.fixtureCtx.eventId = parsed.id; + const statusMessage = Selector("[data-e2e=\"admin-form-status-message\"]"); await t .hover(statusMessage) diff --git a/tests/testcafe/admin/create-signup.test.ts b/tests/testcafe/admin/create-signup.test.ts index 68acb3b..1894835 100644 --- a/tests/testcafe/admin/create-signup.test.ts +++ b/tests/testcafe/admin/create-signup.test.ts @@ -1,8 +1,14 @@ import { Selector } from "testcafe"; -import { getSiteRoot, getPageUrl } from "../utils"; -import { doLogin } from "./common/login"; +import { getSiteRoot, getPageUrl, deleteForm, doLogin, generateToken, getPostRequestLogger } from "../utils"; -fixture`Admin events`.page(`${getSiteRoot()}/admin/signups`); +const LOGGER = getPostRequestLogger("signupForm/"); + +fixture`Admin signup form`.page(`${getSiteRoot()}/admin/signups`) + .requestHooks(LOGGER) + .after(async (ctx) => { + const token = await generateToken(); + await deleteForm(ctx.formId, token); + }); test("Logged in user can create signup", async t => { const loginForm = Selector("form.admin-login-form"); @@ -72,6 +78,9 @@ test("Logged in user can create signup", async t => { await t.click(submit); + const parsed = JSON.parse(LOGGER.requests[0].response.body); + t.fixtureCtx.formId = parsed.id; + const statusMessage = Selector("[data-e2e=\"admin-form-status-message\"]"); await t .hover(statusMessage) diff --git a/tests/testcafe/admin/login.test.ts b/tests/testcafe/admin/login.test.ts index cac129f..f16af23 100644 --- a/tests/testcafe/admin/login.test.ts +++ b/tests/testcafe/admin/login.test.ts @@ -1,6 +1,5 @@ import { Selector, ClientFunction } from "testcafe"; -import { getSiteRoot } from "../utils"; -import { doLogin } from "./common/login"; +import { getSiteRoot, doLogin } from "../utils"; fixture`Admin login page functions correctly`.page(`${getSiteRoot()}/admin/login`); diff --git a/tests/testcafe/signupToEvent.test.ts b/tests/testcafe/signupToEvent.test.ts index ea52bf2..d4b5a75 100644 --- a/tests/testcafe/signupToEvent.test.ts +++ b/tests/testcafe/signupToEvent.test.ts @@ -1,7 +1,19 @@ import { Selector } from "testcafe"; -import { getSiteRoot, getPageUrl } from "./utils"; +import { getSiteRoot, getPageUrl, generateTestEvent, generateTestForm, deleteEvent, deleteForm, generateToken } from "./utils"; -fixture`Event signup`.page(getSiteRoot()); +fixture`Event signup`.page(getSiteRoot()) + .before(async (ctx) => { + const token = await generateToken(); + const form = await generateTestForm(token); + const event = await generateTestEvent([form.id], token); + ctx.eventId = event.id; + ctx.formId = form.id; + }) + .after(async (ctx) => { + const token = await generateToken(); + await deleteEvent(ctx.eventId, token); + await deleteForm(ctx.formId, token); + }); test("User signups to event from front page", async t => { const CardSelector = Selector("[data-e2e=\"event-card\"]").withText("title_fi").nth(0); diff --git a/tests/testcafe/utils.ts b/tests/testcafe/utils.ts index 718a431..c4258e0 100644 --- a/tests/testcafe/utils.ts +++ b/tests/testcafe/utils.ts @@ -1,5 +1,137 @@ -import { ClientFunction } from "testcafe"; +import { Selector, ClientFunction, RequestLogger } from "testcafe"; +import axios from "axios"; + +const API_URL = "https://api.dev.sik.party/api" export const getSiteRoot = (): string => process.env.SITE_URL || "http://localhost:3000"; // export const getPageUrl = ClientFunction(() => window.location.href.toString()); export const getPageUrl = ClientFunction(() => window.location.pathname); + +export const getPostRequestLogger = (url: string) => RequestLogger({ url: `${API_URL}/${url}`, method: "post" }, { + // logResponseHeaders: true, + logResponseBody: true, + stringifyResponseBody: true +}); + +const openTime = new Date("1994-01-14T22:51:00+02:00"); +const tomorrow = new Date(); +tomorrow.setDate(tomorrow.getDate() + 1); + +const USERNAME = "admin"; +const PASSWORD = "password123"; + +export const doLogin = async (t: TestController) => { + await t.typeText(Selector("#login-username"), USERNAME); + await t.typeText(Selector("#login-password"), PASSWORD); + await t.click(Selector("#login-submit")); +} + +export async function generateToken(): Promise { + const tokenUrl = `${API_URL}/api-token-auth/`; + + try { + const resp = await axios.post(tokenUrl, { + username: USERNAME, + password: PASSWORD + }); + return resp.data["token"]; + } catch (err) { + console.error(err); + throw err; + } +} + + +export const generateTestForm = async (jwt: string) => ( + await createForm({ + "title_fi": "Testi Ilmo", + "title_en": "Test Signup", + "visible": true, + "quota": 0, + "start_time": openTime, + "end_time": tomorrow, + "email_content": "E2E Test", + "questions": [{ "id": "XS_Ox5Rry", "name": "Nimi", "type": "name", "options": [], "required": true }, { "id": "Ve02XSEEx", "name": "S-Posti", "type": "email", "options": [], "required": true }, { "id": "luMqnz5y9", "name": "Olen", "type": "radiobutton", "options": ["Nuori", "Vanha", "Testaaja"] }], "id": 14, "isOpen": true, "schema": { "type": "object", "required": ["XS_Ox5Rry", "Ve02XSEEx"], "properties": { "XS_Ox5Rry": { "type": "string", "title": "Nimi" }, "Ve02XSEEx": { "type": ["string"], "title": "S-Posti", "format": "email", "pattern": "^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$", "default": null }, "luMqnz5y9": { "type": "string", "title": "Olen", "pattern": "^Nuori$|^Vanha$|^Testaaja$", "enum": ["Nuori", "Vanha", "Testaaja"] } } } + }, jwt) +) + +const formURL = `${API_URL}/signupForm/`; + +export async function createForm(data, jwt: string) { + try { + const resp = await axios.post(formURL, data, { + headers: { + "Authorization": `JWT ${jwt}`, + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } +} + +export async function deleteForm(id: string, jwt: string) { + try { + const resp = await axios.delete(`${formURL}${id}/`, { + headers: { + "Authorization": `JWT ${jwt}` + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } +} + +export const generateTestEvent = async (formIds = [], jwt: string) => ( + await createEvent({ + "tags":[1], + "visible":true, + "start_time": openTime, + "end_time": tomorrow, + "title_fi":"title_fi", + "description_fi":"desc_fi", + "content_fi":"content_fi", + "location_fi":"location_fi", + "title_en":"title_en", + "description_en":"desc_en", + "content_en":"content_en", + "location_en":"location_en", + "image":null, + "signupForm": formIds, + "signup_id": formIds, + "tag_id":[1] + }, jwt) +) + +const eventURL = `${API_URL}/events/`; + +export async function createEvent(data, jwt: string) { + try { + const resp = await axios.post(eventURL, data, { + headers: { + "Authorization": `JWT ${jwt}`, + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } +} + +export async function deleteEvent(id: string, jwt: string) { + try { + const resp = await axios.delete(`${eventURL}${id}/`, { + headers: { + "Authorization": `JWT ${jwt}` + }, + }); + return resp.data; + } catch (err) { + console.error(err); + throw err; + } +}