Эмуляция прав доступа

В процессе тестирования веб-приложений важно учитывать различные уровни прав доступа, чтобы проверить функциональность приложения для пользователей с разными ролями. Playwright предоставляет мощные инструменты для имитации различных прав доступа и выполнения тестов, которые имитируют поведение различных пользователей, таких как администраторы, обычные пользователи и неавторизованные посетители.

Использование Cookies для эмуляции авторизации

Один из способов эмуляции прав доступа в Playwright — использование Cookies. Этот метод позволяет быстро изменить состояние авторизации пользователя, не выполняя повторно процесс логина, что значительно ускоряет тестирование.

import { test, expect } from '@playwright/test';

test('Эмуляция прав доступа с помощью Cookies', async ({ page }) => {
  // Установка Cookies для эмуляции авторизованного пользователя
  const cookies = [
    {
      name: 'auth_token',
      value: 'your-auth-token',
      domain: 'example.com',
      path: '/',
    },
  ];
  await page.context().addCookies(cookies);

  // Переход на страницу, доступную только авторизованным пользователям
  await page.goto('https://example.com/dashboard');
  const userDashboard = await page.locator('text=Dashboard').isVisible();
  expect(userDashboard).toBe(true);
});

В этом примере создаются Cookies с токеном авторизации и добавляются в контекст страницы. После этого можно перейти на страницу, которая доступна только авторизованным пользователям, и проверить доступность элементов интерфейса.

Эмуляция разных ролей с использованием токенов доступа

В приложениях с многоуровневой системой прав доступа часто используется эмуляция различных ролей через токены. Для тестирования приложения с разными уровнями доступа можно создать несколько типов токенов, соответствующих ролям, таким как «администратор», «пользователь» или «гость».

import { test, expect } from '@playwright/test';

test('Эмуляция разных ролей', async ({ page }) => {
  const adminToken = 'admin-auth-token';
  const userToken = 'user-auth-token';
  
  // Эмуляция входа как администратор
  await page.context().addCookies([
    { name: 'auth_token', value: adminToken, domain: 'example.com' }
  ]);
  await page.goto('https://example.com/admin-dashboard');
  const adminAccess = await page.locator('text=Admin Dashboard').isVisible();
  expect(adminAccess).toBe(true);

  // Эмуляция входа как обычный пользователь
  await page.context().clearCookies(); // Очистка предыдущих Cookies
  await page.context().addCookies([
    { name: 'auth_token', value: userToken, domain: 'example.com' }
  ]);
  await page.goto('https://example.com/user-dashboard');
  const userAccess = await page.locator('text=User Dashboard').isVisible();
  expect(userAccess).toBe(true);
});

В данном примере создаются два токена для разных ролей и тестируются страницы, доступные только определенным ролям. Это позволяет проверить, что пользователи с разными правами могут видеть только те разделы, к которым у них есть доступ.

Эмуляция прав доступа с использованием API-запросов

Иногда требуется эмулировать права доступа на уровне API, например, когда необходимо проверить доступность API-эндпоинтов для пользователей с разными ролями. В таком случае можно использовать Playwright для отправки HTTP-запросов с нужными заголовками, которые будут соответствовать различным уровням прав.

import { test, expect, request } from '@playwright/test';

test('API эмуляция прав доступа', async () => {
  const adminToken = 'admin-auth-token';
  const userToken = 'user-auth-token';
  
  // Отправка запроса с токеном администратора
  const adminRequest = await request.post('https://example.com/api/data', {
    headers: {
      'Authorization': `Bearer ${adminToken}`,
    },
  });
  expect(adminRequest.status()).toBe(200);
  
  // Отправка запроса с токеном обычного пользователя
  const userRequest = await request.post('https://example.com/api/data', {
    headers: {
      'Authorization': `Bearer ${userToken}`,
    },
  });
  expect(userRequest.status()).toBe(403); // Статус отказа в доступе для обычного пользователя
});

Здесь используется библиотека request из Playwright для отправки API-запросов с соответствующими заголовками авторизации. Это позволяет эмулировать доступ к данным для пользователей с разными уровнями прав.

Использование контекста браузера для изоляции прав доступа

Playwright позволяет создавать несколько контекстов браузера в одном тесте, что полезно для эмуляции различных прав доступа в одном тестовом сценарии. Каждый контекст представляет собой независимую сессию с отдельными Cookies, локальным хранилищем и другими данными сессии. Это позволяет тестировать разные состояния авторизации в одном тесте, что помогает избежать необходимости многократного запуска браузера.

import { test, expect, chromium } from '@playwright/test';

test('Эмуляция прав доступа с разными контекстами', async () => {
  const browser = await chromium.launch();
  
  // Контекст для админа
  const adminContext = await browser.newContext();
  const adminPage = await adminContext.newPage();
  await adminPage.context().addCookies([{ name: 'auth_token', value: 'admin-auth-token', domain: 'example.com' }]);
  await adminPage.goto('https://example.com/admin-dashboard');
  const adminDashboardVisible = await adminPage.locator('text=Admin Dashboard').isVisible();
  expect(adminDashboardVisible).toBe(true);

  // Контекст для пользователя
  const userContext = await browser.newContext();
  const userPage = await userContext.newPage();
  await userPage.context().addCookies([{ name: 'auth_token', value: 'user-auth-token', domain: 'example.com' }]);
  await userPage.goto('https://example.com/user-dashboard');
  const userDashboardVisible = await userPage.locator('text=User Dashboard').isVisible();
  expect(userDashboardVisible).toBe(true);

  await browser.close();
});

В этом примере создаются два отдельных контекста для администратора и обычного пользователя. Каждый контекст имитирует отдельную сессию с нужными правами доступа. Такой подход позволяет изолировать различные пользовательные роли в одном тесте.

Эмуляция прав доступа через заголовки

Некоторые приложения используют для управления доступом специфические заголовки HTTP-запросов, такие как X-Role или X-Permission. Эти заголовки могут быть добавлены как на уровне API-запросов, так и при эмуляции взаимодействий с UI.

import { test, expect } from '@playwright/test';

test('Эмуляция прав доступа через заголовки', async ({ page }) => {
  await page.route('**/api/data', (route, request) => {
    const role = request.headers()['x-role'];
    if (role === 'admin') {
      route.continue();
    } else {
      route.fulfill({
        status: 403,
        body: 'Forbidden',
      });
    }
  });

  // Запрос с ролью администратора
  await page.goto('https://example.com');
  await page.addInitScript(() => {
    window.localStorage.setItem('role', 'admin');
  });
  const response = await page.request.get('https://example.com/api/data');
  expect(response.status()).toBe(200);

  // Запрос с ролью пользователя
  await page.addInitScript(() => {
    window.localStorage.setItem('role', 'user');
  });
  const userResponse = await page.request.get('https://example.com/api/data');
  expect(userResponse.status()).toBe(403);
});

В этом примере используется возможность перехвата сетевых запросов с помощью page.route(). Это позволяет настроить кастомные заголовки, которые эмулируют различные роли для проверки прав доступа на серверной стороне.

Заключение

Эмуляция прав доступа в Playwright — это мощный инструмент для тестирования веб-приложений с различными уровнями безопасности. Возможности для использования Cookies, токенов, API-запросов и контекстов браузера позволяют создавать гибкие и эффективные тесты, которые могут имитировать различные сценарии использования в реальных условиях.