external_entities-8.x-2.x-dev/tests/src/Unit/RestClientUnitTest.php

tests/src/Unit/RestClientUnitTest.php
<?php

namespace Drupal\Tests\external_entities\Unit;

use Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher;
use Drupal\Core\Database\Connection;
use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
use Drupal\Core\Logger\LoggerChannelInterface;
use Drupal\Core\StringTranslation\TranslationInterface;
use Drupal\Core\Utility\Token;
use Drupal\Tests\UnitTestCase;
use Drupal\external_entities\Entity\ConfigurableExternalEntityTypeInterface;
use Drupal\external_entities\Entity\ExternalEntityTypeInterface;
use Drupal\external_entities\Plugin\ExternalEntities\FieldMapper\GenericFieldMapper;
use Drupal\external_entities\Plugin\ExternalEntities\StorageClient\RestClient;
use Drupal\external_entities\ResponseDecoder\ResponseDecoderFactoryInterface;
use GuzzleHttp\ClientInterface;
use Symfony\Component\EventDispatcher\EventDispatcher;

/**
 * The class to test Rest client.
 *
 * @group ExternalEntities
 */
class RestClientUnitTest extends UnitTestCase {

  /**
   * Test container.
   *
   * @var \Symfony\Component\DependencyInjection\ContainerInterface
   */
  protected $container;

  /**
   * The mocked token service.
   *
   * @var \Drupal\Core\Utility\Token|\PHPUnit\Framework\MockObject\MockObject
   */
  protected $tokenServiceMock;

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();
    $container = new ContainerBuilder();
    $string_translation = $this->getMockBuilder(TranslationInterface::class)
      ->getMock();
    $container->set('string_translation', $string_translation);

    $response_decoder_factory = $this->getMockBuilder(ResponseDecoderFactoryInterface::class)
      ->disableOriginalConstructor()
      ->getMock();
    $container->set('external_entities.response_decoder_factory', $response_decoder_factory);

    $http_client = $this->getMockBuilder(ClientInterface::class)
      ->disableOriginalConstructor()
      ->getMock();
    $container->set('http_client', $http_client);

    $entity_type_manager = $this->getMockBuilder(EntityTypeManagerInterface::class)
      ->disableOriginalConstructor()
      ->getMock();
    $container->set('entity_type.manager', $entity_type_manager);

    $entity_field_manager = $this->getMockBuilder(EntityFieldManagerInterface::class)
      ->disableOriginalConstructor()
      ->getMock();
    $container->set('entity_field.manager', $entity_field_manager);

    $logger = $this->getMockBuilder(LoggerChannelInterface::class)
      ->disableOriginalConstructor()
      ->getMock();
    $logger_factory = $this->getMockBuilder(LoggerChannelFactoryInterface::class)
      ->disableOriginalConstructor()
      ->getMock();
    $logger_factory
      ->expects($this->any())
      ->method('get')
      ->with('xntt_storage_client_rest_test')
      ->willReturn($logger);
    $container->set('logger.factory', $logger_factory);

    $database = $this->getMockBuilder(Connection::class)
      ->disableOriginalConstructor()
      ->getMock();
    $container->set('database', $database);

    if (class_exists(EventDispatcher::class)) {
      // Drupal 11+.
      $event_dispatcher = $this->getMockBuilder(EventDispatcher::class)
        ->disableOriginalConstructor()
        ->getMock();
      $event_dispatcher
        ->expects($this->any())
        ->method('dispatch');
    }
    else {
      // Older Drupals.
      $event_dispatcher = $this->getMockBuilder(ContainerAwareEventDispatcher::class)
        ->disableOriginalConstructor()
        ->getMock();
      $event_dispatcher
        ->expects($this->any())
        ->method('dispatch');
    }
    $container->set('event_dispatcher', $event_dispatcher);

    // Create a mock for the token service.
    $this->tokenServiceMock = $this->getMockBuilder(Token::class)
      ->disableOriginalConstructor()
      ->getMock();
    $this->tokenServiceMock->method('replacePlain')
      ->willReturnCallback(function ($string, array $data, array $options) {
        return $string;
      });
    $container->set('token', $this->tokenServiceMock);

    \Drupal::setContainer($container);
    $this->container = $container;
  }

  /**
   * Data provider for testRestPaging().
   *
   * Structure:
   * - expected paging
   * - pager config
   * - pager request
   * - test name.
   */
  public static function provideTestRestPagingNone() {
    return [
      // Check 1 complete page.
      [
        [
          [
            'parameters' => [],
            'start' => 2,
            'length' => 21,
          ],
        ],
        [
          'default_limit' => '',
          'type' => 'pagination',
          'page_parameter' => '',
          'page_parameter_type' => 'pagenum',
          'page_start_one' => FALSE,
          'page_size_parameter' => '',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 2, 'length' => 21],
        '1 page no pager',
      ],
      // Check 1 page exeeding limits.
      [
        [
          [
            'parameters' => [],
            'start' => 2,
            'length' => 8,
          ],
        ],
        [
          'default_limit' => 10,
          'type' => 'pagination',
          'page_parameter' => '',
          'page_parameter_type' => 'startitem',
          'page_start_one' => TRUE,
          'page_size_parameter' => '',
          'page_size_parameter_type' => 'enditem',
        ],
        ['start' => 2, 'length' => 21],
        '1 page no pager exeeding limits',
      ],
    ];
  }

  /**
   * Data provider for testRestPaging().
   *
   * Structure:
   * - expected paging
   * - pager config
   * - pager request
   * - test name.
   */
  public static function provideTestRestPagingStartZero() {
    return [
      // Check 1 complete page.
      [
        [
          [
            'parameters' => [
              'p' => 0,
              'ps' => 50,
            ],
            'start' => 0,
            'length' => 50,
          ],
        ],
        [
          'default_limit' => 50,
          'type' => 'pagination',
          'page_parameter' => 'p',
          'page_parameter_type' => 'pagenum',
          'page_start_one' => FALSE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 0, 'length' => 50],
        '1 complete page',
      ],
      // Check 1 partial page.
      [
        [
          [
            'parameters' => [
              'page' => 0,
              'pageSize' => 30,
            ],
            'start' => 5,
            'length' => 25,
          ],
        ],
        [
          'default_limit' => 50,
          'type' => 'pagination',
          'page_parameter' => 'page',
          'page_parameter_type' => 'pagenum',
          'page_start_one' => FALSE,
          'page_size_parameter' => 'pageSize',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 5, 'length' => 25],
        '1 partial page',
      ],
      // Check 1 complete page + 1 item.
      [
        [
          [
            'parameters' => [
              'p' => 0,
              'ps' => 20,
            ],
            'start' => 0,
            'length' => 20,
          ],
          [
            'parameters' => [
              'p' => 1,
              'ps' => 20,
            ],
            'start' => 0,
            'length' => 1,
          ],
        ],
        [
          'default_limit' => 20,
          'type' => 'pagination',
          'page_parameter' => 'p',
          'page_parameter_type' => 'pagenum',
          'page_start_one' => FALSE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 0, 'length' => 21],
        '1 complete page + 1 item',
      ],
      // Check 2 complete pages.
      [
        [
          [
            'parameters' => [
              'p' => 0,
              'ps' => 50,
            ],
            'start' => 0,
            'length' => 50,
          ],
          [
            'parameters' => [
              'p' => 1,
              'ps' => 50,
            ],
            'start' => 0,
            'length' => 50,
          ],
        ],
        [
          'default_limit' => 50,
          'type' => 'pagination',
          'page_parameter' => 'p',
          'page_parameter_type' => 'pagenum',
          'page_start_one' => FALSE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 0, 'length' => 100],
        '2 complete pages',
      ],
      // Check 1 set over 2 pages.
      [
        [
          [
            'parameters' => [
              'p' => 0,
              'ps' => 50,
            ],
            'start' => 20,
            'length' => 30,
          ],
          [
            'parameters' => [
              'p' => 1,
              'ps' => 50,
            ],
            'start' => 0,
            'length' => 12,
          ],
        ],
        [
          'default_limit' => 50,
          'type' => 'pagination',
          'page_parameter' => 'p',
          'page_parameter_type' => 'pagenum',
          'page_start_one' => FALSE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 20, 'length' => 42],
        '1 set over 2 pages',
      ],
      // Check 1 partial page starting on second page.
      [
        [
          [
            'parameters' => [
              'p' => 1,
              'ps' => 50,
            ],
            'start' => 0,
            'length' => 7,
          ],
        ],
        [
          'default_limit' => 50,
          'type' => 'pagination',
          'page_parameter' => 'p',
          'page_parameter_type' => 'pagenum',
          'page_start_one' => FALSE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 50, 'length' => 7],
        '1 partial page starting on second page',
      ],
      // Check 4 result pages starting on second page.
      [
        [
          [
            'parameters' => [
              'p' => 1,
              'ps' => 50,
            ],
            'start' => 49,
            'length' => 1,
          ],
          [
            'parameters' => [
              'p' => 2,
              'ps' => 50,
            ],
            'start' => 0,
            'length' => 50,
          ],
          [
            'parameters' => [
              'p' => 3,
              'ps' => 50,
            ],
            'start' => 0,
            'length' => 50,
          ],
          [
            'parameters' => [
              'p' => 4,
              'ps' => 50,
            ],
            'start' => 0,
            'length' => 18,
          ],
        ],
        [
          'default_limit' => 50,
          'type' => 'pagination',
          'page_parameter' => 'p',
          'page_parameter_type' => 'pagenum',
          'page_start_one' => FALSE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 99, 'length' => 119],
        '1 partial page starting on second page',
      ],
    ];
  }

  /**
   * Data provider for testRestPaging().
   *
   * Structure:
   * - expected paging
   * - pager config
   * - pager request
   * - test name.
   */
  public static function provideTestRestPagingStartOne() {
    return [
      // Check 1 complete page.
      [
        [
          [
            'parameters' => [
              'p' => 1,
              'ps' => 50,
            ],
            'start' => 0,
            'length' => 50,
          ],
        ],
        [
          'default_limit' => 50,
          'type' => 'pagination',
          'page_parameter' => 'p',
          'page_parameter_type' => 'pagenum',
          'page_start_one' => TRUE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 0, 'length' => 50],
        '1 complete page, start 1',
      ],
      // Check 1 partial page.
      [
        [
          [
            'parameters' => [
              'p' => 1,
              'ps' => 30,
            ],
            'start' => 5,
            'length' => 25,
          ],
        ],
        [
          'default_limit' => 50,
          'type' => 'pagination',
          'page_parameter' => 'p',
          'page_parameter_type' => 'pagenum',
          'page_start_one' => TRUE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 5, 'length' => 25],
        '1 partial page, start 1',
      ],
      // Check 1 complete page + 1 item.
      [
        [
          [
            'parameters' => [
              'p' => 1,
              'ps' => 20,
            ],
            'start' => 0,
            'length' => 20,
          ],
          [
            'parameters' => [
              'p' => 2,
              'ps' => 20,
            ],
            'start' => 0,
            'length' => 1,
          ],
        ],
        [
          'default_limit' => 20,
          'type' => 'pagination',
          'page_parameter' => 'p',
          'page_parameter_type' => 'pagenum',
          'page_start_one' => TRUE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 0, 'length' => 21],
        '1 complete page + 1 item, start 1',
      ],
      // Check 2 complete pages.
      [
        [
          [
            'parameters' => [
              'p' => 1,
              'ps' => 50,
            ],
            'start' => 0,
            'length' => 50,
          ],
          [
            'parameters' => [
              'p' => 2,
              'ps' => 50,
            ],
            'start' => 0,
            'length' => 50,
          ],
        ],
        [
          'default_limit' => 50,
          'type' => 'pagination',
          'page_parameter' => 'p',
          'page_parameter_type' => 'pagenum',
          'page_start_one' => TRUE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 0, 'length' => 100],
        '2 complete pages, start 1',
      ],
      // Check 1 set over 2 pages.
      [
        [
          [
            'parameters' => [
              'p' => 1,
              'ps' => 50,
            ],
            'start' => 20,
            'length' => 30,
          ],
          [
            'parameters' => [
              'p' => 2,
              'ps' => 50,
            ],
            'start' => 0,
            'length' => 12,
          ],
        ],
        [
          'default_limit' => 50,
          'type' => 'pagination',
          'page_parameter' => 'p',
          'page_parameter_type' => 'pagenum',
          'page_start_one' => TRUE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 20, 'length' => 42],
        '1 set over 2 pages, start 1',
      ],
      // Check 1 partial page starting on second page.
      [
        [
          [
            'parameters' => [
              'p' => 2,
              'ps' => 50,
            ],
            'start' => 0,
            'length' => 7,
          ],
        ],
        [
          'default_limit' => 50,
          'type' => 'pagination',
          'page_parameter' => 'p',
          'page_parameter_type' => 'pagenum',
          'page_start_one' => TRUE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 50, 'length' => 7],
        '1 partial page starting on second page, start 1',
      ],
      // Check 1 set over 3 pages starting on second page, start 1, end item.
      [
        [
          [
            'parameters' => [
              'p' => 2,
              'end' => 70,
            ],
            'start' => 5,
            'length' => 30,
          ],
          [
            'parameters' => [
              'p' => 3,
              'end' => 105,
            ],
            'start' => 0,
            'length' => 35,
          ],
          [
            'parameters' => [
              'p' => 4,
              'end' => 120,
            ],
            'start' => 0,
            'length' => 15,
          ],
        ],
        [
          'default_limit' => 35,
          'type' => 'pagination',
          'page_parameter' => 'p',
          'page_parameter_type' => 'pagenum',
          'page_start_one' => TRUE,
          'page_size_parameter' => 'end',
          'page_size_parameter_type' => 'enditem',
        ],
        ['start' => 40, 'length' => 80],
        '1 set over 3 pages starting on second page, start 1, end item',
      ],
    ];
  }

  /**
   * Data provider for testRestPaging().
   *
   * Structure:
   * - expected paging
   * - pager config
   * - pager request
   * - test name.
   */
  public static function provideTestRestPagingStartItem() {
    return [
      // Check 1 complete page.
      [
        [
          [
            'parameters' => [
              'at' => 0,
              'ps' => 50,
            ],
            'start' => 0,
            'length' => 50,
          ],
        ],
        [
          'default_limit' => 50,
          'type' => 'pagination',
          'page_parameter' => 'at',
          'page_parameter_type' => 'startitem',
          'page_start_one' => FALSE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 0, 'length' => 50],
        '1 complete page, start item',
      ],
      // Check 1 partial page.
      [
        [
          [
            'parameters' => [
              'at' => 5,
              'ps' => 30,
            ],
            'start' => 0,
            'length' => 25,
          ],
        ],
        [
          'default_limit' => 50,
          'type' => 'pagination',
          'page_parameter' => 'at',
          'page_parameter_type' => 'startitem',
          'page_start_one' => FALSE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 5, 'length' => 25],
        '1 partial page, start item',
      ],
      // Check 1 complete page, start 1.
      [
        [
          [
            'parameters' => [
              'at' => 1,
              'ps' => 50,
            ],
            'start' => 0,
            'length' => 50,
          ],
        ],
        [
          'default_limit' => 50,
          'type' => 'pagination',
          'page_parameter' => 'at',
          'page_parameter_type' => 'startitem',
          'page_start_one' => TRUE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 0, 'length' => 50],
        '1 complete page, start item, start 1',
      ],
      // Check 1 set over 2 pages, start item, start 1.
      [
        [
          [
            'parameters' => [
              'at' => 21,
              'ps' => 45,
            ],
            'start' => 0,
            'length' => 45,
          ],
          [
            'parameters' => [
              'at' => 66,
              'ps' => 3,
            ],
            'start' => 0,
            'length' => 3,
          ],
        ],
        [
          'default_limit' => 45,
          'type' => 'pagination',
          'page_parameter' => 'at',
          'page_parameter_type' => 'startitem',
          'page_start_one' => TRUE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 20, 'length' => 48],
        '1 set over 2 pages, start item, start 1',
      ],
      // Check 1 set over 2 pages, start item.
      [
        [
          [
            'parameters' => [
              'at' => 20,
              'ps' => 45,
            ],
            'start' => 0,
            'length' => 45,
          ],
          [
            'parameters' => [
              'at' => 65,
              'ps' => 3,
            ],
            'start' => 0,
            'length' => 3,
          ],
        ],
        [
          'default_limit' => 45,
          'type' => 'pagination',
          'page_parameter' => 'at',
          'page_parameter_type' => 'startitem',
          'page_start_one' => FALSE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 20, 'length' => 48],
        '1 set over 2 pages, start item',
      ],
      // Check 1 set over 3 pages, start item.
      [
        [
          [
            'parameters' => [
              'at' => 20,
              'ps' => 45,
            ],
            'start' => 0,
            'length' => 45,
          ],
          [
            'parameters' => [
              'at' => 65,
              'ps' => 45,
            ],
            'start' => 0,
            'length' => 45,
          ],
          [
            'parameters' => [
              'at' => 110,
              'ps' => 5,
            ],
            'start' => 0,
            'length' => 5,
          ],
        ],
        [
          'default_limit' => 45,
          'type' => 'pagination',
          'page_parameter' => 'at',
          'page_parameter_type' => 'startitem',
          'page_start_one' => FALSE,
          'page_size_parameter' => 'ps',
          'page_size_parameter_type' => 'pagesize',
        ],
        ['start' => 20, 'length' => 95],
        '1 set over 3 pages, start item',
      ],
      // Check 1 set over 3 pages, start item, end item.
      [
        [
          [
            'parameters' => [
              'at' => 20,
              'end' => 64,
            ],
            'start' => 0,
            'length' => 45,
          ],
          [
            'parameters' => [
              'at' => 65,
              'end' => 109,
            ],
            'start' => 0,
            'length' => 45,
          ],
          [
            'parameters' => [
              'at' => 110,
              'end' => 114,
            ],
            'start' => 0,
            'length' => 5,
          ],
        ],
        [
          'default_limit' => 45,
          'type' => 'pagination',
          'page_parameter' => 'at',
          'page_parameter_type' => 'startitem',
          'page_start_one' => FALSE,
          'page_size_parameter' => 'end',
          'page_size_parameter_type' => 'enditem',
        ],
        ['start' => 20, 'length' => 95],
        '1 set over 3 pages, start item, end item',
      ],
      // Check 1 set over 3 pages, start item, end item, start 1.
      [
        [
          [
            'parameters' => [
              'at' => 21,
              'end' => 65,
            ],
            'start' => 0,
            'length' => 45,
          ],
          [
            'parameters' => [
              'at' => 66,
              'end' => 110,
            ],
            'start' => 0,
            'length' => 45,
          ],
          [
            'parameters' => [
              'at' => 111,
              'end' => 115,
            ],
            'start' => 0,
            'length' => 5,
          ],
        ],
        [
          'default_limit' => 45,
          'type' => 'pagination',
          'page_parameter' => 'at',
          'page_parameter_type' => 'startitem',
          'page_start_one' => TRUE,
          'page_size_parameter' => 'end',
          'page_size_parameter_type' => 'enditem',
        ],
        ['start' => 20, 'length' => 95],
        '1 set over 3 pages, start item, end item, start 1',
      ],
    ];
  }

  /**
   * Test value extraction from raw data using given mappings.
   *
   * @dataProvider provideTestRestPagingNone
   * @dataProvider provideTestRestPagingStartZero
   * @dataProvider provideTestRestPagingStartOne
   * @dataProvider provideTestRestPagingStartItem
   */
  public function testRestPaging($expected, $pager_config, $pager_request, $message) {
    global $base_url;
    $configuration = [
      'endpoint' => $base_url . '/external-entities-test/test',
      'endpoint_single' => '',
      'endpoint_count' => 1000,
      'endpoint_cache' => FALSE,
      'response_format' => 'json',
      'data_path' => [
        'list' => '',
        'single' => '',
        'keyed_by_id' => FALSE,
        'count' => '',
      ],
      'pager' => $pager_config,
      'api_key' => [
        'type' => 'none',
        'header_name' => '',
        'key' => '',
      ],
      'http' => [
        'headers' => '',
      ],
      'parameters' => [
        'list' => [],
        'list_param_mode' => 'query',
        'single' => [],
        'single_param_mode' => 'query',
      ],
      'filtering' => [
        'drupal' => TRUE,
        'basic' => FALSE,
        'basic_fields' => [],
        'list_support' => 'none',
        'list_join' => '',
      ],
    ];
    $plugin_id = 'rest_test';
    $plugin_definition = [];

    $rest_client = RestClient::create($this->container, $configuration, $plugin_id, $plugin_definition);
    $paging = $rest_client->getPagingQueryParameters($pager_request['start'], $pager_request['length']);
    $this->assertEquals($expected, $paging, 'Failed with ' . $message);
  }

  /**
   * Data provider for testRestQueryParameters().
   *
   * Structure:
   * - expected transliteration array
   * - expected query array
   * - query config
   * - api_config
   * - filtering_config
   * - id
   * - more_parameters
   * - test name.
   */
  public static function provideTestRestQueryParameters() {
    return [
      // No query.
      [
        [
          'source' => [],
          'drupal' => [],
        ],
        [
          'list' => [],
          'single' => [],
        ],
        [
          'list' => [],
          'list_param_mode' => 'query',
          'single' => [],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'none',
          'header_name' => '',
          'key' => '',
        ],
        [
          'drupal' => TRUE,
          'basic' => FALSE,
          'basic_fields' => [],
          'list_support' => 'none',
          'list_join' => '',
        ],
        NULL,
        [],
        'no queries',
      ],
      // Check other parameters only.
      [
        [
          'source' => [
            [
              'field' => 'testprop',
              'value' => 'some_value',
              'operator' => '=',
            ],
          ],
          'drupal' => [],
        ],
        [
          'list' => [
            'testprop' => 'some_value',
          ],
          'single' => [],
        ],
        [
          'list' => [],
          'list_param_mode' => 'query',
          'single' => [],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'none',
          'header_name' => '',
          'key' => '',
        ],
        [
          'drupal' => TRUE,
          'basic' => TRUE,
          'basic_fields' => [],
          'list_support' => 'none',
          'list_join' => '',
        ],
        NULL,
        [
          [
            'field' => 'field_test',
            'value' => 'some_value',
            'operator' => '=',
          ],
        ],
        'other parameters only',
      ],
      // Check other parameters only no source filtering.
      [
        [
          'source' => [],
          'drupal' => [
            [
              'field' => 'field_test',
              'value' => 'some_value',
              'operator' => '=',
            ],
          ],
        ],
        [
          'list' => [],
          'single' => [],
        ],
        [
          'list' => [],
          'list_param_mode' => 'query',
          'single' => [],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'none',
          'header_name' => '',
          'key' => '',
        ],
        [
          'drupal' => TRUE,
          'basic' => FALSE,
          'basic_fields' => [],
          'list_support' => 'none',
          'list_join' => '',
        ],
        NULL,
        [
          [
            'field' => 'field_test',
            'value' => 'some_value',
            'operator' => '=',
          ],
        ],
        'other parameters only no source filtering',
      ],
      // Check other parameters only with 2 fields.
      [
        [
          'source' => [
            [
              'field' => 'testprop',
              'value' => 'some_value',
              'operator' => '=',
            ],
            [
              'field' => 'testprop2',
              'value' => '5|6|7',
              'operator' => '=',
            ],
          ],
          'drupal' => [],
        ],
        [
          'list' => ['testprop' => 'some_value', 'testprop2' => '5|6|7'],
          'single' => [],
        ],
        [
          'list' => [],
          'list_param_mode' => 'query',
          'single' => [],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'none',
          'header_name' => '',
          'key' => '',
        ],
        [
          'drupal' => TRUE,
          'basic' => TRUE,
          'basic_fields' => [],
          'list_support' => 'implode',
          'list_join' => '|',
        ],
        NULL,
        [
          [
            'field' => 'field_test',
            'value' => 'some_value',
            'operator' => '=',
          ],
          [
            'field' => 'field_other',
            'value' => [5, 6, 7],
            'operator' => 'IN',
          ],
        ],
        'other parameters only with 2 fields',
      ],
      // Check other parameters only with 2 fields and limited basic fields.
      [
        [
          'source' => [
            [
              'field' => 'testprop2',
              'value' => 'some_other_value',
              'operator' => '=',
            ],
          ],
          'drupal' => [
            [
              'field' => 'field_test',
              'value' => 'some_value',
              'operator' => '=',
            ],
          ],
        ],
        [
          'list' => [
            'testprop2' => 'some_other_value',
          ],
          'single' => [],
        ],
        [
          'list' => [],
          'list_param_mode' => 'query',
          'single' => [],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'none',
          'header_name' => '',
          'key' => '',
        ],
        [
          'drupal' => TRUE,
          'basic' => TRUE,
          'basic_fields' => ['testprop2'],
          'list_support' => 'none',
          'list_join' => '',
        ],
        NULL,
        [
          [
            'field' => 'field_other',
            'value' => 'some_other_value',
            'operator' => '=',
          ],
          [
            'field' => 'field_test',
            'value' => 'some_value',
            'operator' => '=',
          ],
        ],
        'other parameters only with 2 fields and limited basic fields',
      ],
      // Check other parameters only with 2 fields no source filtering.
      [
        [
          'source' => [],
          'drupal' => [
            [
              'field' => 'field_test',
              'value' => 'some_value',
              'operator' => '=',
            ],
            [
              'field' => 'field_other',
              'value' => [5, 6, 7],
              'operator' => 'IN',
            ],
          ],
        ],
        [
          'list' => [],
          'single' => [],
        ],
        [
          'list' => [],
          'list_param_mode' => 'query',
          'single' => [],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'none',
          'header_name' => '',
          'key' => '',
        ],
        [
          'drupal' => TRUE,
          'basic' => FALSE,
          'basic_fields' => [],
          'list_support' => 'none',
          'list_join' => '',
        ],
        NULL,
        [
          [
            'field' => 'field_test',
            'value' => 'some_value',
            'operator' => '=',
          ],
          [
            'field' => 'field_other',
            'value' => [5, 6, 7],
            'operator' => 'IN',
          ],
        ],
        'other parameters only with 2 fields no source filtering',
      ],
      // Check single parameters only.
      [
        [
          'source' => [],
          'drupal' => [],
        ],
        [
          'list' => [],
          'single' => ['field_name_1' => 'some_value', 'field_test' => 'other_value'],
        ],
        [
          'list' => [],
          'list_param_mode' => 'query',
          'single' => ['field_name_1' => 'some_value', 'field_test' => 'other_value'],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'none',
          'header_name' => '',
          'key' => '',
        ],
        [
          'drupal' => TRUE,
          'basic' => FALSE,
          'basic_fields' => [],
          'list_support' => 'none',
          'list_join' => '',
        ],
        NULL,
        [],
        'single parameters only',
      ],
      // Check list parameters only.
      [
        [
          'source' => [],
          'drupal' => [],
        ],
        [
          'list' => ['field_name_1' => 'some_value', 'field_test' => 'other_value'],
          'single' => [],
        ],
        [
          'list' => ['field_name_1' => 'some_value', 'field_test' => 'other_value'],
          'list_param_mode' => 'query',
          'single' => [],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'none',
          'header_name' => '',
          'key' => '',
        ],
        [
          'drupal' => TRUE,
          'basic' => FALSE,
          'basic_fields' => [],
          'list_support' => 'none',
          'list_join' => '',
        ],
        NULL,
        [],
        'list parameters only',
      ],
      // Check list and single parameters.
      [
        [
          'source' => [],
          'drupal' => [],
        ],
        [
          'list' => ['field_name_1' => 'some_value'],
          'single' => ['field_name_2' => 'other_value'],
        ],
        [
          'list' => ['field_name_1' => 'some_value'],
          'list_param_mode' => 'query',
          'single' => ['field_name_2' => 'other_value'],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'none',
          'header_name' => 'bla',
          'key' => 'bli',
        ],
        [
          'drupal' => TRUE,
          'basic' => FALSE,
          'basic_fields' => [],
          'list_support' => 'none',
          'list_join' => '',
        ],
        NULL,
        [],
        'list and single parameters',
      ],
      // Check other parameters with single and unsupported list parameters.
      [
        [
          'source' => [
            [
              'field' => 'testprop',
              'value' => 'some_value',
              'operator' => '=',
            ],
          ],
          'drupal' => [
            [
              'field' => 'field_other',
              'value' => [5, 6, 7],
              'operator' => 'IN',
            ],
          ],
        ],
        [
          'list' => [
            'testprop' => 'some_value',
            'field_name_1' => 'some_value',
            'field_other' => 'other_value',
          ],
          'single' => [
            'field_name_2' => 'some_value',
            'field_other' => 'other_value',
          ],
        ],
        [
          'list' => [
            'field_name_1' => 'some_value',
            'field_other' => 'other_value',
          ],
          'list_param_mode' => 'query',
          'single' => [
            'field_name_2' => 'some_value',
            'field_other' => 'other_value',
          ],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'custom',
          'header_name' => 'bla',
          'key' => 'bli',
        ],
        [
          'drupal' => TRUE,
          'basic' => TRUE,
          'basic_fields' => [],
          'list_support' => 'none',
          'list_join' => '',
        ],
        NULL,
        [
          [
            'field' => 'field_test',
            'value' => 'some_value',
            'operator' => '=',
          ],
          [
            'field' => 'field_other',
            'value' => [5, 6, 7],
            'operator' => 'IN',
          ],
        ],
        'other parameters with single and unsupported list parameters',
      ],
      // Check other parameters with single and repeated list parameters.
      [
        [
          'source' => [
            [
              'field' => 'testprop',
              'value' => 'some_value',
              'operator' => '=',
            ],
            [
              'field' => '&testprop2',
              'value' => [5, 6, 7],
              'operator' => '=',
            ],
          ],
          'drupal' => [],
        ],
        [
          'list' => 'testprop=some_value&field_name_1=some_value&field_other=other_value&testprop2=5&testprop2=6&testprop2=7',
          'single' => [
            'field_name_2' => 'some_value',
            'field_other' => 'other_value',
          ],
        ],
        [
          'list' => [
            'field_name_1' => 'some_value',
            'field_other' => 'other_value',
          ],
          'list_param_mode' => 'query',
          'single' => [
            'field_name_2' => 'some_value',
            'field_other' => 'other_value',
          ],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'custom',
          'header_name' => 'bla',
          'key' => 'bli',
        ],
        [
          'drupal' => TRUE,
          'basic' => TRUE,
          'basic_fields' => [],
          'list_support' => 'repeat',
          'list_join' => '',
        ],
        NULL,
        [
          [
            'field' => 'field_test',
            'value' => 'some_value',
            'operator' => '=',
          ],
          [
            'field' => 'field_other',
            'value' => [5, 6, 7],
            'operator' => 'IN',
          ],
        ],
        'other parameters with single and repeated list parameters',
      ],
      // Check other parameters with single and indexed list parameters.
      [
        [
          'source' => [
            [
              'field' => 'testprop',
              'value' => 'some_value',
              'operator' => '=',
            ],
            [
              'field' => 'testprop2[0]',
              'value' => 5,
              'operator' => '=',
            ],
            [
              'field' => 'testprop2[1]',
              'value' => 6,
              'operator' => '=',
            ],
            [
              'field' => 'testprop2[2]',
              'value' => 7,
              'operator' => '=',
            ],
          ],
          'drupal' => [],
        ],
        [
          'list' => [
            'testprop' => 'some_value',
            'field_name_1' => 'some_value',
            'field_other' => 'other_value',
            'testprop2[0]' => 5,
            'testprop2[1]' => 6,
            'testprop2[2]' => 7,
          ],
          'single' => [
            'field_name_2' => 'some_value',
            'field_other' => 'other_value',
          ],
        ],
        [
          'list' => [
            'field_name_1' => 'some_value',
            'field_other' => 'other_value',
          ],
          'list_param_mode' => 'query',
          'single' => [
            'field_name_2' => 'some_value',
            'field_other' => 'other_value',
          ],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'custom',
          'header_name' => 'bla',
          'key' => 'bli',
        ],
        [
          'drupal' => TRUE,
          'basic' => TRUE,
          'basic_fields' => [],
          'list_support' => 'indexed',
          'list_join' => '',
        ],
        NULL,
        [
          [
            'field' => 'field_test',
            'value' => 'some_value',
            'operator' => '=',
          ],
          [
            'field' => 'field_other',
            'value' => [5, 6, 7],
            'operator' => 'IN',
          ],
        ],
        'other parameters with single and indexed list parameters',
      ],
      // Check other parameters with single and unindexed list parameters.
      [
        [
          'source' => [
            [
              'field' => 'testprop',
              'value' => 'some_value',
              'operator' => '=',
            ],
            [
              'field' => 'testprop2',
              'value' => [5, 6, 7],
              'operator' => '=',
            ],
          ],
          'drupal' => [],
        ],
        [
          'list' => [
            'testprop' => 'some_value',
            'field_name_1' => 'some_value',
            'field_other' => 'other_value',
            'testprop2' => [5, 6, 7],
          ],
          'single' => [
            'field_name_2' => 'some_value',
            'field_other' => 'other_value',
          ],
        ],
        [
          'list' => [
            'field_name_1' => 'some_value',
            'field_other' => 'other_value',
          ],
          'list_param_mode' => 'query',
          'single' => [
            'field_name_2' => 'some_value',
            'field_other' => 'other_value',
          ],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'custom',
          'header_name' => 'bla',
          'key' => 'bli',
        ],
        [
          'drupal' => TRUE,
          'basic' => TRUE,
          'basic_fields' => [],
          'list_support' => 'unindexed',
          'list_join' => '',
        ],
        NULL,
        [
          [
            'field' => 'field_test',
            'value' => 'some_value',
            'operator' => '=',
          ],
          [
            'field' => 'field_other',
            'value' => [5, 6, 7],
            'operator' => 'IN',
          ],
        ],
        'other parameters with single and unindexed list parameters',
      ],
      // Check other parameters with single and post list parameters.
      [
        [
          'source' => [
            [
              'field' => 'testprop',
              'value' => 'some_value',
              'operator' => '=',
            ],
            [
              'field' => 'testprop2',
              'value' => [5, 6, 7],
              'operator' => '=',
            ],
          ],
          'drupal' => [],
        ],
        [
          'list' => [
            'testprop' => 'some_value',
            'field_name_1' => 'some_value',
            'field_other' => 'other_value',
            'testprop2' => [5, 6, 7],
          ],
          'single' => [
            'field_name_2' => 'some_value',
            'field_other' => 'other_value',
          ],
        ],
        [
          'list' => [
            'field_name_1' => 'some_value',
            'field_other' => 'other_value',
          ],
          'list_param_mode' => 'query',
          'single' => [
            'field_name_2' => 'some_value',
            'field_other' => 'other_value',
          ],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'custom',
          'header_name' => 'bla',
          'key' => 'bli',
        ],
        [
          'drupal' => TRUE,
          'basic' => TRUE,
          'basic_fields' => [],
          'list_support' => 'post',
          'list_join' => '',
        ],
        NULL,
        [
          [
            'field' => 'field_test',
            'value' => 'some_value',
            'operator' => '=',
          ],
          [
            'field' => 'field_other',
            'value' => [5, 6, 7],
            'operator' => 'IN',
          ],
        ],
        'other parameters with single and post list parameters',
      ],
      // Check other parameters with single and list parameters no source
      // filtering.
      [
        [
          'source' => [],
          'drupal' => [
            [
              'field' => 'field_test',
              'value' => 'some_value',
              'operator' => '=',
            ],
            [
              'field' => 'field_other',
              'value' => [5, 6, 7],
              'operator' => 'IN',
            ],
          ],
        ],
        [
          'list' => [
            'field_name_1' => 'some_value',
            'field_other' => 'other_value',
          ],
          'single' => [
            'field_name_2' => 'some_value',
            'field_other' => 'other_value',
          ],
        ],
        [
          'list' => [
            'field_name_1' => 'some_value',
            'field_other' => 'other_value',
          ],
          'list_param_mode' => 'query',
          'single' => [
            'field_name_2' => 'some_value',
            'field_other' => 'other_value',
          ],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'custom',
          'header_name' => 'bla',
          'key' => 'bli',
        ],
        [
          'drupal' => TRUE,
          'basic' => FALSE,
          'basic_fields' => [],
          'list_support' => 'none',
          'list_join' => '',
        ],
        NULL,
        [
          [
            'field' => 'field_test',
            'value' => 'some_value',
            'operator' => '=',
          ],
          [
            'field' => 'field_other',
            'value' => [5, 6, 7],
            'operator' => 'IN',
          ],
        ],
        'other parameters with single and list parameters no source filtering',
      ],
      // Check other, single and list parameters with authentication.
      [
        [
          'source' => [
            [
              'field' => 'testprop',
              'value' => 'some_value',
              'operator' => '=',
            ],
          ],
          'drupal' => [
            [
              'field' => 'field_other',
              'value' => [5, 6, 7],
              'operator' => 'IN',
            ],
          ],
        ],
        [
          'list' => [
            'testprop' => 'some_value',
            'field_name_1' => 'some_value',
            'field_other' => 'other_value',
            'api-key' => '0123456789ABCDEF',
          ],
          'single' => [
            'field_name_2' => 'some_value',
            'field_other' => 'other_value',
            'api-key' => '0123456789ABCDEF',
          ],
        ],
        [
          'list' => ['field_name_1' => 'some_value', 'field_other' => 'other_value'],
          'list_param_mode' => 'query',
          'single' => ['field_name_2' => 'some_value', 'field_other' => 'other_value'],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'query',
          'header_name' => 'api-key',
          'key' => '0123456789ABCDEF',
        ],
        [
          'drupal' => TRUE,
          'basic' => TRUE,
          'basic_fields' => [],
          'list_support' => 'none',
          'list_join' => '',
        ],
        NULL,
        [
          [
            'field' => 'field_test',
            'value' => 'some_value',
            'operator' => '=',
          ],
          [
            'field' => 'field_other',
            'value' => [5, 6, 7],
            'operator' => 'IN',
          ],
        ],
        'other, single and list parameters with authentication',
      ],
      // Check other, single and list parameters with authentication no source
      // filtering.
      [
        [
          'source' => [],
          'drupal' => [
            [
              'field' => 'field_test',
              'value' => 'some_value',
              'operator' => '=',
            ],
            [
              'field' => 'field_other',
              'value' => [5, 6, 7],
              'operator' => 'IN',
            ],
          ],
        ],
        [
          'list' => [
            'field_name_1' => 'some_value',
            'field_other' => 'other_value',
            'api-key' => '0123456789ABCDEF',
          ],
          'single' => [
            'field_name_2' => 'some_value',
            'field_other' => 'other_value',
            'api-key' => '0123456789ABCDEF',
          ],
        ],
        [
          'list' => ['field_name_1' => 'some_value', 'field_other' => 'other_value'],
          'list_param_mode' => 'query',
          'single' => ['field_name_2' => 'some_value', 'field_other' => 'other_value'],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'query',
          'header_name' => 'api-key',
          'key' => '0123456789ABCDEF',
        ],
        [
          'drupal' => TRUE,
          'basic' => FALSE,
          'basic_fields' => [],
          'list_support' => 'none',
          'list_join' => '',
        ],
        NULL,
        [
          [
            'field' => 'field_test',
            'value' => 'some_value',
            'operator' => '=',
          ],
          [
            'field' => 'field_other',
            'value' => [5, 6, 7],
            'operator' => 'IN',
          ],
        ],
        'other, single and list parameters with authentication no source filtering',
      ],
      // Check authentication only.
      [
        [
          'source' => [],
          'drupal' => [],
        ],
        [
          'list' => ['api-key' => '0123456789ABCDEF'],
          'single' => ['api-key' => '0123456789ABCDEF'],
        ],
        [
          'list' => [],
          'list_param_mode' => 'query',
          'single' => [],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'query',
          'header_name' => 'api-key',
          'key' => '0123456789ABCDEF',
        ],
        [
          'drupal' => TRUE,
          'basic' => FALSE,
          'basic_fields' => [],
          'list_support' => 'none',
          'list_join' => '',
        ],
        NULL,
        [],
        'authentication only',
      ],
      // Check single parameters with id.
      [
        [
          'source' => [],
          'drupal' => [],
        ],
        [
          'list' => [],
          'single' => ['field_name_1' => 'some_value', 'field_test' => 'other_value', 'id' => 'entity-42'],
        ],
        [
          'list' => [],
          'list_param_mode' => 'query',
          'single' => ['field_name_1' => 'some_value', 'field_test' => 'other_value', 'id' => 'entity-{id}'],
          'single_param_mode' => 'query',
        ],
        [
          'type' => 'none',
          'header_name' => '',
          'key' => '',
        ],
        [
          'drupal' => TRUE,
          'basic' => FALSE,
          'basic_fields' => [],
          'list_support' => 'none',
          'list_join' => '',
        ],
        42,
        [],
        'single parameters with id',
      ],
    ];
  }

  /**
   * Test query parameters generation.
   *
   * @dataProvider provideTestRestQueryParameters
   */
  public function testRestQueryParameters($exp_transliteration, $expected, $query_config, $api_config, $filtering_config, $id, $more_parameters, $message) {
    global $base_url;
    // Field field_test mapping.
    $field_mapper1 = $this->getMockBuilder(GenericFieldMapper::class)
      ->disableOriginalConstructor()
      ->getMock();
    $field_mapper1
      ->expects($this->any())
      ->method('getMappedSourceFieldName')
      ->willReturn('testprop');

    // Field field_other mapping.
    $field_mapper2 = $this->getMockBuilder(GenericFieldMapper::class)
      ->disableOriginalConstructor()
      ->getMock();
    $field_mapper2
      ->expects($this->any())
      ->method('getMappedSourceFieldName')
      ->willReturn('testprop2');

    // Test external entity.
    $xntt = $this->getMockBuilder(ConfigurableExternalEntityTypeInterface::class)
      ->disableOriginalConstructor()
      ->getMock();
    $xntt
      ->expects($this->any())
      ->method('getFieldMapper')
      ->willReturnCallback(function (string $field_name) use ($field_mapper1, $field_mapper2) {
        return match ($field_name) {
          'field_test' => $field_mapper1,
          'field_other' => $field_mapper2,
          default => throw new \LogicException()
        };
      });

    $configuration = [
      ExternalEntityTypeInterface::XNTT_TYPE_PROP => $xntt,
      'endpoint' => $base_url . '/external-entities-test/test',
      'endpoint_single' => '',
      'endpoint_count' => 1000,
      'endpoint_cache' => FALSE,
      'response_format' => 'json',
      'data_path' => [
        'list' => '',
        'single' => '',
        'keyed_by_id' => FALSE,
        'count' => '',
      ],
      'pager' => [
        'default_limit' => 50,
        'type' => 'pagination',
        'page_parameter' => 'p',
        'page_parameter_type' => 'pagenum',
        'page_start_one' => FALSE,
        'page_size_parameter' => 'ps',
        'page_size_parameter_type' => 'pagesize',
      ],
      'api_key' => $api_config,
      'http' => [
        'headers' => '',
      ],
      'parameters' => $query_config,
      'filtering' => $filtering_config,
    ];
    $plugin_id = 'rest_test';
    $plugin_definition = [];

    $rest_client = RestClient::create($this->container, $configuration, $plugin_id, $plugin_definition);

    $trans_parameters = $rest_client->transliterateDrupalFilters($more_parameters, ['caller' => 'query']);
    $this->assertEquals($exp_transliteration, $trans_parameters, 'Failed for transliteration with ' . $message);

    $list_query = $rest_client->getQueryParameters(
      '',
      [
        'request_type' => 'list',
        'method' => 'GET',
        'filters' => $trans_parameters['source'],
        'paging' => [],
      ]
    );
    $this->assertEquals($expected['list'], $list_query, 'Failed for list query with ' . $message);

    $single_query = $rest_client->getQueryParameters(
      '',
      [
        'request_type' => 'read',
        'method' => 'GET',
        'id' => $id,
        'data' => $trans_parameters['source'],
      ]
    );
    $this->assertEquals($expected['single'], $single_query, 'Failed for single query with ' . $message);
  }

  /**
   * Data provider for testRestHttpHeaders().
   *
   * Structure:
   * - expected header array
   * - API config
   * - header config
   * - test name.
   */
  public static function provideTestRestHttpHeaders() {
    return [
      // No headers.
      [
        [],
        [
          'type' => 'none',
          'header_name' => '',
          'key' => '',
        ],
        [
          'headers' => '',
        ],
        'no headers',
      ],
      // Check 2 lines header.
      [
        [
          'x-api-version' => '2.0',
          'Authorization' => 'ApiKey key="FEDCBA9876543210"',
        ],
        [
          'type' => 'none',
          'header_name' => '',
          'key' => '',
        ],
        [
          'headers' => "x-api-version: 2.0\nAuthorization: ApiKey key=\"FEDCBA9876543210\"",
        ],
        '2 lines header',
      ],
      // Check bearer header.
      [
        [
          'Authorization' => 'Bearer FEDCBA9876543210',
        ],
        [
          'type' => 'bearer',
          'header_name' => 'Authorization',
          'key' => 'Bearer FEDCBA9876543210',
        ],
        [
          'headers' => '',
        ],
        'bearer header',
      ],
      // Check 1 line header with bearer header.
      [
        [
          'x-api-version' => '2.0',
          'Authorization' => 'Bearer FEDCBA9876543210',
        ],
        [
          'type' => 'bearer',
          'header_name' => 'Authorization',
          'key' => 'Bearer FEDCBA9876543210',
        ],
        [
          'headers' => "x-api-version: 2.0",
        ],
        '1 line header with bearer header',
      ],
      // Check 2 lines header with duplicate authentication header.
      [
        [
          'x-api-version' => '2.0',
          'Authorization' => 'Bearer FEDCBA9876543210',
        ],
        [
          'type' => 'bearer',
          'header_name' => 'Authorization',
          'key' => 'Bearer FEDCBA9876543210',
        ],
        [
          'headers' => "x-api-version: 2.0\nAuthorization: ApiKey key=\"FEDCBA9876543210\"",
        ],
        '2 lines header with duplicate authentication header',
      ],
      // Check custom authentication header.
      [
        [
          'WWW-Authenticate' => 'Basic realm=someone@somewhere.org',
        ],
        [
          'type' => 'custom',
          'header_name' => 'WWW-Authenticate',
          'key' => 'Basic realm=someone@somewhere.org',
        ],
        [
          'headers' => '',
        ],
        'custom authentication header',
      ],
      // Check query authentication with no header.
      [
        [],
        [
          'type' => 'query',
          'header_name' => 'key',
          'key' => 'FEDCBA9876543210',
        ],
        [
          'headers' => '',
        ],
        'query authentication with no header',
      ],
    ];
  }

  /**
   * Test HTTP headers generation.
   *
   * @dataProvider provideTestRestHttpHeaders
   */
  public function testRestHttpHeaders($expected, $api_config, $header_config, $message) {
    global $base_url;
    $configuration = [
      'endpoint' => $base_url . '/external-entities-test/test',
      'endpoint_single' => '',
      'endpoint_count' => 1000,
      'endpoint_cache' => FALSE,
      'response_format' => 'json',
      'data_path' => [
        'list' => '',
        'single' => '',
        'keyed_by_id' => FALSE,
        'count' => '',
      ],
      'pager' => [
        'default_limit' => 50,
        'type' => 'pagination',
        'page_parameter' => 'p',
        'page_parameter_type' => 'pagenum',
        'page_start_one' => FALSE,
        'page_size_parameter' => 'ps',
        'page_size_parameter_type' => 'pagesize',
      ],
      'api_key' => $api_config,
      'http' => $header_config,
      'parameters' => [
        'list' => [],
        'single' => [],
      ],
      'filtering' => [
        'drupal' => TRUE,
        'basic' => FALSE,
        'basic_fields' => [],
        'list_support' => 'none',
        'list_join' => '',
      ],
    ];
    $plugin_id = 'rest_test';
    $plugin_definition = [];

    $rest_client = RestClient::create($this->container, $configuration, $plugin_id, $plugin_definition);

    $headers = $rest_client->getHttpHeaders();
    $this->assertEquals($expected, $headers, 'Failed with ' . $message);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc