Added some tests and factory impl

This commit is contained in:
Michał Brzuchalski
2016-06-14 12:09:59 +02:00
parent 6e22a75a2e
commit e4982b5209
5 changed files with 228 additions and 21 deletions

View File

@@ -7,19 +7,22 @@
*/
namespace Madkom\NginxConfigurator;
use Countable;
use Madkom\Collection\CustomTypedCollection;
use Madkom\NginxConfigurator\Config\Server;
use Madkom\NginxConfigurator\Config\Upstream;
use Madkom\NginxConfigurator\Node\Directive;
use Madkom\NginxConfigurator\Node\Node;
use Madkom\NginxConfigurator\Node\Param;
use Madkom\NginxConfigurator\Node\RootNode;
use Traversable;
/**
* Class Builder
* @package Madkom\NginxConfigurator
* @author Michał Brzuchalski <m.brzuchalski@madkom.pl>
*/
class Builder
class Builder implements Countable
{
/**
* @var RootNode Holds configuration root node
@@ -30,30 +33,12 @@ class Builder
* Builder constructor.
*/
public function __construct()
{
$this->clear();
}
public function clear()
{
$this->rootNode = new RootNode();
}
/**
* @param int $port
* @return Server
*/
public function addServerNode(int $port) : Server
{
$listenIPv4 = new Directive('listen', [new Param($port)]);
$listenIPv6 = new Directive('listen', [new Param("[::]:{$port}"), new Param('default'), new Param('ipv6only=on')]);
$httpNode = new Server([$listenIPv4, $listenIPv6]);
$this->rootNode->append($httpNode);
return $httpNode;
}
/**
* Append child node
* @param Node $node
* @return Node
*/
@@ -64,6 +49,46 @@ class Builder
return $node;
}
/**
* Remove child node
* @param Node $node
* @return bool
*/
public function remove(Node $node) : bool
{
return $this->rootNode->remove($node);
}
/**
* Search for specified nodes
* @param callable $checker
* @return CustomTypedCollection
*/
public function search(callable $checker) : CustomTypedCollection
{
return $this->rootNode->filter($checker);
}
/**
* Count elements of an object
* @link http://php.net/manual/en/countable.count.php
* @return int The custom count as an integer.
*/
public function count()
{
return count($this->rootNode);
}
/**
* Retrieve an external iterator
* @link http://php.net/manual/en/iteratoraggregate.getiterator.php
* @return Traversable An instance of an object implementing <b>Iterator</b> or
*/
public function getIterator()
{
return $this->rootNode->getIterator();
}
/**
* @return string
*/

45
src/Factory.php Normal file
View File

@@ -0,0 +1,45 @@
<?php
/**
* Created by PhpStorm.
* User: mbrzuchalski
* Date: 14.06.16
* Time: 11:22
*/
namespace Madkom\NginxConfigurator;
use Madkom\NginxConfigurator\Config\Location;
use Madkom\NginxConfigurator\Config\Server;
use Madkom\NginxConfigurator\Node\Directive;
use Madkom\NginxConfigurator\Node\Param;
/**
* Class Factory
* @package Madkom\NginxConfigurator
* @author Michał Brzuchalski <m.brzuchalski@madkom.pl>
*/
class Factory
{
/**
* Creates Server node
* @param int $port
* @return Server
*/
public function createServer(int $port = 80) : Server
{
$listenIPv4 = new Directive('listen', [new Param($port)]);
$listenIPv6 = new Directive('listen', [new Param("[::]:{$port}"), new Param('default'), new Param('ipv6only=on')]);
return new Server([$listenIPv4, $listenIPv6]);
}
/**
* Creates Location node
* @param string $location
* @param string|null $match
* @return Location
*/
public function createLocation(string $location, string $match = null) : Location
{
return new Location(new Param($location), is_null($match) ? null : new Param($match));
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace spec\Madkom\NginxConfigurator;
use Madkom\NginxConfigurator\Builder;
use Madkom\NginxConfigurator\Config\Server;
use Madkom\NginxConfigurator\Config\Upstream;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
/**
* Class BuilderSpec
* @package spec\Madkom\NginxConfigurator
* @author Michał Brzuchalski <m.brzuchalski@madkom.pl>
* @mixin Builder
*/
class BuilderSpec extends ObjectBehavior
{
function it_is_initializable()
{
$this->shouldHaveType(Builder::class);
}
function it_can_build_with_Server_node(Server $server)
{
$server->__toString()->willReturn("server {
}");
$this->append($server);
$this->dump()->shouldBeString();
}
function it_can_build_with_Upstream_node(Upstream $upstream)
{
$upstream->__toString()->willReturn("upstream name {
}");
$this->append($upstream);
$this->dump()->shouldBeString();
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace spec\Madkom\NginxConfigurator;
use Madkom\NginxConfigurator\Config\Location;
use Madkom\NginxConfigurator\Config\Server;
use Madkom\NginxConfigurator\Factory;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
/**
* Class FactorySpec
* @package spec\Madkom\NginxConfigurator
* @author Michał Brzuchalski <m.brzuchalski@madkom.pl>
* @mixin Factory
*/
class FactorySpec extends ObjectBehavior
{
function it_is_initializable()
{
$this->shouldHaveType(Factory::class);
}
function it_can_create_Server_node()
{
$this->createServer(80)->shouldReturnAnInstanceOf(Server::class);
}
function it_can_create_Location_node()
{
$this->createLocation('/test', '~')->shouldReturnAnInstanceOf(Location::class);
}
}

View File

@@ -3,11 +3,15 @@
namespace spec\Madkom\NginxConfigurator;
use Ferno\Loco\ParseFailureException;
use Madkom\NginxConfigurator\Config\Http;
use Madkom\NginxConfigurator\Config\Location;
use Madkom\NginxConfigurator\Config\Server;
use Madkom\NginxConfigurator\Config\Upstream;
use Madkom\NginxConfigurator\Node\Context;
use Madkom\NginxConfigurator\Node\Directive;
use Madkom\NginxConfigurator\Node\Literal;
use Madkom\NginxConfigurator\Node\Node;
use Madkom\NginxConfigurator\Node\Param;
use Madkom\NginxConfigurator\Node\RootNode;
use Madkom\NginxConfigurator\Parser;
use PhpSpec\ObjectBehavior;
@@ -25,7 +29,7 @@ class ParserSpec extends ObjectBehavior
{
function it_is_initializable()
{
$this->shouldHaveType('Madkom\NginxConfigurator\Parser');
$this->shouldHaveType(Parser::class);
}
/**
@@ -184,4 +188,67 @@ EOF
}
}
}
function it_can_parse_Upstream_and_Http_contexts()
{
$root = $this->parse(<<<EOF
http {
}
upstream name {
internal;
}
EOF
);
$root->shouldReturnAnInstanceOf(RootNode::class);
$contexts = $root->search(function (Node $node) {
return $node;
})->getWrappedObject();
/** @var Context $context */
foreach ($contexts as $index => $context) {
switch ($index) {
case 0:
Assert::assertInstanceOf(Http::class, $context);
break;
case 1:
Assert::assertInstanceOf(Upstream::class, $context);
/** @var Directive $directive */
foreach ($context as $index => $directive) {
switch ($index) {
case 0:
Assert::assertEquals('internal', $directive->getName());
break;
}
}
break;
}
}
}
/**
* @throws ParseFailureException
*/
function it_can_parse_Literal_directive()
{
/** @var RootNode $root */
$root = $this->parse(<<<EOF
internal "txt";
EOF
);
$root->shouldReturnAnInstanceOf(RootNode::class);
$directives = $root->search(function (Node $node) {
return $node;
})->getWrappedObject();
/** @var Directive $directive */
foreach ($directives as $directive) {
break;
}
Assert::assertEquals($directive->getName(), 'internal');
Assert::assertInstanceOf(Traversable::class, $directive->getParams());
/** @var Param $param */
foreach ($directive->getParams() as $param) {
Assert::assertInstanceOf(Literal::class, $param);
}
}
}