fix required fields in API (#1718)
This commit is contained in:
@@ -336,7 +336,7 @@ class ActivityController extends BaseApiController
|
|||||||
$this->repository->saveActivity($activity);
|
$this->repository->saveActivity($activity);
|
||||||
|
|
||||||
$view = new View($activity, 200);
|
$view = new View($activity, 200);
|
||||||
$view->getContext()->setGroups(['Default', 'Entity', 'Project']);
|
$view->getContext()->setGroups(['Default', 'Entity', 'Activity']);
|
||||||
|
|
||||||
return $this->viewHandler->handle($view);
|
return $this->viewHandler->handle($view);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,9 +11,13 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace App\API;
|
namespace App\API;
|
||||||
|
|
||||||
|
use App\Entity\User;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
|
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method null|User getUser()
|
||||||
|
*/
|
||||||
abstract class BaseApiController extends AbstractController
|
abstract class BaseApiController extends AbstractController
|
||||||
{
|
{
|
||||||
public const DATE_FORMAT = DateTimeType::HTML5_FORMAT;
|
public const DATE_FORMAT = DateTimeType::HTML5_FORMAT;
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ class TimesheetController extends BaseApiController
|
|||||||
* @Rest\QueryParam(name="end", requirements=@Constraints\DateTime(format="Y-m-d\TH:i:s"), strict=true, nullable=true, description="Only records before this date will be included (format: HTML5)")
|
* @Rest\QueryParam(name="end", requirements=@Constraints\DateTime(format="Y-m-d\TH:i:s"), strict=true, nullable=true, description="Only records before this date will be included (format: HTML5)")
|
||||||
* @Rest\QueryParam(name="exported", requirements="0|1", strict=true, nullable=true, description="Use this flag if you want to filter for export state. Allowed values: 0=not exported, 1=exported (default: all)")
|
* @Rest\QueryParam(name="exported", requirements="0|1", strict=true, nullable=true, description="Use this flag if you want to filter for export state. Allowed values: 0=not exported, 1=exported (default: all)")
|
||||||
* @Rest\QueryParam(name="active", requirements="0|1", strict=true, nullable=true, description="Filter for running/active records. Allowed values: 0=stopped, 1=active (default: all)")
|
* @Rest\QueryParam(name="active", requirements="0|1", strict=true, nullable=true, description="Filter for running/active records. Allowed values: 0=stopped, 1=active (default: all)")
|
||||||
* @Rest\QueryParam(name="full", requirements="true", strict=true, nullable=true, description="Allows to fetch fully serialized objects including subresources (TimesheetSubCollection). Allowed values: true (default: false)")
|
* @Rest\QueryParam(name="full", requirements="true", strict=true, nullable=true, description="Allows to fetch fully serialized objects including subresources. Allowed values: true (default: false)")
|
||||||
* @Rest\QueryParam(name="term", description="Free search term")
|
* @Rest\QueryParam(name="term", description="Free search term")
|
||||||
*
|
*
|
||||||
* @Security("is_granted('view_own_timesheet') or is_granted('view_other_timesheet')")
|
* @Security("is_granted('view_own_timesheet') or is_granted('view_other_timesheet')")
|
||||||
|
|||||||
@@ -29,11 +29,13 @@ trait EntityFormTrait
|
|||||||
if ($options['include_budget']) {
|
if ($options['include_budget']) {
|
||||||
$builder
|
$builder
|
||||||
->add('budget', MoneyType::class, [
|
->add('budget', MoneyType::class, [
|
||||||
|
'empty_data' => '0.00',
|
||||||
'label' => 'label.budget',
|
'label' => 'label.budget',
|
||||||
'required' => false,
|
'required' => false,
|
||||||
'currency' => $currency,
|
'currency' => $currency,
|
||||||
])
|
])
|
||||||
->add('timeBudget', DurationType::class, [
|
->add('timeBudget', DurationType::class, [
|
||||||
|
'empty_data' => 0,
|
||||||
'label' => 'label.timeBudget',
|
'label' => 'label.timeBudget',
|
||||||
'icon' => 'clock',
|
'icon' => 'clock',
|
||||||
'required' => false,
|
'required' => false,
|
||||||
|
|||||||
@@ -201,6 +201,21 @@ class ActivityControllerTest extends APIControllerBaseTest
|
|||||||
$this->assertNotEmpty($result['id']);
|
$this->assertNotEmpty($result['id']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testPostActionWithLeastFields()
|
||||||
|
{
|
||||||
|
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||||
|
$data = [
|
||||||
|
'name' => 'foo',
|
||||||
|
];
|
||||||
|
$this->request($client, '/api/activities', 'POST', [], json_encode($data));
|
||||||
|
$this->assertTrue($client->getResponse()->isSuccessful());
|
||||||
|
|
||||||
|
$result = json_decode($client->getResponse()->getContent(), true);
|
||||||
|
$this->assertIsArray($result);
|
||||||
|
$this->assertStructure($result);
|
||||||
|
$this->assertNotEmpty($result['id']);
|
||||||
|
}
|
||||||
|
|
||||||
public function testPostActionWithInvalidUser()
|
public function testPostActionWithInvalidUser()
|
||||||
{
|
{
|
||||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
|
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
|
||||||
|
|||||||
@@ -136,6 +136,24 @@ class CustomerControllerTest extends APIControllerBaseTest
|
|||||||
$this->assertNotEmpty($result['id']);
|
$this->assertNotEmpty($result['id']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testPostActionWithLeastFields()
|
||||||
|
{
|
||||||
|
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||||
|
$data = [
|
||||||
|
'name' => 'foo',
|
||||||
|
'country' => 'DE',
|
||||||
|
'currency' => 'EUR',
|
||||||
|
'timezone' => 'Europe/Berlin',
|
||||||
|
];
|
||||||
|
$this->request($client, '/api/customers', 'POST', [], json_encode($data));
|
||||||
|
$this->assertTrue($client->getResponse()->isSuccessful());
|
||||||
|
|
||||||
|
$result = json_decode($client->getResponse()->getContent(), true);
|
||||||
|
$this->assertIsArray($result);
|
||||||
|
$this->assertStructure($result);
|
||||||
|
$this->assertNotEmpty($result['id']);
|
||||||
|
}
|
||||||
|
|
||||||
public function testPostActionWithInvalidUser()
|
public function testPostActionWithInvalidUser()
|
||||||
{
|
{
|
||||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
|
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
|
||||||
|
|||||||
@@ -202,6 +202,23 @@ class ProjectControllerTest extends APIControllerBaseTest
|
|||||||
self::assertEquals('2020-02-08T21:11:42+0000', $result['end']);
|
self::assertEquals('2020-02-08T21:11:42+0000', $result['end']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testPostActionWithLeastFields()
|
||||||
|
{
|
||||||
|
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||||
|
$data = [
|
||||||
|
'name' => 'foo',
|
||||||
|
'customer' => 1
|
||||||
|
];
|
||||||
|
$this->request($client, '/api/projects', 'POST', [], json_encode($data));
|
||||||
|
$this->assertTrue($client->getResponse()->isSuccessful());
|
||||||
|
|
||||||
|
$result = json_decode($client->getResponse()->getContent(), true);
|
||||||
|
$this->assertIsArray($result);
|
||||||
|
$this->assertStructure($result);
|
||||||
|
$this->assertNotEmpty($result['id']);
|
||||||
|
self::assertEquals('foo', $result['name']);
|
||||||
|
}
|
||||||
|
|
||||||
public function testPostActionWithInvalidUser()
|
public function testPostActionWithInvalidUser()
|
||||||
{
|
{
|
||||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
|
$client = $this->getClientForAuthenticatedUser(User::ROLE_USER);
|
||||||
|
|||||||
Reference in New Issue
Block a user