diff --git a/cypress.config.ts b/cypress.config.ts index 5b77555d..cfec3ef0 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -6,6 +6,8 @@ export default defineConfig({ e2e: { baseUrl: "http://localhost:3000", setupNodeEvents(on, config) { + // This will include the plugins file, which is needed to test oauth login + require("./cypress/plugins")(on, config); // implement node event listeners here }, }, diff --git a/cypress/e2e/login/login.cy.js b/cypress/e2e/login/login.cy.js new file mode 100644 index 00000000..97eb99ca --- /dev/null +++ b/cypress/e2e/login/login.cy.js @@ -0,0 +1,50 @@ +describe("Login page", () => { + before(() => { + cy.log(`Visiting https://company.tld`); + cy.visit("/"); + }); + it("Login with Google", () => { + const username = Cypress.env("GOOGLE_USER"); + const password = Cypress.env("GOOGLE_PW"); + const loginUrl = Cypress.env("SITE_NAME"); + const cookieName = Cypress.env("COOKIE_NAME"); + const socialLoginOptions = { + username, + password, + loginUrl, + headless: true, + logs: false, + isPopup: true, + loginSelector: `[data-testid="google-signin-btn"]`, // Look for the data-testid attribute of the login button + postLoginSelector: `[data-testid="app-navbar"]`, // Look for the navbar to indicate a successful login + }; + + return cy + .task("GoogleSocialLogin", socialLoginOptions) + .then(({ cookies }) => { + cy.clearCookies(); + + const cookie = cookies + .filter((cookie) => cookie.name === cookieName) + .pop(); + if (cookie) { + cy.setCookie(cookie.name, cookie.value, { + domain: cookie.domain, + expiry: cookie.expires, + httpOnly: cookie.httpOnly, + path: cookie.path, + secure: cookie.secure, + }); + + Cypress.Cookies.defaults({ + preserve: cookieName, + }); + + // remove the two lines below if you need to stay logged in + // for your remaining tests + cy.visit("/api/auth/signout"); + cy.get("form").submit(); + } + }); + }); +}); diff --git a/cypress/fixtures/profile.json b/cypress/fixtures/profile.json new file mode 100644 index 00000000..b6c355ca --- /dev/null +++ b/cypress/fixtures/profile.json @@ -0,0 +1,5 @@ +{ + "id": 8739, + "name": "Jane", + "email": "jane@example.com" +} \ No newline at end of file diff --git a/cypress/fixtures/users.json b/cypress/fixtures/users.json new file mode 100644 index 00000000..79b699aa --- /dev/null +++ b/cypress/fixtures/users.json @@ -0,0 +1,232 @@ +[ + { + "id": 1, + "name": "Leanne Graham", + "username": "Bret", + "email": "Sincere@april.biz", + "address": { + "street": "Kulas Light", + "suite": "Apt. 556", + "city": "Gwenborough", + "zipcode": "92998-3874", + "geo": { + "lat": "-37.3159", + "lng": "81.1496" + } + }, + "phone": "1-770-736-8031 x56442", + "website": "hildegard.org", + "company": { + "name": "Romaguera-Crona", + "catchPhrase": "Multi-layered client-server neural-net", + "bs": "harness real-time e-markets" + } + }, + { + "id": 2, + "name": "Ervin Howell", + "username": "Antonette", + "email": "Shanna@melissa.tv", + "address": { + "street": "Victor Plains", + "suite": "Suite 879", + "city": "Wisokyburgh", + "zipcode": "90566-7771", + "geo": { + "lat": "-43.9509", + "lng": "-34.4618" + } + }, + "phone": "010-692-6593 x09125", + "website": "anastasia.net", + "company": { + "name": "Deckow-Crist", + "catchPhrase": "Proactive didactic contingency", + "bs": "synergize scalable supply-chains" + } + }, + { + "id": 3, + "name": "Clementine Bauch", + "username": "Samantha", + "email": "Nathan@yesenia.net", + "address": { + "street": "Douglas Extension", + "suite": "Suite 847", + "city": "McKenziehaven", + "zipcode": "59590-4157", + "geo": { + "lat": "-68.6102", + "lng": "-47.0653" + } + }, + "phone": "1-463-123-4447", + "website": "ramiro.info", + "company": { + "name": "Romaguera-Jacobson", + "catchPhrase": "Face to face bifurcated interface", + "bs": "e-enable strategic applications" + } + }, + { + "id": 4, + "name": "Patricia Lebsack", + "username": "Karianne", + "email": "Julianne.OConner@kory.org", + "address": { + "street": "Hoeger Mall", + "suite": "Apt. 692", + "city": "South Elvis", + "zipcode": "53919-4257", + "geo": { + "lat": "29.4572", + "lng": "-164.2990" + } + }, + "phone": "493-170-9623 x156", + "website": "kale.biz", + "company": { + "name": "Robel-Corkery", + "catchPhrase": "Multi-tiered zero tolerance productivity", + "bs": "transition cutting-edge web services" + } + }, + { + "id": 5, + "name": "Chelsey Dietrich", + "username": "Kamren", + "email": "Lucio_Hettinger@annie.ca", + "address": { + "street": "Skiles Walks", + "suite": "Suite 351", + "city": "Roscoeview", + "zipcode": "33263", + "geo": { + "lat": "-31.8129", + "lng": "62.5342" + } + }, + "phone": "(254)954-1289", + "website": "demarco.info", + "company": { + "name": "Keebler LLC", + "catchPhrase": "User-centric fault-tolerant solution", + "bs": "revolutionize end-to-end systems" + } + }, + { + "id": 6, + "name": "Mrs. Dennis Schulist", + "username": "Leopoldo_Corkery", + "email": "Karley_Dach@jasper.info", + "address": { + "street": "Norberto Crossing", + "suite": "Apt. 950", + "city": "South Christy", + "zipcode": "23505-1337", + "geo": { + "lat": "-71.4197", + "lng": "71.7478" + } + }, + "phone": "1-477-935-8478 x6430", + "website": "ola.org", + "company": { + "name": "Considine-Lockman", + "catchPhrase": "Synchronised bottom-line interface", + "bs": "e-enable innovative applications" + } + }, + { + "id": 7, + "name": "Kurtis Weissnat", + "username": "Elwyn.Skiles", + "email": "Telly.Hoeger@billy.biz", + "address": { + "street": "Rex Trail", + "suite": "Suite 280", + "city": "Howemouth", + "zipcode": "58804-1099", + "geo": { + "lat": "24.8918", + "lng": "21.8984" + } + }, + "phone": "210.067.6132", + "website": "elvis.io", + "company": { + "name": "Johns Group", + "catchPhrase": "Configurable multimedia task-force", + "bs": "generate enterprise e-tailers" + } + }, + { + "id": 8, + "name": "Nicholas Runolfsdottir V", + "username": "Maxime_Nienow", + "email": "Sherwood@rosamond.me", + "address": { + "street": "Ellsworth Summit", + "suite": "Suite 729", + "city": "Aliyaview", + "zipcode": "45169", + "geo": { + "lat": "-14.3990", + "lng": "-120.7677" + } + }, + "phone": "586.493.6943 x140", + "website": "jacynthe.com", + "company": { + "name": "Abernathy Group", + "catchPhrase": "Implemented secondary concept", + "bs": "e-enable extensible e-tailers" + } + }, + { + "id": 9, + "name": "Glenna Reichert", + "username": "Delphine", + "email": "Chaim_McDermott@dana.io", + "address": { + "street": "Dayna Park", + "suite": "Suite 449", + "city": "Bartholomebury", + "zipcode": "76495-3109", + "geo": { + "lat": "24.6463", + "lng": "-168.8889" + } + }, + "phone": "(775)976-6794 x41206", + "website": "conrad.com", + "company": { + "name": "Yost and Sons", + "catchPhrase": "Switchable contextually-based project", + "bs": "aggregate real-time technologies" + } + }, + { + "id": 10, + "name": "Clementina DuBuque", + "username": "Moriah.Stanton", + "email": "Rey.Padberg@karina.biz", + "address": { + "street": "Kattie Turnpike", + "suite": "Suite 198", + "city": "Lebsackbury", + "zipcode": "31428-2261", + "geo": { + "lat": "-38.2386", + "lng": "57.2232" + } + }, + "phone": "024-648-3804", + "website": "ambrose.net", + "company": { + "name": "Hoeger LLC", + "catchPhrase": "Centralized empowering task-force", + "bs": "target end-to-end models" + } + } +] \ No newline at end of file diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js new file mode 100644 index 00000000..4033af61 --- /dev/null +++ b/cypress/plugins/index.js @@ -0,0 +1,7 @@ +const { GoogleSocialLogin } = require("cypress-social-logins").plugins; + +module.exports = (on, config) => { + on("task", { + GoogleSocialLogin: GoogleSocialLogin, + }); +}; diff --git a/cypress/videos/1-getting-started/todo.cy.js.mp4 b/cypress/videos/1-getting-started/todo.cy.js.mp4 new file mode 100644 index 00000000..a4458b69 Binary files /dev/null and b/cypress/videos/1-getting-started/todo.cy.js.mp4 differ diff --git a/cypress/videos/2-advanced-examples/actions.cy.js.mp4 b/cypress/videos/2-advanced-examples/actions.cy.js.mp4 new file mode 100644 index 00000000..cc0986c0 Binary files /dev/null and b/cypress/videos/2-advanced-examples/actions.cy.js.mp4 differ diff --git a/cypress/videos/2-advanced-examples/aliasing.cy.js.mp4 b/cypress/videos/2-advanced-examples/aliasing.cy.js.mp4 new file mode 100644 index 00000000..897b7518 Binary files /dev/null and b/cypress/videos/2-advanced-examples/aliasing.cy.js.mp4 differ diff --git a/cypress/videos/2-advanced-examples/assertions.cy.js.mp4 b/cypress/videos/2-advanced-examples/assertions.cy.js.mp4 new file mode 100644 index 00000000..06ec0a68 Binary files /dev/null and b/cypress/videos/2-advanced-examples/assertions.cy.js.mp4 differ diff --git a/cypress/videos/2-advanced-examples/connectors.cy.js.mp4 b/cypress/videos/2-advanced-examples/connectors.cy.js.mp4 new file mode 100644 index 00000000..521159fd Binary files /dev/null and b/cypress/videos/2-advanced-examples/connectors.cy.js.mp4 differ diff --git a/cypress/videos/2-advanced-examples/cookies.cy.js.mp4 b/cypress/videos/2-advanced-examples/cookies.cy.js.mp4 new file mode 100644 index 00000000..04f1db95 Binary files /dev/null and b/cypress/videos/2-advanced-examples/cookies.cy.js.mp4 differ diff --git a/cypress/videos/2-advanced-examples/cypress_api.cy.js.mp4 b/cypress/videos/2-advanced-examples/cypress_api.cy.js.mp4 new file mode 100644 index 00000000..21b26d6a Binary files /dev/null and b/cypress/videos/2-advanced-examples/cypress_api.cy.js.mp4 differ diff --git a/cypress/videos/2-advanced-examples/files.cy.js.mp4 b/cypress/videos/2-advanced-examples/files.cy.js.mp4 new file mode 100644 index 00000000..2b0b305c Binary files /dev/null and b/cypress/videos/2-advanced-examples/files.cy.js.mp4 differ diff --git a/src/app/components/Navbar.tsx b/src/app/components/Navbar.tsx index 8880027b..997f2d6b 100644 --- a/src/app/components/Navbar.tsx +++ b/src/app/components/Navbar.tsx @@ -26,7 +26,7 @@ function Nav() { } return (
-