Skip to content

Commit 9a813c9

Browse files
author
Malte Riesch
committed
fixed issue #10
1 parent 05e34de commit 9a813c9

File tree

8 files changed

+128
-12
lines changed

8 files changed

+128
-12
lines changed

lib/TestDbAcle/Commands/FilterTableStateByPsvCommand.php

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,45 @@
11
<?php
22
namespace TestDbAcle\Commands;
33

4+
use TestDbAcle\Db\AbstractPdoFacade;
5+
use TestDbAcle\Db\AbstractTableFactory;
6+
use TestDbAcle\Db\Mysql\Pdo\PdoFacade;
7+
use TestDbAcle\Db\TableList;
8+
use TestDbAcle\Filter\FilterQueue;
9+
use TestDbAcle\Psv\PsvParser;
10+
use TestDbAcle\Psv\Table\Table;
11+
412
/**
513
* @TODO this is currently covered only by the functional tests.
614
*/
715
class FilterTableStateByPsvCommand implements CommandInterface
816
{
17+
/**
18+
* @var PsvParser $parser
19+
*/
920
protected $parser;
21+
22+
/**
23+
* @var FilterQueue $filterQueue
24+
*/
1025
protected $filterQueue;
26+
27+
/**
28+
* @var TableList
29+
*/
1130
protected $tableList;
31+
32+
/** @var AbstractPdoFacade */
1233
protected $pdoFacade;
34+
35+
/**
36+
* @var AbstractTableFactory $tableFactory
37+
*/
1338
protected $tableFactory;
14-
39+
40+
/**
41+
* @var array $placeHolders
42+
*/
1543
protected $placeHolders;
1644
protected $sourcePsv;
1745

@@ -36,7 +64,9 @@ public function execute()
3664
$this->tableFactory->populateTableList(array_keys($filteredParsedTree->getTables()),$this->tableList);
3765

3866
foreach($filteredParsedTree->getTables() as $table){
67+
/** @var Table $table */
3968
$tableName = $table->getName();
69+
4070
$expectedData[$tableName]=$table->toArray();
4171

4272
if(isset($expectedData[$tableName][0])) {

lib/TestDbAcle/Commands/SetupTablesCommand.php

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,40 @@
11
<?php
22
namespace TestDbAcle\Commands;
3+
4+
use TestDbAcle\Db\AbstractTableFactory;
5+
use TestDbAcle\Db\DataInserter\DataInserter;
6+
use TestDbAcle\Db\TableList;
7+
use TestDbAcle\Filter\FilterQueue;
8+
use TestDbAcle\Psv\PsvParser;
9+
310
/**
411
* @TODO this is currently covered only by the functional tests.
512
*/
613
class SetupTablesCommand implements CommandInterface
714
{
15+
/**
16+
* @var PsvParser
17+
*/
818
protected $parser;
19+
20+
/**
21+
* @var DataInserter
22+
*/
923
protected $dataInserter;
24+
25+
/**
26+
* @var FilterQueue
27+
*/
1028
protected $filterQueue;
29+
30+
/**
31+
* @var TableList
32+
*/
1133
protected $tableList;
34+
35+
/**
36+
* @var AbstractTableFactory
37+
*/
1238
protected $tableFactory;
1339

1440
protected $placeHolders;
@@ -25,7 +51,7 @@ public function execute()
2551
{
2652
$parsedTree = $this->parser->parsePsvTree($this->sourcePsv);
2753
$this->tableFactory->populateTableList(array_keys($parsedTree->getTables()),$this->tableList);
28-
return $this->dataInserter->process($this->filterQueue->filterDataTree($parsedTree));
54+
$this->dataInserter->process($this->filterQueue->filterDataTree($parsedTree));
2955
}
3056

3157
public function initialise(\TestDbAcle\ServiceLocator $serviceLocator)

lib/TestDbAcle/Filter/AddDefaultValuesRowFilter.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
<?php
22
namespace TestDbAcle\Filter;
33

4-
class AddDefaultValuesRowFilter implements RowFilter {
4+
use TestDbAcle\Psv\Table\Table;
5+
6+
class AddDefaultValuesRowFilter extends AbstractRowFilter
7+
{
58

69
protected $tableList;
710

@@ -38,6 +41,11 @@ public function getDecorateWithNullPlaceHolders(array $tableRow)
3841

3942

4043
}
44+
45+
public function skip(Table $table)
46+
{
47+
return $table->getMeta()->isReplaceMode();
48+
}
4149

4250
}
4351

lib/TestDbAcle/Filter/FilterQueue.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace TestDbAcle\Filter;
44

5+
use TestDbAcle\Psv\Table\Table;
6+
57
class FilterQueue
68
{
79

@@ -20,18 +22,22 @@ function filterDataTree(\TestDbAcle\Psv\PsvTree $dataTree)
2022
return $dataTree;
2123
}
2224

23-
protected function filterTable(\TestDbAcle\Filter\RowFilter $filter, $table, array $tableData)
25+
protected function filterTable(\TestDbAcle\Filter\RowFilter $filter, Table $table)
2426
{
27+
$tableName = $table->getName();
28+
$tableData = $table->toArray();
2529
foreach ($tableData as $index => $tableRow) {
26-
$tableData[$index] = $filter->filter($table, $tableRow);
30+
if (!$filter->skip($table)) {
31+
$tableData[$index] = $filter->filter($tableName, $tableRow);
32+
}
2733
}
2834
return $tableData;
2935
}
3036

3137
protected function applyRowFilter($filter, \TestDbAcle\Psv\PsvTree $dataTree)
3238
{
3339
foreach ($dataTree->getTables() as $table) {
34-
$table->setData( $this->filterTable($filter, $table->getName(), $table->toArray()));
40+
$table->setData( $this->filterTable($filter, $table));
3541
}
3642
return $dataTree;
3743
}

lib/TestDbAcle/Filter/PlaceholderRowFilter.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
<?php
22
namespace TestDbAcle\Filter;
33

4-
class PlaceholderRowFilter implements RowFilter {
4+
class PlaceholderRowFilter extends AbstractRowFilter
5+
{
56

67
protected $replace;
78

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<?php
22

33
namespace TestDbAcle\Filter;
4+
use TestDbAcle\Psv\Table\Table;
5+
46
interface RowFilter{
57
public function filter($tableName, array $row);
8+
public function skip(Table $table);
69
}

tests/Functional/tests/Php5_3/SmokeTest.php

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,44 @@ function test_SetupAndAssertWithNullColumn()
245245
$countResult = $this->pdo->query("select count(*) n from address where address2 is NULL")->fetch(\PDO::FETCH_ASSOC);
246246
$this->assertEquals(1, $countResult['n']);
247247
}
248-
248+
249+
/**
250+
* @covers \TestDbAcle\Commands\FilterTableStateByPsvCommand::execute()
251+
* @covers \TestDbAcle\Commands\FilterTableStateByPsvCommand::FilterTableStateByPsvCommand() with placeholders
252+
* @covers \TestDbAcle\Commands\FilterTableStateByPsvCommand::SetAutoIncrementCommand()
253+
* @covers \TestDbAcle::getDefaultFactories()
254+
*
255+
* @link https://github.com/malteriesch/test-db-acle/issues/10
256+
*/
257+
258+
function test_Setup_Bug_ReplaceModeOverwritesNonNullColumns()
259+
{
260+
261+
$this->setupTables("
262+
[address]
263+
address_id |address1 |postcode
264+
1 |val 1 |foo1
265+
3 |val 2 |foo2
266+
1000 |val3 |foo3
267+
268+
");
269+
270+
$this->setupTables("
271+
[address|mode:replace;identifiedBy:address_id]
272+
address_id |address1
273+
3 |val 2 amended
274+
");
275+
276+
$this->assertTableStateContains("
277+
[address]
278+
address_id |address1 |postcode
279+
1 |val 1 |foo1
280+
3 |val 2 amended |foo2
281+
1000 |val3 |foo3
282+
283+
");
284+
}
285+
249286
/**
250287
* @covers \TestDbAcle\Commands\FilterTableStateByPsvCommand::execute()
251288
* @covers \TestDbAcle\Commands\FilterTableStateByPsvCommand::FilterTableStateByPsvCommand() with placeholders

tests/TestDbAcle/Filter/FilterQueueTest.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ function test_filterDataTree_withOneRowFilter()
3737

3838

3939
$mockRowFilter1 = \Mockery::mock('\TestDbAcle\Filter\RowFilter');
40+
41+
$mockRowFilter1->shouldReceive('skip')->andReturn(false);
4042

4143
$mockRowFilter1->shouldReceive('filter')->once()->with('user', array("user.row1"))->ordered()
4244
->andReturn(array('user.filtered_filter1_row1'));
@@ -84,11 +86,12 @@ function test_filterDataTree_withTwoRowFilters()
8486

8587
$dataTree->addTable(
8688
new \TestDbAcle\Psv\Table\Table('emptyTable'));
87-
88-
89-
89+
90+
9091
$mockRowFilter1 = \Mockery::mock('\TestDbAcle\Filter\RowFilter');
91-
92+
93+
$mockRowFilter1->shouldReceive('skip')->andReturn(false);
94+
9295
$mockRowFilter1->shouldReceive('filter')->once()->with('user', array("user.row1"))->ordered()
9396
->andReturn(array('user.filtered_filter1_row1'));
9497
$mockRowFilter1->shouldReceive('filter')->once()->with('user', array("user.row2"))->ordered()
@@ -101,6 +104,8 @@ function test_filterDataTree_withTwoRowFilters()
101104

102105
$mockRowFilter2 = \Mockery::mock('\TestDbAcle\Filter\RowFilter');
103106

107+
$mockRowFilter2->shouldReceive('skip')->andReturn(false);
108+
104109
$mockRowFilter2->shouldReceive('filter')->once()->with('user', array("user.filtered_filter1_row1"))->ordered()
105110
->andReturn(array('user.filtered_filter2_row1'));
106111
$mockRowFilter2->shouldReceive('filter')->once()->with('user', array("user.filtered_filter1_row2"))->ordered()

0 commit comments

Comments
 (0)