Skip to content

Commit

Permalink
Merge pull request #24 from courtney-miles/imprv/0/ObservableStages
Browse files Browse the repository at this point in the history
Make each stage observable.
  • Loading branch information
courtney-miles committed Sep 11, 2018
2 parents eba4a82 + 45dd785 commit f2ce5dc
Show file tree
Hide file tree
Showing 7 changed files with 133 additions and 12 deletions.
28 changes: 28 additions & 0 deletions src/Stage/AbstractStage.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php
/**
* Author: Courtney Miles
* Date: 6/09/18
* Time: 10:45 PM
*/

namespace MilesAsylum\Slurp\Stage;

abstract class AbstractStage implements StageInterface
{
/**
* @var StageObserverInterface[]
*/
protected $observers = [];

public function attachObserver(StageObserverInterface $observer)
{
$this->observers[spl_object_hash($observer)] = $observer;
}

protected function notify()
{
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
}
15 changes: 14 additions & 1 deletion src/Stage/LoadStage.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,18 @@
use MilesAsylum\Slurp\Load\LoaderInterface;
use MilesAsylum\Slurp\SlurpPayload;

class LoadStage implements StageInterface
class LoadStage extends AbstractStage
{
/**
* @var LoaderInterface
*/
private $loader;

/**
* @var SlurpPayload
*/
protected $payload;

public function __construct(LoaderInterface $loader)
{
$this->loader = $loader;
Expand All @@ -29,6 +34,14 @@ public function __invoke(SlurpPayload $payload): SlurpPayload
$this->loader->loadValues($payload->getValues());
}

$this->payload = $payload;
$this->notify();

return $payload;
}

public function getPayload(): SlurpPayload
{
return $this->payload;
}
}
4 changes: 4 additions & 0 deletions src/Stage/StageInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,8 @@
interface StageInterface
{
public function __invoke(SlurpPayload $payload): SlurpPayload;

public function attachObserver(StageObserverInterface $observer);

public function getPayload(): SlurpPayload;
}
13 changes: 13 additions & 0 deletions src/Stage/StageObserverInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php
/**
* Author: Courtney Miles
* Date: 6/09/18
* Time: 10:37 PM
*/

namespace MilesAsylum\Slurp\Stage;

interface StageObserverInterface
{
public function update(StageInterface $stage);
}
15 changes: 14 additions & 1 deletion src/Stage/TransformationStage.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,18 @@
use MilesAsylum\Slurp\SlurpPayload;
use MilesAsylum\Slurp\Transform\TransformerInterface;

class TransformationStage implements StageInterface
class TransformationStage extends AbstractStage
{
/**
* @var TransformerInterface
*/
private $transformer;

/**
* @var SlurpPayload
*/
protected $payload;

public function __construct(TransformerInterface $transformer)
{
$this->transformer = $transformer;
Expand All @@ -30,6 +35,14 @@ public function __invoke(SlurpPayload $payload): SlurpPayload
);
}

$this->payload = $payload;
$this->notify();

return $payload;
}

public function getPayload(): SlurpPayload
{
return $this->payload;
}
}
15 changes: 14 additions & 1 deletion src/Stage/ValidationStage.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,18 @@
use MilesAsylum\Slurp\SlurpPayload;
use MilesAsylum\Slurp\Validate\ValidatorInterface;

class ValidationStage implements StageInterface
class ValidationStage extends AbstractStage
{
/**
* @var ValidatorInterface
*/
private $validator;

/**
* @var SlurpPayload
*/
protected $payload;

public function __construct(ValidatorInterface $validator)
{
$this->validator = $validator;
Expand All @@ -26,6 +31,14 @@ public function __invoke(SlurpPayload $payload): SlurpPayload
{
$payload->addViolations($this->validator->validateRecord($payload->getRowId(), $payload->getValues()));

$this->payload = $payload;
$this->notify();

return $payload;
}

public function getPayload(): SlurpPayload
{
return $this->payload;
}
}
55 changes: 46 additions & 9 deletions tests/Slurp/Stage/ValidationStageTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,13 @@
namespace MilesAsylum\Slurp\Tests\Slurp\Stage;

use MilesAsylum\Slurp\SlurpPayload;
use MilesAsylum\Slurp\Stage\StageObserverInterface;
use MilesAsylum\Slurp\Stage\ValidationStage;
use MilesAsylum\Slurp\Validate\ValidatorInterface;
use Mockery\Adapter\Phpunit\MockeryPHPUnitIntegration;
use Mockery\MockInterface;
use PHPUnit\Framework\Error\Notice;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintViolationListInterface;

class ValidationStageTest extends TestCase
{
Expand Down Expand Up @@ -43,6 +42,10 @@ public function setUp()
parent::setUp();

$this->mockValidator = \Mockery::mock(ValidatorInterface::class);
$this->mockValidator->shouldReceive('validateRecord')
->withAnyArgs()
->andReturn([])
->byDefault();

$this->stage = new ValidationStage($this->mockValidator);
}
Expand All @@ -53,20 +56,54 @@ public function testValidateOnInvoke()
$record = ['bar'];
$violations = ['__violation__'];

$mockPayload = $this->createMockPayload($recordId, $record);

$this->stubViolations($this->mockValidator, $recordId, $record, $violations);

$mockPayload->shouldReceive('addViolations')
->with($violations)
->once();

$this->assertSame($mockPayload, ($this->stage)($mockPayload));
}

public function testNotifyObserverAfterValidate()
{
$mockObserver = \Mockery::mock(StageObserverInterface::class);
$mockObserver->shouldReceive('update')
->with($this->stage)
->once();

$this->stage->attachObserver($mockObserver);

$mockPayload = $this->createMockPayload(213, []);

($this->stage)($mockPayload);
}

/**
* @param int $recordId
* @param array $record
* @return SlurpPayload|MockInterface
*/
public function createMockPayload(int $recordId, array $record)
{
$mockPayload = \Mockery::mock(SlurpPayload::class);
$mockPayload->shouldReceive('getRowId')
->andReturn($recordId);
$mockPayload->shouldReceive('getValues')
->andReturn($record);
$mockPayload->shouldReceive('addViolations')
->withAnyArgs()
->byDefault();

$this->mockValidator->shouldReceive('validateRecord')
return $mockPayload;
}

public function stubViolations(MockInterface $mockValidator, int $recordId, array $record, array $violations)
{
$mockValidator->shouldReceive('validateRecord')
->with($recordId, $record)
->andReturn($violations);

$mockPayload->shouldReceive('addViolations')
->with($violations)
->once();

$this->assertSame($mockPayload, ($this->stage)($mockPayload));
}
}

0 comments on commit f2ce5dc

Please sign in to comment.