partkeepr

fork of partkeepr
git clone https://git.e1e0.net/partkeepr.git
Log | Files | Refs | Submodules | README | LICENSE

commit 3f0c087fdcf69ea87006c5d1c97f8526e07d846b
parent a8193d97af881baa9f760e9b4e8be061d42078d2
Author: Felicitus <felicitus@felicitus.org>
Date:   Tue, 15 Sep 2015 20:29:07 +0200

Refactored stock actions, added unit tests

Diffstat:
Msrc/PartKeepr/PartBundle/Action/AddStockAction.php | 12++++++------
Msrc/PartKeepr/PartBundle/Action/RemoveStockAction.php | 12++++++------
Msrc/PartKeepr/PartBundle/Action/SetStockAction.php | 13++++++-------
Asrc/PartKeepr/PartBundle/DataFixtures/PartDataLoader.php | 27+++++++++++++++++++++++++++
Msrc/PartKeepr/PartBundle/Resources/config/actions.xml | 6+++---
Asrc/PartKeepr/PartBundle/Tests/StockTest.php | 154+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/PartKeepr/StorageLocationBundle/DataFixtures/StorageLocationLoader.php | 20++++++++++++++++++++
7 files changed, 222 insertions(+), 22 deletions(-)

diff --git a/src/PartKeepr/PartBundle/Action/AddStockAction.php b/src/PartKeepr/PartBundle/Action/AddStockAction.php @@ -4,12 +4,12 @@ namespace PartKeepr\PartBundle\Action; use Dunglas\ApiBundle\Action\ActionUtilTrait; use Dunglas\ApiBundle\Exception\RuntimeException; use Dunglas\ApiBundle\Model\DataProviderInterface; +use PartKeepr\AuthBundle\Services\UserService; use PartKeepr\CategoryBundle\Exception\RootNodeNotFoundException; use PartKeepr\PartBundle\Entity\Part; use PartKeepr\Stock\StockEntry; use Symfony\Bridge\Doctrine\ManagerRegistry; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; /** * Adds stock to a given part @@ -29,17 +29,17 @@ class AddStockAction private $registry; /** - * @var TokenStorage + * @var UserService */ - private $tokenStorage; + private $userService; public function __construct( DataProviderInterface $dataProvider, - TokenStorage $tokenStorage, + UserService $userService, ManagerRegistry $registry ) { $this->dataProvider = $dataProvider; - $this->tokenStorage = $tokenStorage; + $this->userService = $userService; $this->registry = $registry; } @@ -62,7 +62,7 @@ class AddStockAction * @var $part Part */ $quantity = $request->request->get("quantity"); - $user = $this->tokenStorage->getToken()->getUser(); + $user = $this->userService->getUser(); $stock = new StockEntry(intval($quantity), $user); diff --git a/src/PartKeepr/PartBundle/Action/RemoveStockAction.php b/src/PartKeepr/PartBundle/Action/RemoveStockAction.php @@ -4,12 +4,12 @@ namespace PartKeepr\PartBundle\Action; use Dunglas\ApiBundle\Action\ActionUtilTrait; use Dunglas\ApiBundle\Exception\RuntimeException; use Dunglas\ApiBundle\Model\DataProviderInterface; +use PartKeepr\AuthBundle\Services\UserService; use PartKeepr\CategoryBundle\Exception\RootNodeNotFoundException; use PartKeepr\PartBundle\Entity\Part; use PartKeepr\Stock\StockEntry; use Symfony\Bridge\Doctrine\ManagerRegistry; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; /** * Removes stock for a given part @@ -29,17 +29,17 @@ class RemoveStockAction private $registry; /** - * @var TokenStorage + * @var UserService */ - private $tokenStorage; + private $userService; public function __construct( DataProviderInterface $dataProvider, - TokenStorage $tokenStorage, + UserService $userService, ManagerRegistry $registry ) { $this->dataProvider = $dataProvider; - $this->tokenStorage = $tokenStorage; + $this->userService = $userService; $this->registry = $registry; } /** @@ -61,7 +61,7 @@ class RemoveStockAction * @var $part Part */ $quantity = $request->request->get("quantity"); - $user = $this->tokenStorage->getToken()->getUser(); + $user = $this->userService->getUser(); $stock = new StockEntry(0 - intval($quantity), $user); $part->addStockEntry($stock); diff --git a/src/PartKeepr/PartBundle/Action/SetStockAction.php b/src/PartKeepr/PartBundle/Action/SetStockAction.php @@ -4,12 +4,12 @@ namespace PartKeepr\PartBundle\Action; use Dunglas\ApiBundle\Action\ActionUtilTrait; use Dunglas\ApiBundle\Exception\RuntimeException; use Dunglas\ApiBundle\Model\DataProviderInterface; +use PartKeepr\AuthBundle\Services\UserService; use PartKeepr\CategoryBundle\Exception\RootNodeNotFoundException; use PartKeepr\PartBundle\Entity\Part; use PartKeepr\Stock\StockEntry; use Symfony\Bridge\Doctrine\ManagerRegistry; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; /** * Sets the stock for a given part @@ -29,17 +29,17 @@ class SetStockAction private $registry; /** - * @var TokenStorage + * @var UserService */ - private $tokenStorage; + private $userService; public function __construct( DataProviderInterface $dataProvider, - TokenStorage $tokenStorage, + UserService $userService, ManagerRegistry $registry ) { $this->dataProvider = $dataProvider; - $this->tokenStorage = $tokenStorage; + $this->userService = $userService; $this->registry = $registry; } /** @@ -61,8 +61,7 @@ class SetStockAction * @var $part Part */ $quantity = $request->request->get("quantity"); - $user = $this->tokenStorage->getToken()->getUser(); - + $user = $this->userService->getUser(); $oldQuantity = $part->getStockLevel(); $correctionQuantity = $quantity - $oldQuantity; diff --git a/src/PartKeepr/PartBundle/DataFixtures/PartDataLoader.php b/src/PartKeepr/PartBundle/DataFixtures/PartDataLoader.php @@ -0,0 +1,27 @@ +<?php +namespace PartKeepr\PartBundle\DataFixtures; + + +use Doctrine\Common\DataFixtures\AbstractFixture; +use Doctrine\Common\Persistence\ObjectManager; +use PartKeepr\PartBundle\Entity\Part; + +class PartDataLoader extends AbstractFixture +{ + public function load(ObjectManager $manager) + { + $part = new Part(); + $part->setName("FOOBAR"); + + $category = $this->getReference("partcategory.first"); + $storageLocation = $this->getReference("storagelocation.first"); + + $part->setCategory($category); + $part->setStorageLocation($storageLocation); + + $manager->persist($part); + $manager->flush(); + + $this->addReference("part", $part); + } +} diff --git a/src/PartKeepr/PartBundle/Resources/config/actions.xml b/src/PartKeepr/PartBundle/Resources/config/actions.xml @@ -7,17 +7,17 @@ <services> <service id="partkeepr.part.add_stock" class="PartKeepr\PartBundle\Action\AddStockAction"> <argument type="service" id="api.data_provider"/> - <argument type="service" id="security.token_storage" /> + <argument type="service" id="partkeepr.userservice" /> <argument type="service" id="doctrine"/> </service> <service id="partkeepr.part.remove_stock" class="PartKeepr\PartBundle\Action\RemoveStockAction"> <argument type="service" id="api.data_provider"/> - <argument type="service" id="security.token_storage" /> + <argument type="service" id="partkeepr.userservice" /> <argument type="service" id="doctrine"/> </service> <service id="partkeepr.part.set_stock" class="PartKeepr\PartBundle\Action\SetStockAction"> <argument type="service" id="api.data_provider"/> - <argument type="service" id="security.token_storage" /> + <argument type="service" id="partkeepr.userservice" /> <argument type="service" id="doctrine"/> </service> </services> diff --git a/src/PartKeepr/PartBundle/Tests/StockTest.php b/src/PartKeepr/PartBundle/Tests/StockTest.php @@ -0,0 +1,154 @@ +<?php +namespace PartKeepr\PartBundle\Tests; + +use Doctrine\Common\DataFixtures\ProxyReferenceRepository; +use Dunglas\ApiBundle\Api\IriConverter; +use Liip\FunctionalTestBundle\Test\WebTestCase; +use PartKeepr\PartBundle\Entity\Part; + +class StockTest extends WebTestCase +{ + /** + * @var ProxyReferenceRepository + */ + protected $fixtures; + + public function setUp() + { + $this->fixtures = $this->loadFixtures( + array( + 'PartKeepr\StorageLocationBundle\DataFixtures\StorageLocationLoader', + 'PartKeepr\PartBundle\DataFixtures\CategoryDataLoader', + 'PartKeepr\PartBundle\DataFixtures\PartDataLoader', + ) + )->getReferenceRepository(); + } + + private function getStockLevel(Part $part) + { + $query = $this->getContainer()->get("doctrine")->getManager()->createQuery("SELECT p.stockLevel FROM PartKeeprPartBundle:Part p WHERE p.id = :id")->setParameter("id", + $part->getId()); + + return $query->getSingleScalarResult(); + } + + public function testAddStock() + { + $client = static::makeClient(true); + + /** + * @var $part Part + */ + $part = $this->fixtures->getReference("part"); + $oldStockLevel = $this->getStockLevel($part); + + /** + * @var $iriConverter IriConverter + */ + $iriConverter = $this->getContainer()->get("api.iri_converter"); + + $iri = $iriConverter->getIriFromItem($part); + $iri .= "/addStock"; + + $request = array( + "quantity" => 5, + ); + + $client->request( + 'PUT', + $iri, + array(), + array(), + array('CONTENT_TYPE' => 'application/json'), + json_encode($request) + ); + + $result = json_decode($client->getResponse()->getContent()); + $newStockLevel = $this->getStockLevel($part); + + + $this->assertEquals($oldStockLevel + 5, $newStockLevel); + $this->assertObjectHasAttribute("stockLevel", $result); + $this->assertEquals($newStockLevel, $result->stockLevel); + } + + public function testRemoveStock() + { + $client = static::makeClient(true); + + /** + * @var $part Part + */ + $part = $this->fixtures->getReference("part"); + $oldStockLevel = $this->getStockLevel($part); + + /** + * @var $iriConverter IriConverter + */ + $iriConverter = $this->getContainer()->get("api.iri_converter"); + + $iri = $iriConverter->getIriFromItem($part); + $iri .= "/removeStock"; + + $request = array( + "quantity" => 7, + ); + + $client->request( + 'PUT', + $iri, + array(), + array(), + array('CONTENT_TYPE' => 'application/json'), + json_encode($request) + ); + + $result = json_decode($client->getResponse()->getContent()); + $newStockLevel = $this->getStockLevel($part); + + + $this->assertEquals($oldStockLevel - 7, $newStockLevel); + $this->assertObjectHasAttribute("stockLevel", $result); + $this->assertEquals($newStockLevel, $result->stockLevel); + } + + public function testSetStock() + { + $client = static::makeClient(true); + + /** + * @var $part Part + */ + $part = $this->fixtures->getReference("part"); + + /** + * @var $iriConverter IriConverter + */ + $iriConverter = $this->getContainer()->get("api.iri_converter"); + + $iri = $iriConverter->getIriFromItem($part); + $iri .= "/setStock"; + + $request = array( + "quantity" => 33, + ); + + $client->request( + 'PUT', + $iri, + array(), + array(), + array('CONTENT_TYPE' => 'application/json'), + json_encode($request) + ); + + $result = json_decode($client->getResponse()->getContent()); + $newStockLevel = $this->getStockLevel($part); + + + $this->assertEquals(33, $newStockLevel); + $this->assertObjectHasAttribute("stockLevel", $result); + $this->assertEquals($newStockLevel, $result->stockLevel); + } + +} diff --git a/src/PartKeepr/StorageLocationBundle/DataFixtures/StorageLocationLoader.php b/src/PartKeepr/StorageLocationBundle/DataFixtures/StorageLocationLoader.php @@ -0,0 +1,20 @@ +<?php +namespace PartKeepr\StorageLocationBundle\DataFixtures; + +use Doctrine\Common\DataFixtures\AbstractFixture; +use Doctrine\Common\Persistence\ObjectManager; +use PartKeepr\StorageLocationBundle\Entity\StorageLocation; + +class StorageLocationLoader extends AbstractFixture +{ + public function load(ObjectManager $manager) + { + $storageLocation = new StorageLocation(); + $storageLocation->setName("test"); + + $manager->persist($storageLocation); + $manager->flush(); + + $this->addReference("storagelocation.first", $storageLocation); + } +}