Skip to content

Commit a3e6151

Browse files
committed
Use factory to create criteria on collection
Also move the responsibility of parse array as filters to the factory.
1 parent e53ca7c commit a3e6151

File tree

6 files changed

+78
-46
lines changed

6 files changed

+78
-46
lines changed

src/Collection.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,7 @@ public function record($record = null)
2424

2525
public function criteria($criteria = null)
2626
{
27-
if (! $criteria instanceof Criteria) {
28-
$filters = (array) $criteria;
29-
$criteria = new Criteria($filters);
30-
}
31-
32-
return $criteria;
27+
return $this->factory->criteria($criteria);
3328
}
3429

3530
public function count()

src/Criteria.php

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,6 @@ class Criteria implements Countable, Filter
1616
protected $currentIndex = null;
1717
protected $filters = array();
1818

19-
public function __construct(array $filters = array())
20-
{
21-
foreach ($filters as $index => $value) {
22-
if ($value instanceof Filter) {
23-
$this->addFilter($index, $value);
24-
continue;
25-
}
26-
27-
$this->addFilter($index, new EqualTo($value));
28-
}
29-
}
30-
3119
public function getFilters()
3220
{
3321
return $this->filters;

src/Factory.php

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

33
namespace PHPFluent\ArrayStorage;
44

5+
use PHPFluent\ArrayStorage\Filter\Filter;
6+
use PHPFluent\ArrayStorage\Filter\EqualTo;
7+
58
class Factory
69
{
710
public function collection($collection = null)
@@ -22,4 +25,22 @@ public function record($record = null)
2225

2326
return $record;
2427
}
28+
29+
public function criteria($criteria = null)
30+
{
31+
if (! $criteria instanceof Criteria) {
32+
$filters = (array) $criteria;
33+
$criteria = new Criteria();
34+
foreach ($filters as $key => $value) {
35+
if ($value instanceof Filter) {
36+
$criteria->addFilter($key, $value);
37+
continue;
38+
}
39+
40+
$criteria->addFilter($key, new EqualTo($value));
41+
}
42+
}
43+
44+
return $criteria;
45+
}
2546
}

tests/CollectionTest.php

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,27 @@ public function testShouldUseFactoryToCreateRecords()
3636
$this->assertSame($record, $collection->record($data));
3737
}
3838

39-
public function testShouldCreateNewCriteria()
39+
public function testShouldUseFactoryToCreateCriteria()
4040
{
41-
$collection = new Collection(new Factory());
42-
$criteria = $collection->criteria();
41+
$factory = $this
42+
->getMockBuilder('PHPFluent\\ArrayStorage\\Factory')
43+
->disableOriginalConstructor()
44+
->getMock();
45+
46+
$filters = array('foo' => $this->getMock('PHPFluent\\ArrayStorage\\Filter\\Filter'));
47+
48+
$criteria = new Criteria();
49+
$criteria->addFilter('foo', $filters['foo']);
50+
51+
$factory
52+
->expects($this->once())
53+
->method('criteria')
54+
->with($filters)
55+
->will($this->returnValue($criteria));
56+
57+
$collection = new Collection($factory);
4358

44-
$this->assertInstanceOf(__NAMESPACE__ . '\\Criteria', $criteria);
59+
$this->assertSame($criteria, $collection->criteria($filters));
4560
}
4661

4762
public function testShouldCountRecordsInCollection()

tests/CriteriaTest.php

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,30 +20,6 @@ public function testShouldAddFilter()
2020
$this->assertCount(1, $criteria);
2121
}
2222

23-
public function testShouldAcceptFiltersOnConstructor()
24-
{
25-
$filters = array(
26-
'foo' => $this->filter(),
27-
'bar' => $this->filter(),
28-
);
29-
$criteria = new Criteria($filters);
30-
31-
$this->assertCount(2, $criteria);
32-
}
33-
34-
public function testShouldAcceptFiltersAsKeyValueOnConstructor()
35-
{
36-
$filters = array(
37-
'foo' => true,
38-
);
39-
$criteria = new Criteria($filters);
40-
$filters = $criteria->getFilters();
41-
list($index, $filter) = $filters[0];
42-
43-
$this->assertEquals('foo', $index);
44-
$this->assertInstanceOf('PHPFluent\\ArrayStorage\\Filter\\EqualTo', $filter);
45-
}
46-
4723
public function testShouldReturnSelfWhenGettingANonExistentProperty()
4824
{
4925
$criteria = new Criteria();

tests/FactoryTest.php

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

33
namespace PHPFluent\ArrayStorage;
44

5+
use PHPFluent\ArrayStorage\Filter\EqualTo;
6+
57
/**
68
* @covers PHPFluent\ArrayStorage\Factory
79
*/
@@ -60,4 +62,39 @@ public function testShouldReturnTheSameInstanceWhenDataIsAlreadyARecordInstance(
6062

6163
$this->assertSame($data, $record);
6264
}
65+
66+
public function testShouldCreateACriteria()
67+
{
68+
$factory = new Factory();
69+
$criteria = $factory->criteria();
70+
71+
$this->assertInstanceOf(__NAMESPACE__ . '\\Criteria', $criteria);
72+
}
73+
74+
public function testShouldCreateACriteriaFromAKeyValueArrayOfFilters()
75+
{
76+
$inputFilters = array(
77+
'foo' => $this->getMock(__NAMESPACE__ . '\\Filter\\Filter'),
78+
);
79+
$factory = new Factory();
80+
$criteria = $factory->criteria($inputFilters);
81+
$actualFilters = $criteria->getFilters();
82+
83+
$this->assertEquals('foo', $actualFilters[0][0]);
84+
$this->assertSame($inputFilters['foo'], $actualFilters[0][1]);
85+
}
86+
87+
public function testShouldCreateACriteriaFromAKeyValueArrayOfNonFilters()
88+
{
89+
$inputFilters = array(
90+
'foo' => true,
91+
);
92+
$factory = new Factory();
93+
$criteria = $factory->criteria($inputFilters);
94+
$actualFilters = $criteria->getFilters();
95+
$expectedFilter = new EqualTo($inputFilters['foo']);
96+
97+
$this->assertEquals('foo', $actualFilters[0][0]);
98+
$this->assertEquals($expectedFilter, $actualFilters[0][1]);
99+
}
63100
}

0 commit comments

Comments
 (0)