Тестирование CORS

CORS (Cross-Origin Resource Sharing) — механизм веб-браузеров, который ограничивает доступ веб-приложений к ресурсам, расположенным на другом домене. В контексте автоматизированного тестирования на JavaScript с использованием Protractor важно понимать, как работать с CORS, чтобы корректно проверять функциональность фронтенда при взаимодействии с внешними API или серверами.

Настройка окружения

Protractor работает поверх Selenium WebDriver и использует браузер для выполнения сценариев тестирования. Для тестирования CORS необходимо учитывать:

  • Настройки браузера: современные браузеры по умолчанию блокируют кросс-доменные запросы. Для обхода этого ограничения в тестовой среде можно:

    • Запускать браузер с отключенной проверкой CORS (например, для Chrome: --disable-web-security --user-data-dir=/tmp/chrome-profile).
    • Использовать локальный прокси, который перенаправляет запросы к целевому серверу.
  • Конфигурация Protractor: в protractor.conf.js указываются опции браузера, которые позволяют управлять политикой безопасности:

capabilities: {
    browserName: 'chrome',
    chromeOptions: {
        args: ['--disable-web-security', '--user-data-dir=/tmp/chrome-profile']
    }
}

Работа с HTTP-запросами

В Protractor для проверки взаимодействия с сервером можно использовать прямые HTTP-запросы через библиотеки, такие как axios или request. Это особенно полезно для проверки заголовков CORS, статусов ответа и корректного поведения API без участия браузера:

const axios = require('axios');

describe('CORS requests', () => {
    it('should allow cross-origin GET request', async () => {
        const response = await axios.get('https://api.example.com/data', {
            headers: { 'Origin': 'http://localhost:4200' }
        });
        expect(response.status).toBe(200);
        expect(response.headers['access-control-allow-origin']).toBe('http://localhost:4200');
    });
});

Ключевые моменты:

  • Заголовок Origin определяет источник запроса.
  • Заголовок Access-Control-Allow-Origin в ответе сервера должен совпадать с источником, чтобы браузер разрешил доступ к данным.

Эмуляция CORS в браузере

Иногда требуется проверить поведение фронтенда без реального изменения серверных настроек. В Protractor это можно сделать через:

  • Мокирование запросов с помощью browser.executeScript для переопределения XMLHttpRequest или fetch.
  • Использование protractor-http-mock, который позволяет создавать фиктивные ответы на запросы и задавать нужные заголовки CORS.

Пример мокирования запроса:

browser.executeScript(() => {
    const originalFetch = window.fetch;
    window.fetch = function(url, options) {
        if (url.includes('api.example.com')) {
            return Promise.resolve(new Response(JSON.stringify({ data: 'mocked' }), {
                status: 200,
                headers: { 'Access-Control-Allow-Origin': '*' }
            }));
        }
        return originalFetch(url, options);
    };
});

Обработка ошибок CORS

Браузер блокирует доступ к ответу, если политика CORS нарушена. В тестах это проявляется как исключение или пустой ответ при попытке обратиться к данным. Важно уметь проверять такие ситуации:

  • Проверка статуса запроса через мок или прямой HTTP-запрос.
  • Логирование ошибок в консоль для анализа.
  • Настройка Protractor для ожидания ошибок при запросах к запрещённым источникам.

Пример проверки ошибки:

it('should fail cross-origin request if server blocks it', async () => {
    try {
        await browser.executeAsyncScript((callback) => {
            fetch('https://forbidden.example.com/data')
                .then(res => callback(res.status))
                .catch(err => callback(err.message));
        });
    } catch (error) {
        expect(error).toContain('Failed to fetch');
    }
});

Автоматизация тестов CORS

Для систематического тестирования можно применять следующие подходы:

  1. Сценарии с различными источниками — тестировать один и тот же запрос с разрешённого и запрещённого домена.
  2. Проверка заголовков ответа — гарантировать наличие Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Headers.
  3. Использование CI/CD — запуск Protractor с дополнительными флагами браузера для обхода CORS или через локальный прокси.

Лучшие практики

  • Сохранять тесты независимыми от внешних сервисов, используя моки и стаб-сервисы.
  • Минимизировать использование отключения безопасности браузера в продуктивных тестах.
  • Логировать заголовки и ответы, чтобы быстрее идентифицировать проблемы с CORS.
  • Проверять не только успешные запросы, но и блокированные, чтобы убедиться в правильной защите данных.

Тестирование CORS в Protractor требует сочетания браузерных настроек, мокирования и прямых HTTP-запросов, что позволяет полноценно проверять корректность работы приложения в условиях ограничений безопасности браузера.