Bird
Raised Fist0
Cypresstesting~8 mins

Token-based authentication in Cypress - Framework Patterns

Choose your learning style10 modes available
Framework Mode - Token-based authentication
Folder Structure
  cypress/
  ├── e2e/
  │   ├── login.cy.js          # Tests that use token-based authentication
  │   ├── dashboard.cy.js      # Tests for authenticated pages
  │   └── ...
  ├── fixtures/
  │   └── user.json            # Test data like user credentials
  ├── support/
  │   ├── commands.js          # Custom commands including token login
  │   ├── auth.js              # Helper functions for token handling
  │   └── index.js             # Support file loaded before tests
  ├── plugins/
  │   └── index.js             # Cypress plugins if needed
  cypress.config.js             # Cypress configuration file
  
Test Framework Layers
  • Test Layer (cypress/e2e): Contains test files that use tokens to authenticate API or UI requests.
  • Support Layer (cypress/support): Holds reusable code like custom commands (commands.js) and authentication helpers (auth.js) to get and store tokens.
  • Fixtures Layer (cypress/fixtures): Stores static test data such as user credentials used to request tokens.
  • Plugins Layer (cypress/plugins): Optional place for extending Cypress functionality if needed.
  • Configuration (cypress.config.js): Defines environment variables, base URLs, and test settings.
Configuration Patterns

Use cypress.config.js to manage environment variables and base URLs for different environments (dev, staging, prod).

Example snippet for environment config:

  const { defineConfig } = require('cypress');

  module.exports = defineConfig({
    e2e: {
      baseUrl: 'https://example.com',
      env: {
        apiUrl: 'https://api.example.com',
        username: 'testuser',
        password: 'testpass'
      },
      setupNodeEvents(on, config) {
        // plugin code
      }
    }
  })
  

Store sensitive data like credentials in environment variables or cypress.env.json (ignored by version control).

Use custom commands to request tokens before tests and save them in Cypress.env() for reuse.

Test Reporting and CI/CD Integration
  • Use built-in Cypress reporters or plugins like mochawesome for detailed HTML reports.
  • Integrate Cypress tests in CI/CD pipelines (GitHub Actions, Jenkins, GitLab CI) to run tests on each code push.
  • Configure environment variables securely in CI to provide credentials for token requests.
  • Fail tests if token authentication fails, ensuring early detection of auth issues.
  • Publish test reports as artifacts or send notifications on test results.
Best Practices
  1. Use Custom Commands: Encapsulate token retrieval and storage in Cypress custom commands for reuse and clarity.
  2. Isolate Authentication Logic: Keep token handling code separate in support files to avoid duplication.
  3. Secure Credentials: Never hardcode sensitive data in test code; use environment variables or secure files.
  4. Use Fixtures for Test Data: Store user info and other static data in fixtures for easy updates.
  5. Validate Token Expiry: Refresh tokens or re-authenticate as needed to avoid flaky tests.
Self Check

Where would you add a new helper function to refresh an expired token in this framework structure?

Key Result
Organize token-based authentication by separating token logic in support files, using custom commands, and managing credentials securely.

Practice

(1/5)
1. What is the main advantage of using token-based authentication in Cypress tests?
easy
A. It disables all API requests during testing.
B. It requires manual input of username and password every time.
C. It automatically generates UI elements for login.
D. It allows tests to log in quickly without interacting with the UI.

Solution

  1. Step 1: Understand token-based authentication purpose

    Token-based authentication lets tests bypass UI login by using tokens directly.
  2. Step 2: Compare options

    Only It allows tests to log in quickly without interacting with the UI. correctly states the advantage of faster login without UI interaction.
  3. Final Answer:

    It allows tests to log in quickly without interacting with the UI. -> Option D
  4. Quick Check:

    Token-based authentication = Fast login without UI [OK]
Hint: Token-based auth skips UI login for faster tests [OK]
Common Mistakes:
  • Thinking token auth requires UI interaction
  • Confusing token auth with disabling APIs
  • Assuming token auth auto-generates UI
2. Which Cypress command is commonly used to request an authentication token from an API?
easy
A. cy.visit()
B. cy.get()
C. cy.request()
D. cy.contains()

Solution

  1. Step 1: Identify command for API calls

    cy.request() is used to make HTTP requests to APIs, including login endpoints.
  2. Step 2: Eliminate other commands

    cy.visit() loads pages, cy.get() selects DOM elements, cy.contains() finds text; none request tokens.
  3. Final Answer:

    cy.request() -> Option C
  4. Quick Check:

    API token request = cy.request() [OK]
Hint: Use cy.request() to call APIs and get tokens [OK]
Common Mistakes:
  • Using cy.visit() to get tokens
  • Confusing cy.get() with API calls
  • Trying cy.contains() for authentication
3. Given the code below, what will be the value of token after the test runs?
let token = '';
cy.request('POST', '/api/login', { username: 'user', password: 'pass' })
  .then((response) => {
    token = response.body.token;
  });
medium
A. An empty string because token is declared outside the callback
B. The token string returned by the API in response.body.token
C. Undefined because response.body.token does not exist
D. The entire response object

Solution

  1. Step 1: Understand asynchronous assignment

    The token variable is assigned inside the .then() callback after the API response arrives.
  2. Step 2: Confirm token value after request

    response.body.token contains the token string from the API, so token gets that value.
  3. Final Answer:

    The token string returned by the API in response.body.token -> Option B
  4. Quick Check:

    token = response.body.token string [OK]
Hint: Token is set inside .then() from response.body.token [OK]
Common Mistakes:
  • Assuming token stays empty due to async
  • Thinking token is undefined without checking API
  • Confusing token with full response object
4. Identify the error in this Cypress test snippet for token-based login:
cy.request('POST', '/api/login', { username: 'user', password: 'pass' })
  .then((response) => {
    cy.setCookie('authToken', response.token);
  });
medium
A. response.token should be response.body.token to access the token
B. cy.setCookie is not a valid Cypress command
C. The request method should be GET, not POST
D. Cookies cannot store authentication tokens

Solution

  1. Step 1: Check response object structure

    The token is usually inside response.body.token, not directly response.token.
  2. Step 2: Validate cy.setCookie usage

    cy.setCookie is a valid command to set cookies in Cypress.
  3. Final Answer:

    response.token should be response.body.token to access the token -> Option A
  4. Quick Check:

    Access token via response.body.token [OK]
Hint: Use response.body.token, not response.token [OK]
Common Mistakes:
  • Using response.token instead of response.body.token
  • Thinking cy.setCookie is invalid
  • Changing POST to GET incorrectly
5. You want to write a Cypress test that logs in using token-based authentication and then visits a protected page. Which sequence correctly achieves this?
A) cy.request('POST', '/api/login', {username: 'user', password: 'pass'}).then(res => {
  cy.setCookie('token', res.token);
});
cy.visit('/protected');

B) cy.visit('/protected');
cy.request('POST', '/api/login', {username: 'user', password: 'pass'}).then(res => {
  cy.setCookie('token', res.body.token);
});

C) cy.request('POST', '/api/login', {username: 'user', password: 'pass'}).then(res => {
  cy.setCookie('token', res.body.token);
  cy.visit('/protected');
});

D) cy.setCookie('token', 'dummy');
cy.visit('/protected');
hard
A. Set dummy token cookie, then visit protected page
B. Visit protected page first, then request token and set cookie
C. Request token, set cookie, then visit protected page outside .then()
D. Request token, set cookie, then visit protected page inside .then() callback

Solution

  1. Step 1: Understand asynchronous flow

    Token must be set before visiting the protected page, so visit must happen after setting cookie inside .then().
  2. Step 2: Analyze options

    Request token, set cookie, then visit protected page inside .then() callback sets cookie and visits page inside .then(), ensuring correct order and token availability.
  3. Final Answer:

    Request token, set cookie, then visit protected page inside .then() callback -> Option A
  4. Quick Check:

    Set token cookie before visiting page inside .then() [OK]
Hint: Visit protected page only after setting token cookie inside .then() [OK]
Common Mistakes:
  • Visiting page before setting token cookie
  • Setting cookie outside async callback
  • Using dummy tokens without real login
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard