aboutsummaryrefslogtreecommitdiffstats
path: root/tests/functional/extension_controller_test.php
blob: 1755843398b792a98c73c7716664d43237f0822d (plain)
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
/**
*
* @package testing
* @copyright (c) 2011 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/

/**
* @group functional
*/
class phpbb_functional_extension_controller_test extends phpbb_functional_test_case
{
	protected $phpbb_extension_manager;

	static protected $fixtures = array(
		'foo/bar/config/routing.yml',
		'foo/bar/config/services.yml',
		'foo/bar/controller/controller.php',
		'foo/bar/styles/prosilver/template/foo_bar_body.html',
	);

	/**
	* This should only be called once before the tests are run.
	* This is used to copy the fixtures to the phpBB install
	*/
	static public function setUpBeforeClass()
	{
		global $phpbb_root_path;
		parent::setUpBeforeClass();

		$directories = array(
			$phpbb_root_path . 'ext/foo/bar/',
			$phpbb_root_path . 'ext/foo/bar/config/',
			$phpbb_root_path . 'ext/foo/bar/controller/',
			$phpbb_root_path . 'ext/foo/bar/styles/prosilver/template',
		);

		foreach ($directories as $dir)
		{
			if (!is_dir($dir))
			{
				mkdir($dir, 0777, true);
			}
		}

		foreach (self::$fixtures as $fixture)
		{
			copy(
				"tests/functional/fixtures/ext/$fixture",
				"{$phpbb_root_path}ext/$fixture");
		}
	}

	/**
	* This should only be called once after the tests are run.
	* This is used to remove the fixtures from the phpBB install
	*/
	static public function tearDownAfterClass()
	{
		global $phpbb_root_path;

		foreach (self::$fixtures as $fixture)
		{
			unlink("{$phpbb_root_path}ext/$fixture");
		}

		rmdir("{$phpbb_root_path}ext/foo/bar/config");
		rmdir("{$phpbb_root_path}ext/foo/bar/controller");
		rmdir("{$phpbb_root_path}ext/foo/bar/styles/prosilver/template");
		rmdir("{$phpbb_root_path}ext/foo/bar/styles/prosilver");
		rmdir("{$phpbb_root_path}ext/foo/bar/styles");
		rmdir("{$phpbb_root_path}ext/foo/bar");
		rmdir("{$phpbb_root_path}ext/foo");
	}

	public function setUp()
	{
		parent::setUp();

		$this->phpbb_extension_manager = $this->get_extension_manager();

		$this->purge_cache();
	}

	/**
	* Check a controller for extension foo/bar.
	*/
	public function test_foo_bar()
	{
		$this->phpbb_extension_manager->enable('foo/bar');
		$crawler = $this->request('GET', 'app.php?controller=foo/bar');
		$this->assertContains("foo/bar controller handle() method", $crawler->filter('body')->text());
		$this->phpbb_extension_manager->purge('foo/bar');
	}

	/**
	* Check the output of a controller using the template system
	*/
	public function test_controller_with_template()
	{
		$this->phpbb_extension_manager->enable('foo/bar');
		$crawler = $this->request('GET', 'app.php?controller=foo/template');
		$this->assertContains("I am a variable", $crawler->filter('#content')->text());
		$this->phpbb_extension_manager->purge('foo/bar');
	}

	/**
	* Check the error produced by calling a controller without a required
	* argument.
	*/
	public function test_missing_argument()
	{
		$this->phpbb_extension_manager->enable('foo/bar');
		$crawler = $this->request('GET', 'app.php?controller=foo/baz', false);
		$this->request('GET', 'app.php?controller=foo/baz', false);
		$this->assert_response_success(500);
		$this->assertContains('Missing value for argument #1: test in class phpbb_ext_foo_bar_controller:baz', $crawler->filter('body')->text());
		$this->phpbb_extension_manager->purge('foo/bar');
	}

	/**
	* Check the status code resulting from an exception thrown by a controller
	*/
	public function test_exception_should_result_in_500_status_code()
	{
		$this->phpbb_extension_manager->enable('foo/bar');
		$crawler = $this->request('GET', 'app.php?controller=foo/exception', false);
		$this->assert_response_success(500);
		$this->assertContains('Exception thrown from foo/exception route', $crawler->filter('body')->text());
		$this->phpbb_extension_manager->purge('foo/bar');
	}

	/**
	* Check the error produced by extension at ./ext/does/not/exist.
	*
	* If an extension is disabled, its routes are not loaded. Because we
	* are not looking for a controller based on a specified extension,
	* we don't know the difference between a route in a disabled
	* extension and a route that is not defined anyway; it is the same
	* error message.
	*/
	public function test_error_ext_disabled_or_404()
	{
		$crawler = $this->request('GET', 'app.php?controller=does/not/exist', false);
		$this->assert_response_success(404);
		$this->assertContains('No route found for "GET /does/not/exist"', $crawler->filter('body')->text());
	}
}