Skip to content

Commit 550dae9

Browse files
committed
Init repo with base functionality
1 parent 3a96690 commit 550dae9

10 files changed

+390
-0
lines changed

.gitignore

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/composer.lock
2+
/composer.phar
3+
/phpunit.xml
4+
/.phpunit.result.cache
5+
/phpunit.phar
6+
/config/Migrations/schema-dump-default.lock
7+
/vendor/
8+
/.idea/

README.md

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# AppVersion plugin for CakePHP
2+
3+
## Installation
4+
5+
You can install this plugin into your CakePHP application using [composer](https://getcomposer.org).
6+
7+
The recommended way to install composer packages is:
8+
9+
```
10+
composer require orca-services/cakephp-app-version
11+
```

composer.json

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"name": "orca-services/cakephp-app-version",
3+
"description": "A CakePHP plugin for adding a configurable app version as an HTTP header",
4+
"keywords": ["CakePHP", "Plugin", "HTTP", "Headers", "Application version"],
5+
"type": "cakephp-plugin",
6+
"license": "MIT",
7+
"require": {
8+
"php": ">=7.4",
9+
"cakephp/cakephp": "^4.0.0"
10+
},
11+
"require-dev": {
12+
"phpunit/phpunit": "^8.5 || ^9.3"
13+
},
14+
"autoload": {
15+
"psr-4": {
16+
"AppVersion\\": "src/"
17+
}
18+
},
19+
"autoload-dev": {
20+
"psr-4": {
21+
"AppVersion\\Test\\": "tests/",
22+
"Cake\\Test\\": "vendor/cakephp/cakephp/tests/"
23+
}
24+
}
25+
}

phpunit.xml.dist

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<phpunit
3+
colors="true"
4+
processIsolation="false"
5+
stopOnFailure="false"
6+
bootstrap="tests/bootstrap.php"
7+
>
8+
<php>
9+
<ini name="memory_limit" value="-1"/>
10+
<ini name="apc.enable_cli" value="1"/>
11+
</php>
12+
13+
<!-- Add any additional test suites you want to run here -->
14+
<testsuites>
15+
<testsuite name="AppVersion">
16+
<directory>tests/TestCase/</directory>
17+
</testsuite>
18+
</testsuites>
19+
20+
<!-- Setup fixture extension -->
21+
<extensions>
22+
<extension class="Cake\TestSuite\Fixture\PHPUnitExtension" />
23+
</extensions>
24+
25+
<filter>
26+
<whitelist>
27+
<directory suffix=".php">src/</directory>
28+
</whitelist>
29+
</filter>
30+
</phpunit>

src/Controller/AppController.php

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace AppVersion\Controller;
5+
6+
use App\Controller\AppController as BaseController;
7+
8+
class AppController extends BaseController
9+
{
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace AppVersion\Middleware;
5+
6+
use Cake\Core\Configure;
7+
use Psr\Http\Message\ResponseInterface;
8+
use Psr\Http\Message\ServerRequestInterface;
9+
use Psr\Http\Server\MiddlewareInterface;
10+
use Psr\Http\Server\RequestHandlerInterface;
11+
12+
/**
13+
* AppVersionHeader middleware
14+
*
15+
* Adds a configurable vendor-prefixed "[vendor]-App-Version" HTTP header
16+
* containing the configured app version.
17+
*
18+
* If the vendor prefix is not set "X" is used.
19+
* If the app version is not set "Unknown" is returned.
20+
*
21+
* If you want to make sure the app version header is returned even in case of an error,
22+
* add this middleware before any error handling middleware.
23+
*/
24+
class AppVersionHeaderMiddleware implements MiddlewareInterface
25+
{
26+
/**
27+
* Add app version header
28+
*
29+
* @param \Psr\Http\Message\ServerRequestInterface $request The request.
30+
* @param \Psr\Http\Server\RequestHandlerInterface $handler The request handler.
31+
* @return \Psr\Http\Message\ResponseInterface A response.
32+
*/
33+
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
34+
{
35+
$response = $handler->handle($request);
36+
37+
$appVersionPrefix = Configure::read('App.versionPrefix', 'X');
38+
$appVersion = Configure::read('App.version', 'Unknown');
39+
40+
$response = $response->withHeader($appVersionPrefix . '-App-Version', $appVersion);
41+
42+
return $response;
43+
}
44+
}

src/Plugin.php

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace AppVersion;
5+
6+
use Cake\Console\CommandCollection;
7+
use Cake\Core\BasePlugin;
8+
use Cake\Core\ContainerInterface;
9+
use Cake\Core\PluginApplicationInterface;
10+
use Cake\Http\MiddlewareQueue;
11+
use Cake\Routing\RouteBuilder;
12+
13+
/**
14+
* Plugin for AppVersion
15+
*/
16+
class AppVersionPlugin extends BasePlugin
17+
{
18+
/**
19+
* Load all the plugin configuration and bootstrap logic.
20+
*
21+
* The host application is provided as an argument. This allows you to load
22+
* additional plugin dependencies, or attach events.
23+
*
24+
* @param \Cake\Core\PluginApplicationInterface $app The host application
25+
* @return void
26+
*/
27+
public function bootstrap(PluginApplicationInterface $app): void
28+
{
29+
}
30+
31+
/**
32+
* Add routes for the plugin.
33+
*
34+
* If your plugin has many routes and you would like to isolate them into a separate file,
35+
* you can create `$plugin/config/routes.php` and delete this method.
36+
*
37+
* @param \Cake\Routing\RouteBuilder $routes The route builder to update.
38+
* @return void
39+
*/
40+
public function routes(RouteBuilder $routes): void
41+
{
42+
$routes->plugin(
43+
'AppVersion',
44+
['path' => '/app-version'],
45+
function (RouteBuilder $builder) {
46+
// Add custom routes here
47+
48+
$builder->fallbacks();
49+
}
50+
);
51+
parent::routes($routes);
52+
}
53+
54+
/**
55+
* Add middleware for the plugin.
56+
*
57+
* @param \Cake\Http\MiddlewareQueue $middlewareQueue The middleware queue to update.
58+
* @return \Cake\Http\MiddlewareQueue
59+
*/
60+
public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
61+
{
62+
// Add your middlewares here
63+
64+
return $middlewareQueue;
65+
}
66+
67+
/**
68+
* Add commands for the plugin.
69+
*
70+
* @param \Cake\Console\CommandCollection $commands The command collection to update.
71+
* @return \Cake\Console\CommandCollection
72+
*/
73+
public function console(CommandCollection $commands): CommandCollection
74+
{
75+
// Add your commands here
76+
77+
$commands = parent::console($commands);
78+
79+
return $commands;
80+
}
81+
82+
/**
83+
* Register application container services.
84+
*
85+
* @param \Cake\Core\ContainerInterface $container The Container to update.
86+
* @return void
87+
* @link https://book.cakephp.org/4/en/development/dependency-injection.html#dependency-injection
88+
*/
89+
public function services(ContainerInterface $container): void
90+
{
91+
// Add your services here
92+
}
93+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace AppVersion\Test\TestCase\Middleware;
5+
6+
use AppVersion\Middleware\AppVersionHeaderMiddleware;
7+
use App\Test\TestCase\TestRequestHandler;
8+
use Cake\Core\Configure;
9+
use Cake\Http\ServerRequest;
10+
use Cake\TestSuite\TestCase;
11+
use Psr\Http\Message\ServerRequestInterface;
12+
use Psr\Http\Server\RequestHandlerInterface;
13+
14+
/**
15+
* AppVersionHeaderMiddleware Test Case
16+
*/
17+
class AppVersionHeaderMiddlewareTest extends TestCase
18+
{
19+
/**
20+
* Test subject
21+
*
22+
* @var \AppVersion\Middleware\AppVersionHeaderMiddleware
23+
*/
24+
protected AppVersionHeaderMiddleware $appVersionHeader;
25+
26+
/** @var ServerRequestInterface|ServerRequest */
27+
protected ServerRequestInterface $request;
28+
29+
/** @var RequestHandlerInterface|TestRequestHandler */
30+
protected RequestHandlerInterface $handler;
31+
32+
/**
33+
* @inheritDoc
34+
*/
35+
public function setUp(): void
36+
{
37+
parent::setUp();
38+
39+
$this->appVersionHeader = new AppVersionHeaderMiddleware();
40+
$this->request = new ServerRequest();
41+
$this->handler = new TestRequestHandler();
42+
}
43+
44+
/**
45+
* Test process method
46+
*
47+
* @return void
48+
* @uses \AppVersion\Middleware\AppVersionHeaderMiddleware::process()
49+
*/
50+
public function testProcess(): void
51+
{
52+
$origAppVersion = Configure::read('App.version');
53+
$origAppVersionPrefix = Configure::read('App.versionPrefix');
54+
55+
$appVersion = '1.2.3';
56+
Configure::write('App.version', $appVersion);
57+
$appVersionPrefix = 'vendor';
58+
Configure::write('App.versionPrefix', $appVersionPrefix);
59+
60+
$response = $this->appVersionHeader->process($this->request, $this->handler);
61+
62+
self::assertSame($appVersion, $response->getHeaderLine($appVersionPrefix . '-App-Version'));
63+
64+
Configure::write('App.version', $origAppVersion);
65+
Configure::write('App.versionPrefix', $origAppVersionPrefix);
66+
}
67+
68+
/**
69+
* Test process method when app version is not set
70+
*
71+
* @return void
72+
* @uses \AppVersion\Middleware\AppVersionHeaderMiddleware::process()
73+
*/
74+
public function testProcessAppVersionNotSet(): void
75+
{
76+
$origAppVersion = Configure::read('App.version');
77+
$origAppVersionPrefix = Configure::read('App.versionPrefix');
78+
79+
Configure::delete('App.version');
80+
$appVersionPrefix = 'vendor';
81+
Configure::write('App.versionPrefix', $appVersionPrefix);
82+
83+
$response = $this->appVersionHeader->process($this->request, $this->handler);
84+
85+
self::assertSame('Unknown', $response->getHeaderLine($appVersionPrefix . '-App-Version'));
86+
87+
Configure::write('App.version', $origAppVersion);
88+
Configure::write('App.versionPrefix', $origAppVersionPrefix);
89+
}
90+
91+
/**
92+
* Test process method when app versionPrefix is not set
93+
*
94+
* @return void
95+
* @uses \AppVersion\Middleware\AppVersionHeaderMiddleware::process()
96+
*/
97+
public function testProcessAppVersionPrefixNotSet(): void
98+
{
99+
$origAppVersion = Configure::read('App.version');
100+
$origAppVersionPrefix = Configure::read('App.versionPrefix');
101+
102+
$appVersion = '1.2.3';
103+
Configure::write('App.version', $appVersion);
104+
Configure::delete('App.versionPrefix');
105+
106+
$response = $this->appVersionHeader->process($this->request, $this->handler);
107+
108+
self::assertSame($appVersion, $response->getHeaderLine('X-App-Version'));
109+
110+
Configure::write('App.version', $origAppVersion);
111+
Configure::write('App.versionPrefix', $origAppVersionPrefix);
112+
}
113+
}

tests/bootstrap.php

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
/**
5+
* Test suite bootstrap for AppVersion.
6+
*
7+
* This function is used to find the location of CakePHP whether CakePHP
8+
* has been installed as a dependency of the plugin, or the plugin is itself
9+
* installed as a dependency of an application.
10+
*/
11+
$findRoot = function ($root) {
12+
do {
13+
$lastRoot = $root;
14+
$root = dirname($root);
15+
if (is_dir($root . '/vendor/cakephp/cakephp')) {
16+
return $root;
17+
}
18+
} while ($root !== $lastRoot);
19+
20+
throw new Exception('Cannot find the root of the application, unable to run tests');
21+
};
22+
$root = $findRoot(__FILE__);
23+
unset($findRoot);
24+
25+
chdir($root);
26+
27+
require_once $root . '/vendor/autoload.php';
28+
29+
/**
30+
* Define fallback values for required constants and configuration.
31+
* To customize constants and configuration remove this require
32+
* and define the data required by your plugin here.
33+
*/
34+
require_once $root . '/vendor/cakephp/cakephp/tests/bootstrap.php';
35+
36+
if (file_exists($root . '/config/bootstrap.php')) {
37+
require $root . '/config/bootstrap.php';
38+
39+
return;
40+
}
41+
42+
/**
43+
* Load schema from a SQL dump file.
44+
*
45+
* If your plugin does not use database fixtures you can
46+
* safely delete this.
47+
*
48+
* If you want to support multiple databases, consider
49+
* using migrations to provide schema for your plugin,
50+
* and using \Migrations\TestSuite\Migrator to load schema.
51+
*/
52+
use Cake\TestSuite\Fixture\SchemaLoader;
53+
54+
// Load a schema dump file.
55+
(new SchemaLoader())->loadSqlFiles('tests/schema.sql', 'test');

tests/schema.sql

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
-- Test database schema for AppVersion

0 commit comments

Comments
 (0)