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:
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);
+ }
+}