diff options
author | ArthurHoaro <arthur@hoa.ro> | 2016-01-12 19:50:48 +0100 |
---|---|---|
committer | ArthurHoaro <arthur@hoa.ro> | 2016-02-15 20:30:24 +0100 |
commit | 510377d2cb4b12d1a421e8a88bd7edb86f223451 (patch) | |
tree | 6cea29c199fc1b29ccfb78f902313019f6f9d95e /tests/Updater | |
parent | 268a2e52659964fb7d033a1bb4d1490bf8cc49bf (diff) | |
download | Shaarli-510377d2cb4b12d1a421e8a88bd7edb86f223451.tar.gz Shaarli-510377d2cb4b12d1a421e8a88bd7edb86f223451.tar.zst Shaarli-510377d2cb4b12d1a421e8a88bd7edb86f223451.zip |
Introduce the Updater class which
* contains methods designed to be run once.
* is able to upgrade the datastore or the configuration.
* is based on methods names, stored in a text file with ';' separator (updates.txt).
* begins with existing function 'mergeDeprecatedConfigFile()' (options.php).
Diffstat (limited to 'tests/Updater')
-rw-r--r-- | tests/Updater/DummyUpdater.php | 68 | ||||
-rw-r--r-- | tests/Updater/UpdaterTest.php | 227 |
2 files changed, 295 insertions, 0 deletions
diff --git a/tests/Updater/DummyUpdater.php b/tests/Updater/DummyUpdater.php new file mode 100644 index 00000000..e9ef2aaa --- /dev/null +++ b/tests/Updater/DummyUpdater.php | |||
@@ -0,0 +1,68 @@ | |||
1 | <?php | ||
2 | |||
3 | require_once 'application/Updater.php'; | ||
4 | |||
5 | /** | ||
6 | * Class DummyUpdater. | ||
7 | * Extends Updater to add update method designed for unit tests. | ||
8 | */ | ||
9 | class DummyUpdater extends Updater | ||
10 | { | ||
11 | /** | ||
12 | * Object constructor. | ||
13 | * | ||
14 | * @param array $doneUpdates Updates which are already done. | ||
15 | * @param array $config Shaarli's configuration array. | ||
16 | * @param LinkDB $linkDB LinkDB instance. | ||
17 | * @param boolean $isLoggedIn True if the user is logged in. | ||
18 | */ | ||
19 | public function __construct($doneUpdates, $config, $linkDB, $isLoggedIn) | ||
20 | { | ||
21 | parent::__construct($doneUpdates, $config, $linkDB, $isLoggedIn); | ||
22 | |||
23 | // Retrieve all update methods. | ||
24 | // For unit test, only retrieve final methods, | ||
25 | $class = new ReflectionClass($this); | ||
26 | $this->methods = $class->getMethods(ReflectionMethod::IS_FINAL); | ||
27 | } | ||
28 | |||
29 | /** | ||
30 | * Update method 1. | ||
31 | * | ||
32 | * @return bool true. | ||
33 | */ | ||
34 | private final function updateMethodDummy1() | ||
35 | { | ||
36 | return true; | ||
37 | } | ||
38 | |||
39 | /** | ||
40 | * Update method 2. | ||
41 | * | ||
42 | * @return bool true. | ||
43 | */ | ||
44 | private final function updateMethodDummy2() | ||
45 | { | ||
46 | return true; | ||
47 | } | ||
48 | |||
49 | /** | ||
50 | * Update method 3. | ||
51 | * | ||
52 | * @return bool true. | ||
53 | */ | ||
54 | private final function updateMethodDummy3() | ||
55 | { | ||
56 | return true; | ||
57 | } | ||
58 | |||
59 | /** | ||
60 | * Update method 4, raise an exception. | ||
61 | * | ||
62 | * @throws Exception error. | ||
63 | */ | ||
64 | private final function updateMethodException() | ||
65 | { | ||
66 | throw new Exception('whatever'); | ||
67 | } | ||
68 | } | ||
diff --git a/tests/Updater/UpdaterTest.php b/tests/Updater/UpdaterTest.php new file mode 100644 index 00000000..63ed5e03 --- /dev/null +++ b/tests/Updater/UpdaterTest.php | |||
@@ -0,0 +1,227 @@ | |||
1 | <?php | ||
2 | |||
3 | require_once 'tests/Updater/DummyUpdater.php'; | ||
4 | |||
5 | /** | ||
6 | * Class UpdaterTest. | ||
7 | * Runs unit tests against the Updater class. | ||
8 | */ | ||
9 | class UpdaterTest extends PHPUnit_Framework_TestCase | ||
10 | { | ||
11 | /** | ||
12 | * @var array Configuration input set. | ||
13 | */ | ||
14 | private static $configFields; | ||
15 | |||
16 | /** | ||
17 | * Executed before each test. | ||
18 | */ | ||
19 | public function setUp() | ||
20 | { | ||
21 | self::$configFields = array( | ||
22 | 'login' => 'login', | ||
23 | 'hash' => 'hash', | ||
24 | 'salt' => 'salt', | ||
25 | 'timezone' => 'Europe/Paris', | ||
26 | 'title' => 'title', | ||
27 | 'titleLink' => 'titleLink', | ||
28 | 'redirector' => '', | ||
29 | 'disablesessionprotection' => false, | ||
30 | 'privateLinkByDefault' => false, | ||
31 | 'config' => array( | ||
32 | 'CONFIG_FILE' => 'tests/Updater/config.php', | ||
33 | 'DATADIR' => 'tests/Updater', | ||
34 | 'config1' => 'config1data', | ||
35 | 'config2' => 'config2data', | ||
36 | ) | ||
37 | ); | ||
38 | } | ||
39 | |||
40 | /** | ||
41 | * Executed after each test. | ||
42 | * | ||
43 | * @return void | ||
44 | */ | ||
45 | public function tearDown() | ||
46 | { | ||
47 | if (is_file(self::$configFields['config']['CONFIG_FILE'])) { | ||
48 | unlink(self::$configFields['config']['CONFIG_FILE']); | ||
49 | } | ||
50 | |||
51 | if (is_file(self::$configFields['config']['DATADIR'] . '/options.php')) { | ||
52 | unlink(self::$configFields['config']['DATADIR'] . '/options.php'); | ||
53 | } | ||
54 | |||
55 | if (is_file(self::$configFields['config']['DATADIR'] . '/updates.json')) { | ||
56 | unlink(self::$configFields['config']['DATADIR'] . '/updates.json'); | ||
57 | } | ||
58 | } | ||
59 | |||
60 | /** | ||
61 | * Test read_updates_file with an empty/missing file. | ||
62 | */ | ||
63 | public function testReadEmptyUpdatesFile() | ||
64 | { | ||
65 | $this->assertEquals(array(), read_updates_file('')); | ||
66 | $updatesFile = self::$configFields['config']['DATADIR'] . '/updates.json'; | ||
67 | touch($updatesFile); | ||
68 | $this->assertEquals(array(), read_updates_file($updatesFile)); | ||
69 | } | ||
70 | |||
71 | /** | ||
72 | * Test read/write updates file. | ||
73 | */ | ||
74 | public function testReadWriteUpdatesFile() | ||
75 | { | ||
76 | $updatesFile = self::$configFields['config']['DATADIR'] . '/updates.json'; | ||
77 | $updatesMethods = array('m1', 'm2', 'm3'); | ||
78 | |||
79 | write_updates_file($updatesFile, $updatesMethods); | ||
80 | $readMethods = read_updates_file($updatesFile); | ||
81 | $this->assertEquals($readMethods, $updatesMethods); | ||
82 | |||
83 | // Update | ||
84 | $updatesMethods[] = 'm4'; | ||
85 | write_updates_file($updatesFile, $updatesMethods); | ||
86 | $readMethods = read_updates_file($updatesFile); | ||
87 | $this->assertEquals($readMethods, $updatesMethods); | ||
88 | } | ||
89 | |||
90 | /** | ||
91 | * Test errors in write_updates_file(): empty updates file. | ||
92 | * | ||
93 | * @expectedException Exception | ||
94 | * @expectedExceptionMessageRegExp /Updates file path is not set(.*)/ | ||
95 | */ | ||
96 | public function testWriteEmptyUpdatesFile() | ||
97 | { | ||
98 | write_updates_file('', array('test')); | ||
99 | } | ||
100 | |||
101 | /** | ||
102 | * Test errors in write_updates_file(): not writable updates file. | ||
103 | * | ||
104 | * @expectedException Exception | ||
105 | * @expectedExceptionMessageRegExp /Unable to write(.*)/ | ||
106 | */ | ||
107 | public function testWriteUpdatesFileNotWritable() | ||
108 | { | ||
109 | $updatesFile = self::$configFields['config']['DATADIR'] . '/updates.json'; | ||
110 | touch($updatesFile); | ||
111 | chmod($updatesFile, 0444); | ||
112 | @write_updates_file($updatesFile, array('test')); | ||
113 | } | ||
114 | |||
115 | /** | ||
116 | * Test the update() method, with no update to run. | ||
117 | * 1. Everything already run. | ||
118 | * 2. User is logged out. | ||
119 | */ | ||
120 | public function testNoUpdates() | ||
121 | { | ||
122 | $updates = array( | ||
123 | 'updateMethodDummy1', | ||
124 | 'updateMethodDummy2', | ||
125 | 'updateMethodDummy3', | ||
126 | 'updateMethodException', | ||
127 | ); | ||
128 | $updater = new DummyUpdater($updates, array(), array(), true); | ||
129 | $this->assertEquals(array(), $updater->update()); | ||
130 | |||
131 | $updater = new DummyUpdater(array(), array(), array(), false); | ||
132 | $this->assertEquals(array(), $updater->update()); | ||
133 | } | ||
134 | |||
135 | /** | ||
136 | * Test the update() method, with all updates to run (except the failing one). | ||
137 | */ | ||
138 | public function testUpdatesFirstTime() | ||
139 | { | ||
140 | $updates = array('updateMethodException',); | ||
141 | $expectedUpdates = array( | ||
142 | 'updateMethodDummy1', | ||
143 | 'updateMethodDummy2', | ||
144 | 'updateMethodDummy3', | ||
145 | ); | ||
146 | $updater = new DummyUpdater($updates, array(), array(), true); | ||
147 | $this->assertEquals($expectedUpdates, $updater->update()); | ||
148 | } | ||
149 | |||
150 | /** | ||
151 | * Test the update() method, only one update to run. | ||
152 | */ | ||
153 | public function testOneUpdate() | ||
154 | { | ||
155 | $updates = array( | ||
156 | 'updateMethodDummy1', | ||
157 | 'updateMethodDummy3', | ||
158 | 'updateMethodException', | ||
159 | ); | ||
160 | $expectedUpdate = array('updateMethodDummy2'); | ||
161 | |||
162 | $updater = new DummyUpdater($updates, array(), array(), true); | ||
163 | $this->assertEquals($expectedUpdate, $updater->update()); | ||
164 | } | ||
165 | |||
166 | /** | ||
167 | * Test Update failed. | ||
168 | * | ||
169 | * @expectedException UpdaterException | ||
170 | */ | ||
171 | public function testUpdateFailed() | ||
172 | { | ||
173 | $updates = array( | ||
174 | 'updateMethodDummy1', | ||
175 | 'updateMethodDummy2', | ||
176 | 'updateMethodDummy3', | ||
177 | ); | ||
178 | |||
179 | $updater = new DummyUpdater($updates, array(), array(), true); | ||
180 | $updater->update(); | ||
181 | } | ||
182 | |||
183 | /** | ||
184 | * Test update mergeDeprecatedConfig: | ||
185 | * 1. init a config file. | ||
186 | * 2. init a options.php file with update value. | ||
187 | * 3. merge. | ||
188 | * 4. check updated value in config file. | ||
189 | */ | ||
190 | public function testUpdateMergeDeprecatedConfig() | ||
191 | { | ||
192 | // init | ||
193 | writeConfig(self::$configFields, true); | ||
194 | $configCopy = self::$configFields; | ||
195 | $invert = !$configCopy['privateLinkByDefault']; | ||
196 | $configCopy['privateLinkByDefault'] = $invert; | ||
197 | |||
198 | // Use writeConfig to create a options.php | ||
199 | $configCopy['config']['CONFIG_FILE'] = 'tests/Updater/options.php'; | ||
200 | writeConfig($configCopy, true); | ||
201 | |||
202 | $this->assertTrue(is_file($configCopy['config']['CONFIG_FILE'])); | ||
203 | |||
204 | // merge configs | ||
205 | $updater = new Updater(array(), self::$configFields, array(), true); | ||
206 | $updater->updateMethodMergeDeprecatedConfigFile(); | ||
207 | |||
208 | // make sure updated field is changed | ||
209 | include self::$configFields['config']['CONFIG_FILE']; | ||
210 | $this->assertEquals($invert, $GLOBALS['privateLinkByDefault']); | ||
211 | $this->assertFalse(is_file($configCopy['config']['CONFIG_FILE'])); | ||
212 | } | ||
213 | |||
214 | /** | ||
215 | * Test mergeDeprecatedConfig in without options file. | ||
216 | */ | ||
217 | public function testMergeDeprecatedConfigNoFile() | ||
218 | { | ||
219 | writeConfig(self::$configFields, true); | ||
220 | |||
221 | $updater = new Updater(array(), self::$configFields, array(), true); | ||
222 | $updater->updateMethodMergeDeprecatedConfigFile(); | ||
223 | |||
224 | include self::$configFields['config']['CONFIG_FILE']; | ||
225 | $this->assertEquals(self::$configFields['login'], $GLOBALS['login']); | ||
226 | } | ||
227 | } | ||