# Cypress — Advanced Implementation Playbook ## §1 — Production Configuration ```typescript // cypress.config.ts import { defineConfig } from 'cypress'; export default defineConfig({ e2e: { baseUrl: process.env.CYPRESS_BASE_URL || 'http://localhost:3000', specPattern: 'cypress/e2e/**/*.cy.{js,ts}', supportFile: 'cypress/support/e2e.ts', viewportWidth: 1280, viewportHeight: 720, video: true, screenshotOnRunFailure: true, retries: { runMode: 2, openMode: 0 }, defaultCommandTimeout: 10000, requestTimeout: 15000, responseTimeout: 30000, env: { apiUrl: 'http://localhost:3001/api', }, setupNodeEvents(on, config) { on('before:browser:launch', (browser, launchOptions) => { if (browser.name === 'chrome' && browser.isHeadless) { launchOptions.args.push('--disable-gpu'); } return launchOptions; }); // Load environment config const envName = config.env.envName || 'staging'; const envConfig = require(`./cypress/config/${envName}.json`); return { ...config, ...envConfig }; }, }, component: { devServer: { framework: 'react', bundler: 'vite' }, }, }); ``` ```json // cypress/config/staging.json { "baseUrl": "https://staging.example.com", "env": { "apiUrl": "https://staging-api.example.com" } } // cypress/config/production.json { "baseUrl": "https://www.example.com", "env": { "apiUrl": "https://api.example.com" } } // Run: npx cypress run --env envName=production ``` ## §2 — Auth with cy.session() ```typescript // cypress/support/commands.ts Cypress.Commands.add('login', (email: string, password: string) => { cy.session([email, password], () => { cy.visit('/login'); cy.get('[data-testid="email"]').type(email); cy.get('[data-testid="password"]').type(password); cy.get('[data-testid="submit"]').click(); cy.url().should('include', '/dashboard'); }, { validate() { cy.getCookie('session').should('exist'); }, }); }); // Fast API login (for non-login tests) Cypress.Commands.add('apiLogin', (email: string, password: string) => { cy.session(['api', email], () => { cy.request('POST', '/api/auth/login', { email, password }).then(resp => { window.localStorage.setItem('token', resp.body.token); }); }); }); ``` ## §3 — Page Object / App Actions Pattern ```typescript // cypress/pages/LoginPage.ts export class LoginPage { visit() { cy.visit('/login'); return this; } typeEmail(email: string) { cy.getByTestId('email').clear().type(email); return this; } typePassword(password: string) { cy.getByTestId('password').clear().type(password); return this; } submit() { cy.getByTestId('submit').click(); return this; } loginAs(email: string, password: string) { this.typeEmail(email).typePassword(password).submit(); return this; } assertError(message: string) { cy.getByTestId('error-message').should('contain', message); return this; } } // cypress/pages/index.ts — barrel export export { LoginPage } from './LoginPage'; export { DashboardPage } from './DashboardPage'; export { ProductsPage } from './ProductsPage'; // Usage in test import { LoginPage } from '../pages'; describe('Login', () => { const loginPage = new LoginPage(); it('logs in with valid credentials', () => { loginPage.visit().loginAs('user@test.com', 'password123'); cy.url().should('include', '/dashboard'); }); it('shows error for invalid credentials', () => { loginPage.visit().loginAs('bad@test.com', 'wrong'); loginPage.assertError('Invalid credentials'); }); }); ``` ## §4 — Network Interception Patterns ```typescript // Mock API response cy.intercept('GET', '/api/products', { fixture: 'products.json' }).as('getProducts'); cy.visit('/products'); cy.wait('@getProducts'); cy.get('[data-testid="product-card"]').should('have.length', 3); // Error simulation cy.intercept('GET', '/api/products', { statusCode: 500, body: { error: 'Server error' }, }).as('serverError'); cy.visit('/products'); cy.wait('@serverError'); cy.getByTestId('error-banner').should('contain', 'Something went wrong'); // Modify real response cy.intercept('GET', '/api/products', (req) => { req.continue((res) => { res.body.push({ id: 999, name: 'Injected Product' }); res.send(); }); }); // Wait for real API and validate cy.intercept('POST', '/api/orders').as('createOrder'); cy.getByTestId('checkout').click(); cy.wait('@createOrder').its('response.statusCode').should('eq', 201); cy.wait('@createOrder').its('response.body.orderId').should('exist'); // Delay response (test loading states) cy.intercept('GET', '/api/search*', (req) => { req.reply({ delay: 2000, fixture: 'search-results.json' }); }); cy.get('.loading-spinner').should('be.visible'); cy.get('.loading-spinner').should('not.exist'); ``` ## §5 — Component Testing ```typescript // cypress/component/Button.cy.tsx import Button from '../../src/components/Button'; describe('