Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
f477c67
Added shouldNotInstantiateWithoutConfigArray test
Nov 24, 2015
7d1f4ca
Added test shouldNotInstantiateWithoutHostsArrayInConfigArray
Nov 24, 2015
c865896
Extracted setUp and tairDown methods
Nov 24, 2015
75947d6
Added ability to inject client (needed for testing)
Nov 24, 2015
b77ad9b
Added tests for initialise and seeItemExistsInElasticsearchShouldPass…
Nov 24, 2015
7aab601
Extracted class level client
Nov 24, 2015
58d8536
Added test seeItemExistsInElasticsearchShouldPassTypeToClient
Nov 24, 2015
925472a
Added seeItemExistsInElasticsearchShouldPassIdToClient
Nov 24, 2015
1f95bb7
Renamed seeItemExistsInElasticsearchShouldCallExistsWithIndexNameOnCl…
Nov 24, 2015
cbf4519
Renamed seeItemExistsInElasticsearchShouldCallExistsWithTypeOnClient
Nov 24, 2015
3309832
Renamed seeItemExistsInElasticsearchShouldCallExistsWithIdOnClient
Nov 24, 2015
5ba074f
Extracted class level module for happy path tests
Nov 24, 2015
17846d5
Added test grabAnItemFromElasticsearchShouldCallSearchWithIndexOnClient
Nov 24, 2015
a4624db
Added test grabAnItemFromElasticsearchShouldCallSearchWithTypeOnClient
Nov 24, 2015
f30ec0d
Added test grabAnItemFromElasticsearchShouldCallSearchWithQueryString…
Nov 24, 2015
3a8d2fa
Added test grabAnItemFromElasticsearchShouldCallSearchWithSizeOneOnCl…
Nov 24, 2015
0845964
Added grabAnItemFromElasticsearchShouldReturnEmptyArrayIfThereAreNoHits
Nov 24, 2015
89bc996
Marked dangerous test with fixme
Nov 24, 2015
68924c0
Added test grabAnItemFromElasticsearchShouldReturnFirstSourceArrayIfT…
Nov 24, 2015
36614c3
Added tests and exposed getHosts to let us get 100% test coverage on …
Nov 24, 2015
eabc09f
Removed noisy comment
Nov 24, 2015
626417a
Extracted configureModuleWithSettingsInArray
Nov 24, 2015
c550da9
Extracted setElasticSearchClientIfInjected
Nov 24, 2015
43bd45b
Extracted class level constructorConfiguration
Nov 24, 2015
b0514f9
Got rid of unneeded exta configuration array
Nov 24, 2015
2d39178
Extracted wrapConfiguredHostsInArrayIfNeeded
Nov 24, 2015
aedd6f9
Renamed guardThatConfigurationHasHosts
Nov 24, 2015
76c8ae2
Inlined configureModuleWithSettingsInArray
Nov 24, 2015
762385d
Extracted sanitizeModuleConfiguration
Nov 24, 2015
c346035
Rearranged code
Nov 24, 2015
35f99af
Extracted buildElasticSearchClientIfNotInjected
Nov 24, 2015
8313695
Rearranged code
Nov 24, 2015
3705507
Extracted isEmptyResult
Nov 24, 2015
8fc6a22
Extracted isEmptyResult
Nov 24, 2015
9d3bfac
Extracted getFirstItemFromResult
Nov 24, 2015
2e2bc6e
Rearranged code
Nov 24, 2015
a596936
Inlined buildElasticSearchClientIfNotInjected
Nov 24, 2015
2dd2816
Extracted doesNotHaveElasticSearchClient
Nov 24, 2015
39261b6
Extracted buildElasticSearchClient
Nov 24, 2015
b68912e
Renamed and cleaned up setElasticSearchClient
Nov 24, 2015
36e04a6
Rearranged code
Nov 24, 2015
7d979dd
Extracted ElasticSearchConfigurationTest and ElasticSearchTestCase
Nov 24, 2015
371388c
Moved initialize test
Nov 24, 2015
bb3af04
Extracted ElasticSearch_seeItemExistsInElasticsearchTest
Nov 24, 2015
f5cca8c
Extracted ElasticSearch_grabAnItemFromElasticsearchTest
Nov 24, 2015
2782555
Create Elastic Search index
Nov 24, 2015
af652b1
Extracted setUp function
Nov 24, 2015
8f7acab
Renamed ElasticSearchIndexManagementTest
Nov 24, 2015
dbed8b1
Moved some instrumentation to setup
Nov 24, 2015
702cde0
Renamed createIndexInElasticsearchShouldCallCreateOnClientIndicesWith…
Nov 24, 2015
ecef712
Delete index in ElasticSearch
Nov 24, 2015
8fb1c82
See if index exists
Nov 24, 2015
a19aa61
Check that index does not exist in ElasticSearch
Nov 24, 2015
7fd2909
Fixed composer requires to enforce right version of codeception
Nov 24, 2015
79139dc
Index an item in ElasticSearch
Nov 24, 2015
94c366e
Improved spelling
Nov 24, 2015
c5f64ba
Fixed name in composer.json to enable VCS repository override in depe…
Nov 24, 2015
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,24 @@
{
"name": "Jan Wyszynski",
"email": "jan.wyszynki@gmail.com"
},
{
"name": "Willem Viljoen",
"email": "willemnviljoen@gmail.com"
}
],
"require": {
"elasticsearch/elasticsearch": "~1.0"
"elasticsearch/elasticsearch": "~1.0",
"codeception/codeception": "^2.1"
},
"require-dev": {
"phpunit/phpunit": "~4.8",
"mockery/mockery": "~0.9"
},
"autoload": {
"psr-4": {
"Codeception\\Module\\": "src"
"Codeception\\Module\\": "src",
"Tests\\Codeception\\Module\\": "tests"
}
}
}
138 changes: 118 additions & 20 deletions src/ElasticSearch.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,38 +5,79 @@

namespace Codeception\Module;

use Codeception\Lib\ModuleContainer;
use Codeception\Module;
use Elasticsearch\Client;

class ElasticSearch extends Module
{
/** @var \Elasticsearch\Client */
private $elasticSearch;
/**
* @var Client
*/
private $elasticSearch = null;

public function __construct($config = null)
public function __construct(ModuleContainer $moduleContainer, $config = null, Client $client = null)
{
// terminology: see = isXyz => true/false, have = create, grab = get => data
$this->setModuleConfiguration($config);
$this->sanitizeModuleConfiguration();
$this->setElasticSearchClient($client);

parent::__construct($moduleContainer);
}

if (!isset($config['hosts'])) {
/**
* @param $config
*/
private function setModuleConfiguration($config)
{
$this->config = $config;
}

private function sanitizeModuleConfiguration()
{
$this->guardThatConfigurationHasHosts();
$this->wrapConfiguredHostsInArrayIfNeeded();
}

private function guardThatConfigurationHasHosts()
{
if (!isset($this->config['hosts'])) {
throw new \Exception('please configure hosts for ElasticSearch codeception module');
}
}

if (isset($config['hosts']) && !is_array($config['hosts'])) {
$config['hosts'] = array($config['hosts']);
private function wrapConfiguredHostsInArrayIfNeeded()
{
if (!is_array($this->config['hosts'])) {
$this->config['hosts'] = array($this->config['hosts']);
}
$this->config = (array)$config;
}

parent::__construct();
/**
* @param Client $client
*/
private function setElasticSearchClient($client)
{
$this->elasticSearch = $client;
}

public function _initialize()
{
/*
* elastic search config
* hosts - array of ES hosts
* dic - ES dictionary
*/
if ($this->doesNotHaveElasticSearchClient()) {
$this->buildElasticSearchClient();
}
}

/**
* @return bool
*/
private function doesNotHaveElasticSearchClient()
{
return is_null($this->elasticSearch);
}

private function buildElasticSearchClient()
{
$this->elasticSearch = new Client($this->config);
}

Expand All @@ -49,7 +90,7 @@ public function _initialize()
*
* @return array
*/
public function seeItemExistsInElasticsearch($index, $type, $id)
public function seeItemExistsInElasticSearch($index, $type, $id)
{
return $this->elasticSearch->exists(
[
Expand All @@ -60,7 +101,6 @@ public function seeItemExistsInElasticsearch($index, $type, $id)
);
}


/**
* grab an item from search index
*
Expand All @@ -70,7 +110,7 @@ public function seeItemExistsInElasticsearch($index, $type, $id)
*
* @return array
*/
public function grabAnItemFromElasticsearch($index = null, $type = null, $queryString = '*')
public function grabAnItemFromElasticSearch($index = null, $type = null, $queryString = '*')
{
$result = $this->elasticSearch->search(
[
Expand All @@ -81,10 +121,68 @@ public function grabAnItemFromElasticsearch($index = null, $type = null, $queryS
]
);

return !empty($result['hits']['hits'])
? $result['hits']['hits'][0]['_source']
: array();
if ($this->isEmptyResult($result)) {
return array();
}

return $this->getFirstItemFromResult($result);
}

/**
* @param $result
* @return bool
*/
private function isEmptyResult($result)
{
return empty($result['hits']['hits']);
}

/**
* @param $result
* @return mixed
*/
private function getFirstItemFromResult($result)
{
return $result['hits']['hits'][0]['_source'];
}

public function getHosts()
{
return $this->config['hosts'];
}

public function createIndexInElasticSearch($indexName)
{
$this->elasticSearch->indices()->create(['index' => $indexName]);
}

public function deleteIndexInElasticSearch($indexName)
{
$this->elasticSearch->indices()->delete(['index' => $indexName]);
}

public function seeIndexExistsInElasticSearch($indexName)
{
$this->assertTrue($this->elasticSearch->indices()->exists(['index' => $indexName]));
}

public function dontSeeIndexExistsInElasticSearch($indexName)
{
$this->assertFalse($this->elasticSearch->indices()->exists(['index' => $indexName]));
}

public function indexAnItemInElasticSearch($indexName, $documentType, $documentBody, $id = null)
{
$params = [
'index' => $indexName,
'type' => $documentType,
'body' => $documentBody
];

if (!is_null($id)) {
$params['id'] = $id;
}

$this->elasticSearch->index($params);
}
}
47 changes: 47 additions & 0 deletions tests/ElasticSearchConfigurationTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

namespace Tests\Codeception\Module;

use Codeception\Module\ElasticSearch;

/**
* Created by PhpStorm.
* User: willemv
* Date: 2015/11/24
* Time: 14:10
*/
class ElasticSearchConfigurationTest extends ElasticSearchTestCase
{
/**
* @test
* @expectedException \Exception
* @expectedExceptionMessage please configure hosts for ElasticSearch codeception module
*/
public function shouldNotInstantiateWithoutConfigArray()
{
new ElasticSearch($this->container, null);
}

/**
* @test
*/
public function shouldEncapsulateHostsInArrayIfNotEncapsulated()
{
$module = new ElasticSearch($this->container, ['hosts' => 'test.host.com']);
$hosts = $module->getHosts();
$this->assertEquals('test.host.com', $hosts[0]);
}

/**
* @test
* @expectedException \Exception
* @expectedExceptionMessage Could not resolve host: test.3.1415.nonexistent-host.com
* @fixme Find a way to test this without having to rely on an exception from across the boundary
*/
public function initializeShouldCreateClientWithConfiguredHostsIfNoClientIsPassedToConstructor()
{
$module = new ElasticSearch($this->container, ['hosts' => ['test.3.1415.nonexistent-host.com']]);
$module->_initialize();
$module->seeItemExistsInElasticsearch('any-indexname', 'any-type', 'any-id');
}
}
94 changes: 94 additions & 0 deletions tests/ElasticSearchIndexManagementTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<?php
/**
* Created by PhpStorm.
* User: willemv
* Date: 2015/11/24
* Time: 14:19
*/

namespace Tests\Codeception\Module;


use Elasticsearch\Namespaces\IndicesNamespace;
use Mockery as m;

class ElasticSearchIndexManagementTest extends ElasticSearchTestCase
{
/** @var IndicesNamespace | m\Mock */
private $indicesNamespace;

/**
* @test
*/
public function createIndexInElasticsearchShouldCallCreateOnClientIndicesWithIndexName()
{
$this->module->createIndexInElasticsearch('index-name');
$this->indicesNamespace->shouldHaveReceived('create')->with(m::subset(['index' => 'index-name']));
}

/**
* @test
*/
public function deleteIndexInElasticsearchShouldCallDeleteOnClientIndicesWithIndexName()
{
$this->module->deleteIndexInElasticsearch('index-name');
$this->indicesNamespace->shouldHaveReceived('delete')->with(m::subset(['index' => 'index-name']));
}

/**
* @test
*/
public function seeIndexExistsInElasticsearchShouldCallExistsOnClientIndicesWithIndexName()
{
$this->module->seeIndexExistsInElasticsearch('index-name');
$this->indicesNamespace->shouldHaveReceived('exists')->with(m::subset(['index' => 'index-name']));
}

/**
* @test
*/
public function seeIndexExistsInElasticsearchShouldDoNothingIfIndexExists()
{
$this->indicesNamespace->shouldReceive('exists')->andReturn(true);
$this->module->seeIndexExistsInElasticsearch('index-name');
}

/**
* @test
* @expectedException \PHPUnit_Framework_ExpectationFailedException
*/
public function seeIndexExistsInElasticsearchShouldHaveFailingAssertionIfIndexDoesNot()
{
$this->indicesNamespace->shouldReceive('exists')->andReturn(false);
$this->module->seeIndexExistsInElasticsearch('index-name');
}

/**
* @test
*/
public function dontSeeIndexExistsInElasticsearchShouldDoNothingIfIndexDoesNotExist()
{
$this->indicesNamespace->shouldReceive('exists')->andReturn(false);
$this->module->dontSeeIndexExistsInElasticsearch('index-name');
}

/**
* @test
* @expectedException \PHPUnit_Framework_ExpectationFailedException
*/
public function dontSeeIndexExistsInElasticsearchShouldHaveFailingAssertionIfIndexExists()
{
$this->indicesNamespace->shouldReceive('exists')->andReturn(true);
$this->module->dontSeeIndexExistsInElasticsearch('index-name');
}

public function setUp()
{
parent::setUp();

$this->indicesNamespace = m::mock('\Elasticsearch\Namespaces\IndicesNamespace');
$this->indicesNamespace->shouldReceive('exists')->andReturn(true)->byDefault();
$this->indicesNamespace->shouldIgnoreMissing();
$this->client->shouldReceive('indices')->andReturn($this->indicesNamespace)->byDefault();
}
}
Loading