Skip to content

Commit

Permalink
Refactor functional tests
Browse files Browse the repository at this point in the history
  • Loading branch information
adrenalinkin committed Feb 23, 2023
1 parent c7773a6 commit 96eb753
Show file tree
Hide file tree
Showing 7 changed files with 112 additions and 54 deletions.
2 changes: 1 addition & 1 deletion Tests/Builder/SwaggerResolverBuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ public function canBuildCorrectResolverDataProvider(): iterable
'password' => 'paSSword',
'email' => 'homer@gmail.com',
'birthday' => '1965-05-12',
'happyHour' => '14:00',
'happyHour' => '14:00:00',
'discount' => 30,
];

Expand Down
81 changes: 51 additions & 30 deletions Tests/Functional/CustomerCreateTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,23 @@
*/
class CustomerCreateTest extends SwaggerResolverWebTestCase
{
public function testCanSendRequest(): void
/**
* @dataProvider canSendRequestDataProvider
*/
public function testCanSendRequest(array $query, array $header, array $body): void
{
$client = self::createClient();
$expected = [
'id' => 1,
];
$query = [
'roles' => ['guest'],
];
$header = ['HTTP_X_AUTH_TOKEN' => str_repeat('k', 36)];
$body = [
$client->request('POST', '/api/customers', $query, [], $header, json_encode($body));

self::assertSame(200, $client->getResponse()->getStatusCode());
}

public function canSendRequestDataProvider(): iterable
{
$validQuery = ['roles' => ['guest']];
$validHeader = ['HTTP_X_AUTH_TOKEN' => str_repeat('k', 36)];
$requiredFields = ['name', 'roles', 'email', 'password'];
$validBody = [
'name' => 'Homer',
'secondName' => 'Simpson',
'roles' => ['guest'],
Expand All @@ -39,10 +45,16 @@ public function testCanSendRequest(): void
'discount' => 30,
];

$client->request('POST', '/api/customers', $query, [], $header, json_encode($body));
yield 'full set' => ['query' => $validQuery, 'header' => $validHeader, 'body' => $validBody];
yield 'no query' => ['query' => [], 'header' => $validHeader, 'body' => $validBody];
yield '2 roles' => ['query' => ['guest', 'admin'], 'header' => $validHeader, 'body' => $validBody];

self::assertSame(200, $client->getResponse()->getStatusCode());
self::assertSame($expected, json_decode($client->getResponse()->getContent(), true));
$onlyRequired = [];
foreach ($requiredFields as $name) {
$onlyRequired[$name] = $validBody[$name];
}

yield 'body only required' => ['query' => $validQuery, 'header' => $validHeader, 'body' => $onlyRequired];
}

/**
Expand All @@ -58,6 +70,7 @@ public function testFailSendRequest(array $query, array $header, array $body): v

public function failSendRequestDataProvider(): iterable
{
$validQuery = ['roles' => ['guest']];
$validHeader = ['HTTP_X_AUTH_TOKEN' => str_repeat('k', 36)];
$validBody = [
'name' => 'Homer',
Expand All @@ -74,30 +87,38 @@ public function failSendRequestDataProvider(): iterable
foreach ($requiredFields as $field) {
$body = $validBody;
unset($body[$field]);
yield ['query' => [], 'header' => $validHeader, 'body' => $body];
yield 'without '.$field => ['query' => $validQuery, 'header' => $validHeader, 'body' => $body];
}

yield ['query' => [], 'header' => ['HTTP_X_AUTH_TOKEN' => str_repeat('k', 35)], 'body' => $validBody];
yield ['query' => [], 'header' => ['HTTP_X_AUTH_TOKEN' => str_repeat('k', 37)], 'body' => $validBody];
yield 'auth token 35' => [
'query' => $validQuery,
'header' => ['HTTP_X_AUTH_TOKEN' => str_repeat('k', 35)],
'body' => $validBody,
];
yield 'auth token 37' => [
'query' => $validQuery,
'header' => ['HTTP_X_AUTH_TOKEN' => str_repeat('k', 37)],
'body' => $validBody,
];

$incorrectBodyModifications = [
['name' => 's'],
['name' => str_repeat('k', 51)],
// ['roles' => ['undefined-role']], TODO: add Enum validation for array
['roles' => []],
['roles' => ['guest', 'user', 'admin']],
['roles' => ['guest', 'guest']],
['email' => 'homer@gmail.com'],
['birthday' => '12.05.1965'],
['birthday' => '1965-02-30'],
['happyHour' => '14:00'],
['discount' => '9'],
['discount' => '110'],
['discount' => '-10'],
'short name' => ['name' => 's'],
'long name' => ['name' => str_repeat('k', 51)],
// 'undefined role' => ['roles' => ['undefined-role']], TODO: add Enum validation for array
'0 items in role' => ['roles' => []],
'3 items in role' => ['roles' => ['guest', 'user', 'admin']],
'duplicate in role' => ['roles' => ['guest', 'guest']],
'incorrect email' => ['email' => 'homer@gmail.com'],
'incorrect date' => ['birthday' => '12.05.1965'],
'incorrect date 2' => ['birthday' => '1965-02-30'],
'incorrect time' => ['happyHour' => '14:00'],
'discount incorrect multiple' => ['discount' => '9'],
'discount greater 100' => ['discount' => '110'],
'discount lower 0' => ['discount' => '-10'],
];

foreach ($incorrectBodyModifications as $modification) {
yield ['query' => [], 'header' => $validHeader, 'body' => array_merge($validBody, $modification)];
foreach ($incorrectBodyModifications as $name => $modification) {
yield $name => ['query' => [], 'header' => $validHeader, 'body' => array_merge($validBody, $modification)];
}
}
}
73 changes: 54 additions & 19 deletions Tests/Functional/CustomerGetAllTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,29 +18,64 @@
*/
class CustomerGetAllTest extends SwaggerResolverWebTestCase
{
public function testCanSendRequest(): void
/**
* @dataProvider canSendRequestDataProvider
*/
public function testCanSendRequest(array $query, array $header): void
{
$client = self::createClient();
$expected = [
'discount' => 30,
'rating' => 3.5,
'id' => 1,
'name' => 'Homer',
'secondName' => 'Simpson',
'roles' => ['guest'],
'email' => 'homer@crud.com',
'isEmailConfirmed' => true,
'birthday' => '1965-05-12',
'happyHour' => '14:00:00',
'registeredAt' => '2000-10-11T19:57:31Z',
'lastVisitedAt' => '665701200',
];

$query = ['page' => 1, 'perPage' => 100];
$header = ['HTTP_X_AUTH_TOKEN' => str_repeat('k', 36)];
$client->request('GET', '/api/customers', $query, [], $header);

self::assertSame(200, $client->getResponse()->getStatusCode());
self::assertSame([$expected], json_decode($client->getResponse()->getContent(), true));
}

public function canSendRequestDataProvider(): iterable
{
$validHeader = ['HTTP_X_AUTH_TOKEN' => str_repeat('k', 36)];

yield 'all set' => ['query' => ['page' => 1, 'perPage' => 500], 'header' => $validHeader];
yield 'all set 2' => ['query' => ['page' => 10, 'perPage' => 1000], 'header' => $validHeader];
yield 'no page' => ['query' => ['perPage' => 1000], 'header' => $validHeader];
// TODO: fix problem with normalization and enum in query
// yield 'no perPage' => ['query' => ['page' => 10], 'header' => $validHeader];
// yield 'no query params' => ['query' => [], 'header' => $validHeader];
}

/**
* @dataProvider failSendRequestDataProvider
*/
public function testFailSendRequest(array $query, array $header): void
{
$client = self::createClient();
$client->request('GET', '/api/customers', $query, [], $header);

self::assertSame(500, $client->getResponse()->getStatusCode());
}

public function failSendRequestDataProvider(): iterable
{
$validHeader = ['HTTP_X_AUTH_TOKEN' => str_repeat('k', 36)];
$validQuery = ['page' => 1, 'perPage' => 500];

yield 'no auth token' => ['query' => ['page' => 1, 'perPage' => 500], 'header' => []];
yield 'auth token 37' => [
'query' => ['page' => 1, 'perPage' => 500],
'header' => ['HTTP_X_AUTH_TOKEN' => str_repeat('k', 37)],
];
yield 'auth token 36' => [
'query' => ['page' => 1, 'perPage' => 500],
'header' => ['HTTP_X_AUTH_TOKEN' => str_repeat('k', 35)],
];

$incorrectQueryModifications = [
'page not int' => ['page' => 'string'],
'page negative' => ['page' => -10],
'perPage incorrect enum' => ['perPage' => 110],
'perPage not int' => ['perPage' => 'string'],
];

foreach ($incorrectQueryModifications as $name => $modification) {
yield $name => ['query' => array_merge($validQuery, $modification), 'header' => $validHeader];
}
}
}
4 changes: 3 additions & 1 deletion Tests/Functional/src/AbstractCustomerController.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,10 @@ public function getAll(Request $request, SwaggerResolverFactory $factory): JsonR
{
$requestResolver = $factory->createForRequest($request);
$requestResolver->resolve([
'page' => $request->query->getInt('page'),
'page' => $request->query->get('page'),
'perPage' => $request->query->getInt('perPage'),
// TODO: fix problem with normalization and enum in query
// 'perPage' => $request->query->get('perPage'),
'x-auth-token' => $request->headers->get('x-auth-token'),
]);

Expand Down
2 changes: 1 addition & 1 deletion Tests/Functional/src/Models/CustomerNew.php
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ class CustomerNew
/**
* @var string
*
* @SWG\Property(format="time", default="09:00")
* @SWG\Property(format="time", default="09:00:00")
*/
public $happyHour;

Expand Down
2 changes: 1 addition & 1 deletion Tests/Functional/web/swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,7 @@
"happyHour": {
"type": "string",
"format": "time",
"default": "09:00"
"default": "09:00:00"
},
"discount": {
"type": "integer",
Expand Down
2 changes: 1 addition & 1 deletion Tests/Functional/web/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -509,7 +509,7 @@ definitions:
happyHour:
type: string
format: time
default: '09:00'
default: '09:00:00'
discount:
type: integer
format: int32
Expand Down

0 comments on commit 96eb753

Please # to comment.