Skip to content

Commit 066098b

Browse files
committed
Refactor Nette module
1 parent d58fa2b commit 066098b

File tree

5 files changed

+103
-43
lines changed

5 files changed

+103
-43
lines changed

src/Connector/Nette.php

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
use Arachne\Codeception\Http\Response as HttpResponse;
1515
use Exception;
1616
use Nette\Application\Application;
17-
use Nette\DI\Container;
1817
use Nette\Http\IRequest;
1918
use Nette\Http\IResponse;
2019
use Symfony\Component\BrowserKit\Client;
@@ -27,13 +26,13 @@
2726
class Nette extends Client
2827
{
2928
/**
30-
* @var Container
29+
* @var callable
3130
*/
32-
protected $container;
31+
protected $containerAccessor;
3332

34-
public function setContainer(Container $container)
33+
public function setContainerAccessor(callable $containerAccessor)
3534
{
36-
$this->container = $container;
35+
$this->containerAccessor = $containerAccessor;
3736
}
3837

3938
/**
@@ -55,12 +54,14 @@ public function doRequest($request)
5554
$_GET = $request->getParameters();
5655
$_POST = [];
5756
} else {
58-
$_POST = $request->getParameters();
5957
$_GET = [];
58+
$_POST = $request->getParameters();
6059
}
6160

62-
$httpRequest = $this->container->getByType(IRequest::class);
63-
$httpResponse = $this->container->getByType(IResponse::class);
61+
$container = call_user_func($this->containerAccessor);
62+
63+
$httpRequest = $container->getByType(IRequest::class);
64+
$httpResponse = $container->getByType(IResponse::class);
6465
if (!$httpRequest instanceof HttpRequest || !$httpResponse instanceof HttpResponse) {
6566
throw new Exception('Arachne\Codeception\DI\CodeceptionExtension is not used or conflicts with another extension.');
6667
}
@@ -69,7 +70,7 @@ public function doRequest($request)
6970

7071
try {
7172
ob_start();
72-
$this->container->getByType(Application::class)->run();
73+
$container->getByType(Application::class)->run();
7374
$content = ob_get_clean();
7475
} catch (Exception $e) {
7576
ob_end_clean();

src/Module/Nette.php

Lines changed: 87 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,42 +11,113 @@
1111
namespace Arachne\Codeception\Module;
1212

1313
use Arachne\Codeception\Connector\Nette as NetteConnector;
14-
use Codeception\Exception\ModuleConfigException;
1514
use Codeception\Lib\Framework;
1615
use Codeception\TestCase;
16+
use Nette\Configurator;
17+
use Nette\DI\Container;
1718
use Nette\DI\MissingServiceException;
19+
use Nette\Utils\FileSystem;
1820

1921
/**
2022
* @author Jáchym Toušek <enumag@gmail.com>
2123
*/
2224
class Nette extends Framework
2325
{
24-
public static $containerClass;
25-
2626
protected $config = [
2727
'followRedirects' => true,
28+
'configFiles' => [],
29+
'logDir' => null,
30+
'debugMode' => null,
31+
'configurator' => Configurator::class,
32+
];
33+
34+
protected $requiredFields = [
35+
'tempDir',
2836
];
2937

38+
/**
39+
* @var array
40+
*/
41+
private $configFiles;
42+
43+
/**
44+
* @var Container
45+
*/
46+
private $container;
47+
48+
/**
49+
* @var callable
50+
*/
51+
private $containerAccessor;
52+
53+
/**
54+
* @var string
55+
*/
56+
private $path;
57+
58+
public function _beforeSuite($settings = [])
59+
{
60+
$this->path = $settings['path'];
61+
}
62+
3063
public function _before(TestCase $test)
3164
{
32-
if (!class_exists(self::$containerClass)) {
33-
throw new ModuleConfigException(__CLASS__, 'Specify container class in bootstrap.');
34-
}
35-
$this->container = new self::$containerClass();
36-
$this->container->initialize();
65+
$this->configFiles = null;
66+
$this->container = null;
67+
$this->containerAccessor = function () {
68+
if (!$this->container) {
69+
$configurator = new $this->config['configurator']();
70+
71+
if ($this->config['logDir']) {
72+
$configurator->enableDebugger($this->path.'/'.$this->config['logDir']);
73+
}
74+
75+
$tempDir = $this->path.'/'.$this->config['tempDir'];
76+
FileSystem::delete($tempDir);
77+
FileSystem::createDir($tempDir);
78+
$configurator->setTempDirectory($tempDir);
79+
80+
if ($this->config['debugMode'] !== null) {
81+
$configurator->setDebugMode($this->config['debugMode']);
82+
}
83+
84+
$configFiles = is_array($this->configFiles) ? $this->configFiles : $this->config['configFiles'];
85+
foreach ($configFiles as $file) {
86+
$configurator->addConfig($this->path.'/'.$file, false);
87+
}
88+
89+
$this->container = $configurator->createContainer();
90+
}
91+
92+
return $this->container;
93+
};
94+
3795
$this->client = new NetteConnector();
38-
$this->client->setContainer($this->container);
96+
$this->client->setContainerAccessor($this->containerAccessor);
3997
$this->client->followRedirects($this->config['followRedirects']);
98+
4099
parent::_before($test);
41100
}
42101

102+
public function useConfigFiles(array $configFiles)
103+
{
104+
if ($this->container) {
105+
$this->fail('Can\'t set configFiles after the container is created.');
106+
}
107+
$this->configFiles = $configFiles;
108+
}
109+
43110
public function _after(TestCase $test)
44111
{
45112
parent::_after($test);
46113

47-
try {
48-
$this->container->getByType('Nette\Http\Session')->close();
49-
} catch (MissingServiceException $e) {
114+
if ($this->container) {
115+
try {
116+
$this->container->getByType('Nette\Http\Session')->close();
117+
} catch (MissingServiceException $e) {
118+
}
119+
120+
FileSystem::delete($this->container->getParameters()['tempDir']);
50121
}
51122

52123
$_SESSION = [];
@@ -64,7 +135,7 @@ public function _after(TestCase $test)
64135
public function grabService($service)
65136
{
66137
try {
67-
return $this->container->getByType($service);
138+
return call_user_func($this->containerAccessor)->getByType($service);
68139
} catch (MissingServiceException $e) {
69140
$this->fail($e->getMessage());
70141
}
@@ -75,8 +146,9 @@ public function seeRedirectTo($url)
75146
if ($this->config['followRedirects']) {
76147
$this->fail('Method seeRedirectTo only works when followRedirects option is disabled');
77148
}
78-
$request = $this->container->getByType('Nette\Http\IRequest');
79-
$response = $this->container->getByType('Nette\Http\IResponse');
149+
$container = call_user_func($this->containerAccessor);
150+
$request = $container->getByType('Nette\Http\IRequest');
151+
$response = $container->getByType('Nette\Http\IResponse');
80152
if ($response->getHeader('Location') !== $request->getUrl()->getHostUrl().$url && $response->getHeader('Location') !== $url) {
81153
$this->fail('Couldn\'t confirm redirect target to be "'.$url.'", Location header contains "'.$response->getHeader('Location').'".');
82154
}

tests/integration.suite.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,7 @@ modules:
66
enabled:
77
- Arachne\Codeception\Module\Nette:
88
followRedirects: false
9+
configurator: Arachne\Bootstrap\Configurator
10+
tempDir: ../_temp/integration
11+
configFiles:
12+
- config/config.neon

tests/integration/_bootstrap.php

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1 @@
11
<?php
2-
3-
use Arachne\Bootstrap\Configurator;
4-
use Arachne\Codeception\Module\Nette;
5-
6-
$configurator = new Configurator();
7-
$configurator->enableDebugger(__DIR__.'/../_log');
8-
$configurator->setTempDirectory(__DIR__.'/../_temp');
9-
$configurator->setDebugMode(true);
10-
11-
// Create Dependency Injection container from config.neon file
12-
$configurator->addConfig(__DIR__.'/config/config.neon', false);
13-
14-
// Don't use this instance for anything else than console commands!
15-
$container = $configurator->createContainer();
16-
Nette::$containerClass = get_class($container);
17-
18-
return $container;

tests/integration/config/config.neon

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
extensions:
22
codeception: Arachne\Codeception\DI\CodeceptionExtension
3-
nette.application: Nette\Bridges\ApplicationDI\ApplicationExtension
3+
nette.application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, [], %tempDir%)
44
nette.http: Nette\Bridges\HttpDI\HttpExtension
5-
nette.latte: Nette\Bridges\ApplicationDI\LatteExtension
5+
nette.latte: Nette\Bridges\ApplicationDI\LatteExtension(%tempDir%, %debugMode%)
66
enumag.application: Enumag\Application\DI\ApplicationExtension
77

88
services:

0 commit comments

Comments
 (0)