1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
<?php
namespace Codeception\Module;
use Codeception\Configuration;
use Codeception\Exception\ModuleConfigException;
use Codeception\Lib\Framework;
use Codeception\Lib\Interfaces\DoctrineProvider;
use Codeception\TestInterface;
use Symfony\Component\HttpKernel\Client;
/**
* Module for testing Silex applications like you would regularly do with Silex\WebTestCase.
* This module uses Symfony2 Crawler and HttpKernel to emulate requests and get response.
*
* This module may be considered experimental and require feedback and pull requests from you.
*
* ## Status
*
* * Maintainer: **davert**
* * Stability: **alpha**
* * Contact: davert.codecept@resend.cc
*
* ## Config
*
* * app: **required** - path to Silex bootstrap file.
* * em_service: 'db.orm.em' - use the stated EntityManager to pair with Doctrine Module.
*
* ### Bootstrap File
*
* Bootstrap is the same as [WebTestCase.createApplication](http://silex.sensiolabs.org/doc/testing.html#webtestcase).
*
* ``` php
* <?php
* $app = require __DIR__.'/path/to/app.php';
* $app['debug'] = true;
* unset($app['exception_handler']);
*
* return $app; // optionally
* ?>
* ```
*
* ### Example (`functional.suite.yml`)
*
* modules:
* enabled:
* - Silex:
* app: 'app/bootstrap.php'
*
* ## Public Properties
*
* * app - `Silex\Application` instance received from bootstrap file
*
* Class Silex
* @package Codeception\Module
*/
class Silex extends Framework implements DoctrineProvider
{
/**
* @var \Silex\Application
*/
public $app;
protected $requiredFields = ['app'];
protected $config = [
'em_service' => 'db.orm.em'
];
public function _initialize()
{
if (!file_exists(Configuration::projectDir() . $this->config['app'])) {
throw new ModuleConfigException(__CLASS__, "Bootstrap file {$this->config['app']} not found");
}
$this->loadApp();
}
public function _before(TestInterface $test)
{
$this->loadApp();
$this->client = new Client($this->app);
}
public function _getEntityManager()
{
if (!isset($this->app[$this->config['em_service']])) {
return null;
}
return $this->app[$this->config['em_service']];
}
protected function loadApp()
{
$this->app = require Configuration::projectDir() . $this->config['app'];
// if $app is not returned but exists
if (isset($app)) {
$this->app = $app;
}
if (!isset($this->app)) {
throw new ModuleConfigException(__CLASS__, "\$app instance was not received from bootstrap file");
}
// make doctrine persistent
$db_orm_em = $this->_getEntityManager();
if ($db_orm_em) {
$this->app->extend($this->config['em_service'], function () use ($db_orm_em) {
return $db_orm_em;
});
}
// some Silex apps (like Bolt) may rely on global $app variable
$GLOBALS['app'] = $this->app;
}
/**
* Return an instance of a class from the Container.
*
* Example
* ``` php
* <?php
* $I->grabService('session');
* ?>
* ```
*
* @param string $service
* @return mixed
*/
public function grabService($service)
{
return $this->app[$service];
}
/**
* Returns a list of recognized domain names
*
* @return array
*/
public function getInternalDomains()
{
$internalDomains = [];
foreach ($this->app['routes'] as $route) {
if ($domain = $route->getHost()) {
$internalDomains[] = '/^' . preg_quote($domain, '/') . '$/';
}
}
return $internalDomains;
}
}