acquia_search_solr-8.x-1.0-beta9/tests/src/Unit/Commands/AcquiaSearchSolrCommandsTest.php

tests/src/Unit/Commands/AcquiaSearchSolrCommandsTest.php
<?php

namespace Drupal\Tests\acquia_search_solr\Unit\Commands {

  use Drupal\acquia_search_solr\Commands\AcquiaSearchSolrCommands;
  use Drupal\acquia_search_solr\Helper\Storage;
  use Drupal\Component\Datetime\Time;
  use Drupal\Component\Serialization\Json;
  use Drupal\Component\Uuid\Php;
  use Drupal\Core\Cache\CacheBackendInterface;
  use Drupal\Core\Config\Config;
  use Drupal\Core\Config\ConfigFactoryInterface;
  use Drupal\Core\Config\ImmutableConfig;
  use Drupal\Core\DependencyInjection\ContainerBuilder;
  use Drupal\Core\Extension\ModuleHandlerInterface;
  use Drupal\Core\State\State;
  use Drupal\Tests\UnitTestCase;
  use GuzzleHttp\Client;
  use Prophecy\Argument;
  use Psr\Http\Message\ResponseInterface;
  use Psr\Http\Message\StreamInterface;
  use Symfony\Component\Console\Output\OutputInterface;

  /**
   * @coversDefaultClass \Drupal\acquia_search_solr\Commands\AcquiaSearchSolrCommands
   * @group Acquia Search Solr
   */
  class AcquiaSearchSolrCommandsTest extends UnitTestCase {

    /**
     * OutputInterface.
     *
     * @var \Prophecy\Prophecy\ObjectProphecy
     */
    protected $output;

    /**
     * Command.
     *
     * @var \Drupal\acquia_search_solr\Commands\AcquiaSearchSolrCommands
     */
    protected $command;

    /**
     * CacheBackendInterface.
     *
     * @var \Prophecy\Prophecy\ObjectProphecy
     */
    protected $cache;

    /**
     * GuzzleHttp Client.
     *
     * @var \Prophecy\Prophecy\ObjectProphecy
     */
    protected $guzzleClient;

    /**
     * {@inheritdoc}
     */
    protected function setUp() {
      parent::setUp();

      $state = $this->prophesize(State::class);
      $state->set(Argument::type('string'), Argument::type('string'))
        ->will(function ($arguments) use ($state) {
          $state->get($arguments[0], Argument::any())
            ->willReturn($arguments[1]);
        });

      $config_factory = $this->prophesize(ConfigFactoryInterface::class);
      $config = $this->prophesize(ImmutableConfig::class);
      $config->get('override_search_core')->willReturn(NULL);
      $config->get('read_only')->willReturn(FALSE);
      $config->get('api_host')->willReturn('https://example.com');
      $config_editable = $this->prophesize(Config::class);
      $config_editable->set('api_host', 'https://example.com')
        ->willReturn($config_editable->reveal());
      $config_editable->save()->willReturn($config_editable);
      $config_factory->get('acquia_search_solr.settings')
        ->willReturn($config->reveal());
      $config_factory->getEditable('acquia_search_solr.settings')
        ->willReturn($config_editable->reveal());

      $config_factory->get('acquia_search_solr.settings')
        ->willReturn($config->reveal());

      $json = json_encode([
        [
          'key' => 'ABC-12345.prod.default',
          'secret_key' => 'secret_key',
          'product_policies' => ['salt' => 'salt'],
          'host' => 'example.com',
        ],
        [
          'key' => 'ABC-12345.dev.drupal8',
          'secret_key' => 'secret_key',
          'product_policies' => ['salt' => 'salt'],
          'host' => 'example.com',
        ],
      ]);
      $stream = $this->prophesize(StreamInterface::class);
      $stream->getSize()->willReturn(1000);
      $stream->read(1000)->willReturn($json);

      $response = $this->prophesize(ResponseInterface::class);
      $response->getStatusCode()->willReturn(200);
      $response->getBody()->willReturn($stream);

      $this->guzzleClient = $this->prophesize(Client::class);
      $this->guzzleClient->get(Argument::type('string'), Argument::any())
        ->willReturn($response);
      $this->guzzleClient->get(Argument::any(), Argument::any())->willReturn();

      $this->cache = $this->prophesize(CacheBackendInterface::class);

      // \Drupal::time().
      $time = $this->prophesize(Time::class);
      $time->getRequestTime()->willReturn(1234567000000);

      $module_handler = $this->prophesize(ModuleHandlerInterface::class);

      $container = new ContainerBuilder();
      $container->set('cache.default', $this->cache->reveal());
      $container->set('config.factory', $config_factory->reveal());
      $container->set('datetime.time', $time->reveal());
      $container->set('http_client', $this->guzzleClient->reveal());
      $container->set('module_handler', $module_handler->reveal());
      $container->set('site.path', 'sites/default');
      $container->set('state', $state->reveal());
      \Drupal::setContainer($container);

      $storage = new Storage();
      $storage->setApiHost('https://example.com');
      $storage->setApiKey('XXXXXXXXXXyyyyyyyyyyXXXXXXXXXXyyyyyyyyyy');
      $storage->setIdentifier('ABC-12345');
      $uuid = new Php();
      $storage->setUuid($uuid->generate());

      $this->command = new AcquiaSearchSolrCommands($this->cache->reveal());
      $this->output = $this->prophesize(OutputInterface::class);
      $this->command->setOutput($this->output->reveal());

    }

    /**
     * @covers ::searchSolrCoresList
     */
    public function testSearchSolrCoresList() {

      $available_cores = ['ABC-12345.prod.default', 'ABC-12345.dev.drupal8'];

      $this->output->writeln(print_r($available_cores, TRUE))
        ->shouldBeCalledTimes(3);
      $this->output->writeln(Json::encode($available_cores))
        ->shouldBeCalledOnce();
      $this->output->writeln(var_export($available_cores, TRUE))
        ->shouldBeCalledTimes(2);
      $this->output->reveal();

      $this->command->searchSolrCoresList();
      $this->command->searchSolrCoresList(['format' => 'print_r']);
      $this->command->searchSolrCoresList(['format' => 'non-existing']);

      $this->command->searchSolrCoresList(['format' => 'json']);

      $this->command->searchSolrCoresList(['format' => 'var_dump']);
      $this->command->searchSolrCoresList(['format' => 'var_export']);

    }

    /**
     * @covers ::searchSolrResetCoresCache
     */
    public function testSearchSolrResetCoresCache() {

      $this->output->writeln('Cache is empty for ABCD-12345')
        ->shouldBeCalledOnce();
      $this->output->writeln('Cache is empty for ABCDE-123456')
        ->shouldBeCalledOnce();
      $this->output->writeln('Cache cleared for WXYZ-12345')
        ->shouldBeCalledOnce();
      $this->output->writeln('Cache cleared for WXYZ-123456')
        ->shouldBeCalledOnce();
      $this->output->reveal();

      $this->cache->get('acquia_search_solr.indexes.ABCD-12345')
        ->willReturn()
        ->shouldBeCalledOnce();
      $this->cache->get('acquia_search_solr.indexes.ABCDE-123456')
        ->willReturn()
        ->shouldBeCalledOnce();
      $this->cache->get('acquia_search_solr.indexes.WXYZ-12345')
        ->willReturn(TRUE)
        ->shouldBeCalledOnce();
      $this->cache->delete('acquia_search_solr.indexes.WXYZ-12345')
        ->shouldBeCalledOnce();
      $this->cache->get('acquia_search_solr.indexes.WXYZ-123456')
        ->willReturn(TRUE)
        ->shouldBeCalledOnce();
      $this->cache->delete('acquia_search_solr.indexes.WXYZ-123456')
        ->shouldBeCalledOnce();
      $this->cache->reveal();

      try {
        $this->command->searchSolrResetCoresCache();
        $this->fail('No exception');
      }
      catch (\Exception $exception) {
        $this->assertEquals('Provide a valid Acquia subscription identifier', $exception->getMessage());
      }

      try {
        $this->command->searchSolrResetCoresCache(['id' => 'ABC-12345']);
        $this->fail('No exception');
      }
      catch (\Exception $exception) {
        $this->assertEquals('Provide a valid Acquia subscription identifier', $exception->getMessage());
      }

      try {
        $this->command->searchSolrResetCoresCache(['id' => 'ABCD-12345']);
      }
      catch (\Exception $exception) {
        $this->fail('Unexpected exception: ' . $exception->getMessage());
      }

      try {
        $this->command->searchSolrResetCoresCache(['id' => 'ABCDE-123456']);
      }
      catch (\Exception $exception) {
        $this->fail('Unexpected exception: ' . $exception->getMessage());
      }

      try {
        $this->command->searchSolrResetCoresCache(['id' => 'ABCDEF-123456']);
        $this->fail('No exception');
      }
      catch (\Exception $exception) {
        $this->assertEquals('Provide a valid Acquia subscription identifier', $exception->getMessage());
      }

      try {
        $this->command->searchSolrResetCoresCache(['id' => 'ABCD-1234567']);
        $this->fail('No exception');
      }
      catch (\Exception $exception) {
        $this->assertEquals('Provide a valid Acquia subscription identifier', $exception->getMessage());
      }

      $this->command->searchSolrResetCoresCache(['id' => 'WXYZ-12345']);
      $this->command->searchSolrResetCoresCache(['id' => 'WXYZ-123456']);

    }

    /**
     * @covers ::searchSolrCoresPossible
     */
    public function testSearchSolrCoresPossible() {

      try {
        $this->command->searchSolrCoresPossible();
        $this->fail('No exception');
      }
      catch (\Exception $exception) {
        $this->assertEquals('No possible cores', $exception->getMessage());
      }

      $_ENV['AH_SITE_ENVIRONMENT'] = 'dev';

      $possible_cores = ['ABC-12345.dev.default'];

      $this->output->writeln(print_r($possible_cores, TRUE))
        ->shouldBeCalledTimes(3);
      $this->output->writeln(Json::encode($possible_cores))
        ->shouldBeCalledOnce();
      $this->output->writeln(var_export($possible_cores, TRUE))
        ->shouldBeCalledTimes(2);
      $this->output->reveal();

      $this->command->searchSolrCoresPossible();
      $this->command->searchSolrCoresPossible(['format' => 'print_r']);
      $this->command->searchSolrCoresPossible(['format' => 'non-existing']);

      $this->command->searchSolrCoresPossible(['format' => 'json']);

      $this->command->searchSolrCoresPossible(['format' => 'var_dump']);
      $this->command->searchSolrCoresPossible(['format' => 'var_export']);

      unset($_ENV['AH_SITE_ENVIRONMENT']);

    }

    /**
     * @covers ::searchSolrCoresPreferred
     */
    public function testSearchSolrCoresPreferred() {

      try {
        $this->command->searchSolrCoresPreferred();
        $this->fail('No exception');
      }
      catch (\Exception $exception) {
        $this->assertEquals('No preferred search core available', $exception->getMessage());
      }

      $_ENV['AH_SITE_ENVIRONMENT'] = 'prod';
      $this->output->writeln('ABC-12345.prod.default')->shouldBeCalledTimes(1);

      $this->command->searchSolrCoresPreferred();

      unset($_ENV['AH_SITE_ENVIRONMENT']);

    }

  }

}

namespace {

  if (!function_exists('dt')) {

    /**
     * Helper function to test Helper\Storage::getVersion.
     *
     * Rudimentary translation system, akin to Drupal's t() function.
     *
     * @param string $message
     *   String to process, possibly with replacement item.
     * @param array $replace
     *   An associative array of replacement items.
     *
     * @return string
     *   The processed string.
     */
    function dt($message, array $replace) {
      return strtr($message, $replace);
    }

  }

}

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

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