Skip to content

Commit 88bb54f

Browse files
committed
Added EncapsulatedOptions to ProviderResource::fetch() and updated tests.
1 parent 85613f0 commit 88bb54f

File tree

6 files changed

+103
-13
lines changed

6 files changed

+103
-13
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ php:
99
- 5.5
1010
- 5.6
1111
- 7.0
12+
- 7.1
1213

1314
install:
1415
- alias composer=composer\ -n && composer selfupdate

composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
],
1010
"license": "LGPL-3.0",
1111
"require": {
12-
"php": ">=5.5",
13-
"scriptfusion/mapper": "^1|^0",
12+
"php": "^5.5|^7",
13+
"scriptfusion/mapper": "^1",
1414
"scriptfusion/static-class": "^1",
1515
"scriptfusion/retry-error-handlers": "^1",
1616
"psr/cache": "^1",

src/Provider/AbstractProvider.php

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,21 @@
44
use ScriptFUSION\Porter\Cache\CacheToggle;
55
use ScriptFUSION\Porter\Cache\CacheUnavailableException;
66
use ScriptFUSION\Porter\Connector\Connector;
7+
use ScriptFUSION\Porter\Options\EncapsulatedOptions;
78
use ScriptFUSION\Porter\Provider\Resource\ProviderResource;
89

910
abstract class AbstractProvider implements Provider, CacheToggle
1011
{
12+
/**
13+
* @var Connector
14+
*/
1115
private $connector;
1216

17+
/**
18+
* @var EncapsulatedOptions|null
19+
*/
20+
private $options;
21+
1322
public function __construct(Connector $connector)
1423
{
1524
$this->connector = $connector;
@@ -31,7 +40,7 @@ public function fetch(ProviderResource $resource)
3140
));
3241
}
3342

34-
return $resource->fetch($this->connector);
43+
return $resource->fetch($this->connector, $this->options ? clone $this->options : null);
3544
}
3645

3746
/**
@@ -74,4 +83,24 @@ public function isCacheEnabled()
7483

7584
return $connector->isCacheEnabled();
7685
}
86+
87+
/**
88+
* Gets the provider options.
89+
*
90+
* @return EncapsulatedOptions|null
91+
*/
92+
protected function getOptions()
93+
{
94+
return $this->options;
95+
}
96+
97+
/**
98+
* Sets the provider options to the specified options.
99+
*
100+
* @param EncapsulatedOptions $options Options.
101+
*/
102+
protected function setOptions(EncapsulatedOptions $options)
103+
{
104+
$this->options = $options;
105+
}
77106
}

src/Provider/Resource/ProviderResource.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
namespace ScriptFUSION\Porter\Provider\Resource;
33

44
use ScriptFUSION\Porter\Connector\Connector;
5+
use ScriptFUSION\Porter\Options\EncapsulatedOptions;
56

67
/**
78
* Defines methods for fetching data from a specific provider resource.
@@ -27,8 +28,9 @@ public function getProviderTag();
2728
* presents its data as an enumerable series.
2829
*
2930
* @param Connector $connector Connector.
31+
* @param EncapsulatedOptions $options Optional. Options.
3032
*
3133
* @return \Iterator Enumerable data series.
3234
*/
33-
public function fetch(Connector $connector);
35+
public function fetch(Connector $connector, EncapsulatedOptions $options = null);
3436
}

test/MockFactory.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,12 @@ public static function mockImportSpecification(ProviderResource $resource = null
2323
*/
2424
public static function mockResource(Provider $provider)
2525
{
26-
return \Mockery::spy(ProviderResource::class)
26+
return \Mockery::mock(ProviderResource::class)
2727
->shouldReceive('getProviderClassName')
2828
->andReturn(get_class($provider))
29+
->shouldReceive('getProviderTag')
30+
->andReturn(null)
31+
->byDefault()
2932
->getMock();
3033
}
3134
}

test/Unit/Porter/Provider/AbstractProviderTest.php

Lines changed: 63 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,24 @@
66
use ScriptFUSION\Porter\Cache\CacheUnavailableException;
77
use ScriptFUSION\Porter\Connector\CachingConnector;
88
use ScriptFUSION\Porter\Connector\Connector;
9+
use ScriptFUSION\Porter\Options\EncapsulatedOptions;
910
use ScriptFUSION\Porter\Provider\AbstractProvider;
1011
use ScriptFUSION\Porter\Provider\ForeignResourceException;
1112
use ScriptFUSION\Porter\Provider\Resource\ProviderResource;
13+
use ScriptFUSIONTest\MockFactory;
1214

1315
final class AbstractProviderTest extends \PHPUnit_Framework_TestCase
1416
{
1517
use MockeryPHPUnitIntegration;
1618

17-
/** @var AbstractProvider */
19+
/**
20+
* @var AbstractProvider
21+
*/
1822
private $provider;
1923

20-
/** @var MockInterface */
24+
/**
25+
* @var MockInterface|Connector
26+
*/
2127
private $connector;
2228

2329
protected function setUp()
@@ -40,23 +46,41 @@ private function setupCachingConnector()
4046
return $connector;
4147
}
4248

43-
public function testFetch()
49+
public function testFetchWithoutOptions()
4450
{
4551
self::assertSame(
4652
'foo',
4753
$this->provider->fetch(
48-
\Mockery::mock(ProviderResource::class)
54+
MockFactory::mockResource($this->provider)
4955
->shouldReceive('fetch')
50-
->with($this->connector)
56+
->with($this->connector, null)
5157
->andReturn('foo')
5258
->getMock()
53-
->shouldReceive('getProviderClassName')
54-
->andReturn(get_class($this->provider))
55-
->getMock()
5659
)
5760
);
5861
}
5962

63+
/**
64+
* Tests that a clone of the provider's options are passed to ProviderResource::fetch().
65+
*/
66+
public function testFetchWithOptions()
67+
{
68+
$this->setOptions($options = \Mockery::mock(EncapsulatedOptions::class));
69+
70+
$this->provider->fetch(
71+
MockFactory::mockResource($this->provider)
72+
->shouldReceive('fetch')
73+
->with($this->connector, \Mockery::on(
74+
function (EncapsulatedOptions $argument) use ($options) {
75+
self::assertNotSame($options, $argument);
76+
77+
return get_class($options) === get_class($argument);
78+
}
79+
))
80+
->getMock()
81+
);
82+
}
83+
6084
public function testFetchForeignProvider()
6185
{
6286
$this->setExpectedException(ForeignResourceException::class);
@@ -114,4 +138,35 @@ public function testCacheEnabledMirrorsCachingConnector()
114138
self::assertTrue($this->provider->isCacheEnabled());
115139
self::assertFalse($this->provider->isCacheEnabled());
116140
}
141+
142+
public function testOptions()
143+
{
144+
$this->setOptions($options = \Mockery::mock(EncapsulatedOptions::class));
145+
146+
self::assertSame($options, $this->getOptions());
147+
}
148+
149+
private function getOptions()
150+
{
151+
return call_user_func(
152+
\Closure::bind(
153+
function () {
154+
return $this->getOptions();
155+
},
156+
$this->provider
157+
)
158+
);
159+
}
160+
161+
private function setOptions(EncapsulatedOptions $options)
162+
{
163+
call_user_func(
164+
\Closure::bind(
165+
function () use ($options) {
166+
$this->setOptions($options);
167+
},
168+
$this->provider
169+
)
170+
);
171+
}
117172
}

0 commit comments

Comments
 (0)