Skip to content

Commit

Permalink
valueDecider includes featureDecider instead of extends, use filterGr…
Browse files Browse the repository at this point in the history
…oupVoter & remove filterBagVoter
  • Loading branch information
davewwww committed May 18, 2015
1 parent 20f9581 commit d8699ed
Show file tree
Hide file tree
Showing 7 changed files with 124 additions and 145 deletions.
11 changes: 5 additions & 6 deletions README.tec..md
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,9 @@ Vote procedure

- FeatureDecider::decide( name/Feature )
- FeatureVoter::vote( Feature )
- FilterBagVoter::vote( FilterBag )
- FeatureGroupsVoter::vote( FilterGroups[] )
- EntriesAndVoter::vote( Filters[] )
- FilterVoter::vote( Filter )
- VoterManager::getVoter( name )
- ***Voter::vote( config )
- FeatureGroupsVoter::vote( FilterGroups[] )
- EntriesAndVoter::vote( Filters[] )
- FilterVoter::vote( Filter )
- VoterManager::getVoter( name )
- ***Voter::vote( config )

1 change: 1 addition & 0 deletions src/Dwo/Flagging/FeatureDecider.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ public function decide($name, Context $context, $default = null)
return $this->decideFeature($feature, $context, $default);
}


return $default;
}

Expand Down
104 changes: 70 additions & 34 deletions src/Dwo/Flagging/Tests/ValueDeciderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,93 +3,129 @@
namespace Dwo\Flagging\Tests;

use Dwo\Flagging\Context\Context;
use Dwo\Flagging\FeatureDecider;
use Dwo\Flagging\Model\Feature;
use Dwo\Flagging\Model\FeatureManagerInterface;
use Dwo\Flagging\Model\FilterBag;
use Dwo\Flagging\Model\Value;
use Dwo\Flagging\Model\ValueBag;
use Dwo\Flagging\ValueDecider;
use Dwo\Flagging\Voter\FeatureVoter;
use Dwo\Flagging\Voter\FilterGroupsVoter;

class ValueDeciderTest extends \PHPUnit_Framework_TestCase
{
public function testDecideValueOk()
public function testDecideFeatureValueOk()
{
$manager = $this->mockManager();
$featureVoter = $this->mockFeatureVoter();
$filterBagVoter = $this->mockFilterBagVoter();
$featureDecider = $this->mockFeatureDecider();
$voter = $this->mockFilterGroupsVoter();

$context = new Context();

$feature = new Feature('feature', null, null, new ValueBag(array(new Value('foo'))));
$value = new ValueBag(array(new Value('foo', new FilterBag(array('bar')))));
$feature = new Feature('feature', null, null, $value);

$featureVoter->expects(self::once())
->method('vote')
$featureDecider->expects(self::once())
->method('decideFeature')
->with($feature, $context)
->willReturn(true);

$filterBagVoter->expects(self::once())
$voter->expects(self::once())
->method('vote')
->with(self::isInstanceOf('Dwo\Flagging\Model\FilterBagInterface'), $context)
->with(self::isType('array'), $context)
->willReturn(true);

$decider = new ValueDecider($manager, $featureVoter, $filterBagVoter);
$decider = new ValueDecider($manager, $featureDecider, $voter);
$result = $decider->decideFeature($feature, $context);

self::assertEquals('foo', $result);
}

public function testDecideValueFalse()
public function testDecideFeatureValueFalse()
{
$manager = $this->mockManager();
$featureVoter = $this->mockFeatureVoter();
$filterBagVoter = $this->mockFilterBagVoter();
$featureDecider = $this->mockFeatureDecider();
$voter = $this->mockFilterGroupsVoter();

$context = new Context();

$feature = new Feature('feature', null, null, new ValueBag(array(new Value('foo'))));
$value = new ValueBag(array(new Value('foo', new FilterBag(array('bar')))));
$feature = new Feature('feature', null, null, $value);

$featureVoter->expects(self::once())
->method('vote')
$featureDecider->expects(self::once())
->method('decideFeature')
->with($feature, $context)
->willReturn(true);

$filterBagVoter->expects(self::once())
$voter->expects(self::once())
->method('vote')
->with(self::isInstanceOf('Dwo\Flagging\Model\FilterBagInterface'), $context)
->with(self::isType('array'), $context)
->willReturn(false);

$decider = new ValueDecider($manager, $featureVoter, $filterBagVoter);
$decider = new ValueDecider($manager, $featureDecider, $voter);
$result = $decider->decideFeature($feature, $context);

self::assertEquals(null, $result);
}

public function testDecideValueFalseWithDefault()
public function testDecideFeatureValueFalseWithDefault()
{
$manager = $this->mockManager();
$featureVoter = $this->mockFeatureVoter();
$filterBagVoter = $this->mockFilterBagVoter();
$featureDecider = $this->mockFeatureDecider();
$voter = $this->mockFilterGroupsVoter();

$context = new Context();

$feature = new Feature('feature', null, null, new ValueBag(array(new Value('foo'))));
$value = new ValueBag(array(new Value('foo', new FilterBag(array('bar')))));
$feature = new Feature('feature', new FilterBag(array()), null, $value);

$featureVoter->expects(self::once())
->method('vote')
$featureDecider->expects(self::once())
->method('decideFeature')
->with($feature, $context)
->willReturn(true);

$filterBagVoter->expects(self::once())
$voter->expects(self::once())
->method('vote')
->with(self::isInstanceOf('Dwo\Flagging\Model\FilterBagInterface'), $context)
->with(self::isType('array'), $context)
->willReturn(false);

$decider = new ValueDecider($manager, $featureVoter, $filterBagVoter);
$decider = new ValueDecider($manager, $featureDecider, $voter);
$result = $decider->decideFeature($feature, $context, 'bar');

self::assertEquals('bar', $result);
}

public function testDecideValueOk()
{
$manager = $this->mockManager();
$featureDecider = $this->mockFeatureDecider();
$voter = $this->mockFilterGroupsVoter();

$context = new Context();
$value = new ValueBag(array(new Value('foo', new FilterBag(array('bar')))));
$feature = new Feature('feature', new FilterBag(array()), null, $value);

$manager->expects(self::once())
->method('findFeatureByName')
->with('feature')
->willReturn($feature);

$featureDecider->expects(self::once())
->method('decideFeature')
->with($feature, $context)
->willReturn(true);

$voter->expects(self::once())
->method('vote')
->with(self::isType('array'), $context)
->willReturn(true);

$decider = new ValueDecider($manager, $featureDecider, $voter);
$result = $decider->decide('feature', $context);

self::assertEquals('foo', $result);
}

/**
* @return \PHPUnit_Framework_MockObject_MockObject|FeatureManagerInterface
*/
Expand All @@ -101,21 +137,21 @@ protected function mockManager()
}

/**
* @return \PHPUnit_Framework_MockObject_MockObject|FeatureVoter
* @return \PHPUnit_Framework_MockObject_MockObject|FeatureDecider
*/
protected function mockFeatureVoter()
protected function mockFeatureDecider()
{
return $this->getMockBuilder('Dwo\Flagging\Voter\FeatureVoter')
return $this->getMockBuilder('Dwo\Flagging\FeatureDecider')
->disableOriginalConstructor()
->getMock();
}

/**
* @return \PHPUnit_Framework_MockObject_MockObject|FilterBagVoter
* @return \PHPUnit_Framework_MockObject_MockObject|FilterGroupsVoter
*/
protected function mockFilterBagVoter()
protected function mockFilterGroupsVoter()
{
return $this->getMockBuilder('Dwo\Flagging\Voter\FilterBagVoter')
return $this->getMockBuilder('Dwo\Flagging\Voter\FilterGroupsVoter')
->disableOriginalConstructor()
->getMock();
}
Expand Down
17 changes: 13 additions & 4 deletions src/Dwo/Flagging/Tests/Voter/CachedFilterVoterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,8 @@

use Dwo\Flagging\Context\Context;
use Dwo\Flagging\Model\Filter;
use Dwo\Flagging\Model\FilterGroup;
use Dwo\Flagging\Voter\CachedFilterVoter;
use Dwo\Flagging\Voter\EntriesAndVoter;
use Dwo\Flagging\Voter\FilterGroupsVoter;
use Dwo\Flagging\Voter\FilterVoter;
use Dwo\Flagging\Voter\VoterInterface;

class CachedFilterVoterTest extends \PHPUnit_Framework_TestCase
{
Expand Down Expand Up @@ -80,6 +76,19 @@ public function testNotCached()
self::assertTrue($cache->getResult('foobar_null'));
}

/**
* @expectedException \Dwo\Flagging\Exception\FlaggingException
*/
public function testInvalidArgument()
{
$voter = $this->mockVoter();
$voter->expects(self::never())
->method('vote');

$feature = new CachedFilterVoter($voter);
$feature->vote('foo', new Context());
}

/**
* @return \PHPUnit_Framework_MockObject_MockObject|FilterVoter
*/
Expand Down
52 changes: 0 additions & 52 deletions src/Dwo/Flagging/Tests/Voter/FilterBagVoterTest.php

This file was deleted.

48 changes: 35 additions & 13 deletions src/Dwo/Flagging/ValueDecider.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,52 +5,74 @@
use Dwo\Flagging\Context\Context;
use Dwo\Flagging\Model\Feature;
use Dwo\Flagging\Model\FeatureManagerInterface;
use Dwo\Flagging\Voter\FeatureVoter;
use Dwo\Flagging\Voter\FilterBagVoter;
use Dwo\Flagging\Voter\FilterGroupsVoter;

/**
* @author David Wolter <david@lovoo.com>
*/
class ValueDecider extends FeatureDecider implements FeatureDeciderInterface
class ValueDecider implements FeatureDeciderInterface
{
/**
* @var FilterBagVoter
* @var FeatureManagerInterface
*/
protected $filterBagVoter;
protected $featureManager;
/**
* @var FeatureDecider
*/
protected $featureDecider;
/**
* @var FilterGroupsVoter
*/
protected $voter;

/**
* @param FeatureManagerInterface $featureManager
* @param FeatureVoter $voter
* @param FilterBagVoter $filterBagVoter
* @param FeatureDecider $featureDecider
* @param FilterGroupsVoter $voter
*/
public function __construct(
FeatureManagerInterface $featureManager,
FeatureVoter $voter,
FilterBagVoter $filterBagVoter
FeatureDecider $featureDecider,
FilterGroupsVoter $voter
) {
parent::__construct($featureManager, $voter);
$this->filterBagVoter = $filterBagVoter;
$this->featureManager = $featureManager;
$this->featureDecider = $featureDecider;
$this->voter = $voter;
}

/**
* {@inheritdoc}
*/
public function decideFeature(Feature $feature, Context $context, $default = null)
{
if (parent::decideFeature($feature, $context, $default)) {
if ($this->featureDecider->decideFeature($feature, $context, $default)) {

foreach ($feature->getValue()->getValues() as $key => $value) {

/**
* :TODO: why name?
*/
$context->setName($feature->getName().'_'.$key);

if ($this->filterBagVoter->vote($value->getFilter(), $context)) {
$filter = $value->getFilter();
if ($filter->hasFilter() ? $this->voter->vote($filter->getFilterGroups(), $context) : true) {
return $value->getValue();
}
}
}

return $default;
}

/**
* {@inheritdoc}
*/
public function decide($name, Context $context, $default = null)
{
if (null !== $feature = $this->featureManager->findFeatureByName($name)) {
return $this->decideFeature($feature, $context, $default);
}

return $default;
}
}

0 comments on commit d8699ed

Please sign in to comment.