api-erstellen #1
+5
-2
@@ -27,7 +27,8 @@
|
|||||||
"codeception/codeception": "^4.1.18",
|
"codeception/codeception": "^4.1.18",
|
||||||
"codeception/module-phpbrowser": "^1.0.0",
|
"codeception/module-phpbrowser": "^1.0.0",
|
||||||
"codeception/module-asserts": "^1.0.0",
|
"codeception/module-asserts": "^1.0.0",
|
||||||
"codeception/module-db": "^1.1.0"
|
"codeception/module-db": "^1.1.0",
|
||||||
|
"codeception/module-rest": "^1.2.8"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
@@ -36,7 +37,9 @@
|
|||||||
},
|
},
|
||||||
"autoload-dev": {
|
"autoload-dev": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"TorstenHettstedt\\TimekeepingApi\\Tests\\Unit\\": "tests/unit"
|
"TorstenHettstedt\\TimekeepingApi\\Tests\\Unit\\": "tests/unit",
|
||||||
|
"TorstenHettstedt\\TimekeepingApi\\Tests\\Api\\": "tests/api",
|
||||||
|
"Helper\\": "tests/_support/Helper"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
namespace Helper;
|
||||||
|
|
||||||
|
// here you can define custom actions
|
||||||
|
// all public methods declared in helper class will be available in $I
|
||||||
|
|
||||||
|
use Codeception\Module;
|
||||||
|
|
||||||
|
class Api extends Module
|
||||||
|
{
|
||||||
|
|
||||||
|
const FORMAT_TIME = 'string:regex([0-5]\d:[0-5]\d:[0-5]\d)';
|
||||||
|
|
||||||
|
const WORKING_HOURS_JSON_FORMAT = [
|
||||||
|
'date' => 'string:date',
|
||||||
|
'workingHours' => self::FORMAT_TIME,
|
||||||
|
];
|
||||||
|
|
||||||
|
const WORKING_HOURS_VIEW_JSON_FORMAT = [
|
||||||
|
"period" => "string",
|
||||||
|
"periodDesignation" => "string",
|
||||||
|
"totalHours" => self::FORMAT_TIME,
|
||||||
|
"workingDays" => 'integer:>0',
|
||||||
|
"overtime" => self::FORMAT_TIME,
|
||||||
|
];
|
||||||
|
|
||||||
|
const ERROR_JSON_FORMAT = [
|
||||||
|
"timestamp" => "string:date-time",
|
||||||
|
"status" => 0,
|
||||||
|
"error" => "string",
|
||||||
|
"message" => "string",
|
||||||
|
"path" => "string:path",
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
actor: ApiTester
|
||||||
|
modules:
|
||||||
|
enabled:
|
||||||
|
- \Helper\Api
|
||||||
|
- REST:
|
||||||
|
url: http://localhost:8090/
|
||||||
|
depends: PhpBrowser
|
||||||
|
part: Json
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?php /** @noinspection PhpUnused */
|
||||||
|
|
||||||
|
namespace TorstenHettstedt\TimekeepingApi\Tests\Api\Views;
|
||||||
|
|
||||||
|
use ApiTester;
|
||||||
|
use Codeception\Util\HttpCode;
|
||||||
|
use Helper\Api;
|
||||||
|
|
||||||
|
class BrowseWorkingHoursMonthlyCest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param ApiTester $I
|
||||||
|
*/
|
||||||
|
public function browseWorkingHoursView(ApiTester $I): void
|
||||||
|
{
|
||||||
|
$I->sendGet('/views/working-hours/monthly');
|
||||||
|
$I->seeResponseCodeIs(HttpCode::OK);
|
||||||
|
$I->seeResponseIsJson();
|
||||||
|
$I->seeResponseMatchesJsonType(Api::WORKING_HOURS_VIEW_JSON_FORMAT);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?php /** @noinspection PhpUnused */
|
||||||
|
|
||||||
|
namespace TorstenHettstedt\TimekeepingApi\Tests\Api\Views;
|
||||||
|
|
||||||
|
use ApiTester;
|
||||||
|
use Codeception\Util\HttpCode;
|
||||||
|
use Helper\Api;
|
||||||
|
|
||||||
|
class BrowseWorkingHoursWeeklyCest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param ApiTester $I
|
||||||
|
*/
|
||||||
|
public function browseWorkingHoursView(ApiTester $I): void
|
||||||
|
{
|
||||||
|
$I->sendGet('/views/working-hours/weekly');
|
||||||
|
$I->seeResponseCodeIs(HttpCode::OK);
|
||||||
|
$I->seeResponseIsJson();
|
||||||
|
$I->seeResponseMatchesJsonType(Api::WORKING_HOURS_VIEW_JSON_FORMAT);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?php /** @noinspection PhpUnused */
|
||||||
|
|
||||||
|
namespace TorstenHettstedt\TimekeepingApi\Tests\Api\Views;
|
||||||
|
|
||||||
|
use ApiTester;
|
||||||
|
use Codeception\Util\HttpCode;
|
||||||
|
use Helper\Api;
|
||||||
|
|
||||||
|
class BrowseWorkingHoursYearlyCest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param ApiTester $I
|
||||||
|
*/
|
||||||
|
public function browseWorkingHoursView(ApiTester $I): void
|
||||||
|
{
|
||||||
|
$I->sendGet('/views/working-hours/yearly');
|
||||||
|
$I->seeResponseCodeIs(HttpCode::OK);
|
||||||
|
$I->seeResponseIsJson();
|
||||||
|
$I->seeResponseMatchesJsonType(Api::WORKING_HOURS_VIEW_JSON_FORMAT);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<?php /** @noinspection PhpUnused */
|
||||||
|
|
||||||
|
namespace TorstenHettstedt\TimekeepingApi\Tests\Api\WorkingHours;
|
||||||
|
|
||||||
|
use ApiTester;
|
||||||
|
use Codeception\Util\HttpCode;
|
||||||
|
use Helper\Api;
|
||||||
|
|
||||||
|
class BrowseWorkingHoursCest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param ApiTester $I
|
||||||
|
*/
|
||||||
|
public function browseWorkingHours(ApiTester $I): void
|
||||||
|
{
|
||||||
|
$I->sendGet('/working-hours');
|
||||||
|
$I->seeResponseCodeIs(HttpCode::OK);
|
||||||
|
$I->seeResponseIsJson();
|
||||||
|
$I->seeResponseMatchesJsonType(Api::WORKING_HOURS_JSON_FORMAT);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
<?php /** @noinspection PhpUnused */
|
||||||
|
|
||||||
|
namespace TorstenHettstedt\TimekeepingApi\Tests\Api\WorkingHours;
|
||||||
|
|
||||||
|
use ApiTester;
|
||||||
|
use Codeception\Util\HttpCode;
|
||||||
|
use Helper\Api;
|
||||||
|
|
||||||
|
class CreateWorkingHoursCest
|
||||||
|
{
|
||||||
|
public function createWorkingHoursWithNewValidRecord(ApiTester $I): void
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('accept', 'application/json');
|
||||||
|
$I->haveHttpHeader('content-type', 'application/json');
|
||||||
|
$I->sendPost('/working-hours', [
|
||||||
|
'date' => '2020-04-01',
|
||||||
|
'workingHours' => '08:00:00',
|
||||||
|
]);
|
||||||
|
$I->seeResponseCodeIs(HttpCode::CREATED);
|
||||||
|
$I->seeResponseIsJson();
|
||||||
|
$I->seeResponseMatchesJsonType(Api::WORKING_HOURS_JSON_FORMAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
// tests
|
||||||
|
public function createWorkingHoursWithNewInvalidRecord(ApiTester $I): void
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('accept', 'application/json');
|
||||||
|
$I->haveHttpHeader('content-type', 'application/json');
|
||||||
|
$I->sendPost('/working-hours', [
|
||||||
|
'date' => '2020-04-01',
|
||||||
|
'workingHours' => 8.0,
|
||||||
|
]);
|
||||||
|
$I->seeResponseCodeIs(HttpCode::BAD_REQUEST);
|
||||||
|
$I->seeResponseIsJson();
|
||||||
|
$I->seeResponseMatchesJsonType(Api::ERROR_JSON_FORMAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
// tests
|
||||||
|
public function createWorkingHoursWithExistingValidRecord(ApiTester $I): void
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('accept', 'application/json');
|
||||||
|
$I->haveHttpHeader('content-type', 'application/json');
|
||||||
|
$I->sendPost('/working-hours', [
|
||||||
|
'date' => '2020-01-15',
|
||||||
|
'workingHours' => '08:00:00',
|
||||||
|
]);
|
||||||
|
$I->seeResponseCodeIs(HttpCode::CONFLICT);
|
||||||
|
$I->seeResponseIsJson();
|
||||||
|
$I->seeResponseMatchesJsonType(Api::ERROR_JSON_FORMAT);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
<?php /** @noinspection PhpUnused */
|
||||||
|
|
||||||
|
namespace TorstenHettstedt\TimekeepingApi\Tests\Api\WorkingHours;
|
||||||
|
|
||||||
|
use ApiTester;
|
||||||
|
use Codeception\Util\HttpCode;
|
||||||
|
use Helper\Api;
|
||||||
|
|
||||||
|
class ReadWorkingHoursCest
|
||||||
|
{
|
||||||
|
public function readExistingWorkingHours(ApiTester $I): void
|
||||||
|
{
|
||||||
|
$I->sendGet('/working-hours/2020-01-15');
|
||||||
|
$I->seeResponseCodeIs(HttpCode::OK);
|
||||||
|
$I->seeResponseIsJson();
|
||||||
|
$I->seeResponseMatchesJsonType(Api::WORKING_HOURS_JSON_FORMAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function readNotExistingWorkingHours(ApiTester $I): void
|
||||||
|
{
|
||||||
|
$I->sendGet('/working-hours/2020-04-15');
|
||||||
|
$I->seeResponseCodeIs(HttpCode::NOT_FOUND);
|
||||||
|
$I->seeResponseIsJson();
|
||||||
|
$I->seeResponseMatchesJsonType(Api::ERROR_JSON_FORMAT);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
<?php /** @noinspection PhpUnused */
|
||||||
|
|
||||||
|
namespace TorstenHettstedt\TimekeepingApi\Tests\Api\WorkingHours;
|
||||||
|
|
||||||
|
use ApiTester;
|
||||||
|
use Codeception\Util\HttpCode;
|
||||||
|
use Helper\Api;
|
||||||
|
|
||||||
|
class UpdateWorkingHoursCest
|
||||||
|
{
|
||||||
|
public function updateWorkingHoursWithExistingValidRecord(ApiTester $I): void
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('accept', 'application/json');
|
||||||
|
$I->haveHttpHeader('content-type', 'application/json');
|
||||||
|
$I->sendPut('/working-hours/2020-01-15', [
|
||||||
|
'date' => '2020-01-15',
|
||||||
|
'workingHours' => '10:00:00',
|
||||||
|
]);
|
||||||
|
$I->seeResponseCodeIs(HttpCode::OK);
|
||||||
|
$I->seeResponseIsJson();
|
||||||
|
$I->seeResponseMatchesJsonType(Api::WORKING_HOURS_JSON_FORMAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateWorkingHoursWithNewValidRecord(ApiTester $I): void
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('accept', 'application/json');
|
||||||
|
$I->haveHttpHeader('content-type', 'application/json');
|
||||||
|
$I->sendPut('/working-hours/2020-01-15', [
|
||||||
|
'date' => '2020-04-15',
|
||||||
|
'workingHours' => '10:00:00',
|
||||||
|
]);
|
||||||
|
$I->seeResponseCodeIs(HttpCode::NOT_FOUND);
|
||||||
|
$I->seeResponseIsJson();
|
||||||
|
$I->seeResponseMatchesJsonType(Api::ERROR_JSON_FORMAT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateWorkingHoursWithNewInvalidRecord(ApiTester $I): void
|
||||||
|
{
|
||||||
|
$I->haveHttpHeader('accept', 'application/json');
|
||||||
|
$I->haveHttpHeader('content-type', 'application/json');
|
||||||
|
$I->sendPut('/working-hours/2020-01-15', [
|
||||||
|
'date' => '2020-01-15',
|
||||||
|
'workingHours' => 8.0,
|
||||||
|
]);
|
||||||
|
$I->seeResponseCodeIs(HttpCode::BAD_REQUEST);
|
||||||
|
$I->seeResponseIsJson();
|
||||||
|
$I->seeResponseMatchesJsonType(Api::ERROR_JSON_FORMAT);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user