dolibarr  19.0.0-dev
MyModuleFunctionalTest.php
1 <?php
2 /* Copyright (C) 2007-2017 Laurent Destailleur <eldy@users.sourceforge.net>
3  * Copyright (C) ---Put here your own copyright and developer email---
4  *
5  * This program is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <https://www.gnu.org/licenses/>.
17  */
18 
27 namespace test\functional;
28 
29 use PHPUnit_Extensions_Selenium2TestCase_WebDriverException;
30 
45 {
46  // TODO: move to a global configuration file?
48  protected static $base_url = 'http://dev.zenfusion.fr';
53  protected static $dol_admin_user = 'admin';
58  protected static $dol_admin_pass = 'admin';
60  private static $module_id = 500000; // TODO: autodetect?
61 
63  public static $browsers = array(
64  array(
65  'browser' => 'Google Chrome on Linux',
66  'browserName' => 'chrome',
67  'sessionStrategy' => 'shared',
68  'desiredCapabilities' => array()
69  ),
70  // Geckodriver does not keep the session at the moment?!
71  // XPath selectors also don't seem to work
72  //array(
73  // 'browser' => 'Mozilla Firefox on Linux',
74  // 'browserName' => 'firefox',
75  // 'sessionStrategy' => 'shared',
76  // 'desiredCapabilities' => array(
77  // 'marionette' => true,
78  // ),
79  //)
80  );
81 
88  protected function byHref($value)
89  {
90  $anchor = null;
91  $anchors = $this->elements($this->using('tag name')->value('a'));
92  foreach ($anchors as $anchor) {
93  if (strstr($anchor->attribute('href'), $value)) {
94  break;
95  }
96  }
97  return $anchor;
98  }
99 
104  public static function setUpBeforeClass()
105  {
106  }
107 
112  public function setUp()
113  {
114  $this->setSeleniumServerRequestsTimeout(3600);
115  $this->setBrowserUrl(self::$base_url);
116  }
117 
122  protected function assertPreConditions()
123  {
124  }
125 
130  private function authenticate()
131  {
132  try {
133  if ($this->byId('login')) {
134  $login = $this->byId('username');
135  $login->clear();
136  $login->value('admin');
137  $password = $this->byId('password');
138  $password->clear();
139  $password->value('admin');
140  $this->byId('login')->submit();
141  }
142  } catch (PHPUnit_Extensions_Selenium2TestCase_WebDriverException $e) {
143  // Login does not exist. Assume we are already authenticated
144  }
145  }
146 
151  public function testEnableDeveloperMode()
152  {
153  $this->url('/admin/const.php');
154  $this->authenticate();
155  $main_features_level_path = '//input[@value="MAIN_FEATURES_LEVEL"]/following::input[@type="text"]';
156  $main_features_level = $this->byXPath($main_features_level_path);
157  $main_features_level->clear();
158  $main_features_level->value('2');
159  $this->byName('update')->click();
160  // Page reloaded, we need a new XPath
161  $main_features_level = $this->byXPath($main_features_level_path);
162  return $this->assertEquals('2', $main_features_level->value(), "MAIN_FEATURES_LEVEL value is 2");
163  }
164 
171  public function testModuleEnabled()
172  {
173  $this->url('/admin/modules.php');
174  $this->authenticate();
175  $module_status_image_path = '//a[contains(@href, "'.self::$module_id.'")]/img';
176  $module_status_image = $this->byXPath($module_status_image_path);
177  if (strstr($module_status_image->attribute('src'), 'switch_off.png')) {
178  // Enable the module
179  $this->byHref('modMyModule')->click();
180  } else {
181  // Disable the module
182  $this->byHref('modMyModule')->click();
183  // Reenable the module
184  $this->byHref('modMyModule')->click();
185  }
186  // Page reloaded, we need a new Xpath
187  $module_status_image = $this->byXPath($module_status_image_path);
188  return $this->assertContains('switch_on.png', $module_status_image->attribute('src'), "Module enabled");
189  }
190 
197  public function testConfigurationPage()
198  {
199  $this->url('/custom/mymodule/admin/setup.php');
200  $this->authenticate();
201  return $this->assertContains('mymodule/admin/setup.php', $this->url(), 'Configuration page');
202  }
203 
210  public function testAboutPage()
211  {
212  $this->url('/custom/mymodule/admin/about.php');
213  $this->authenticate();
214  return $this->assertContains('mymodule/admin/about.php', $this->url(), 'About page');
215  }
216 
224  {
225  $this->url('/custom/mymodule/admin/about.php');
226  $this->authenticate();
227  return $this->assertEquals(
228  'Dolibarr Module Template (aka My Module)',
229  $this->byTag('h1')->text(),
230  "Readme title"
231  );
232  }
233 
240  public function testBoxDeclared()
241  {
242  $this->url('/admin/boxes.php');
243  $this->authenticate();
244  return $this->assertContains('mymodulewidget1', $this->source(), "Box enabled");
245  }
246 
253  public function testTriggerDeclared()
254  {
255  $this->url('/admin/triggers.php');
256  $this->authenticate();
257  return $this->assertContains(
258  'interface_99_modMyModule_MyModuleTriggers.class.php',
259  $this->byTag('body')->text(),
260  "Trigger declared"
261  );
262  }
263 
270  public function testTriggerEnabled()
271  {
272  $this->url('/admin/triggers.php');
273  $this->authenticate();
274  return $this->assertContains(
275  'tick.png',
276  $this->byXPath('//td[text()="interface_99_modMyModule_MyTrigger.class.php"]/following::img')->attribute('src'),
277  "Trigger enabled"
278  );
279  }
280 
285  protected function assertPostConditions()
286  {
287  }
288 
293  public function tearDown()
294  {
295  }
296 
301  public static function tearDownAfterClass()
302  {
303  }
304 }
static tearDownAfterClass()
Global test teardown.
testAboutPage()
Test access to the about page.
testEnableDeveloperMode()
Test enabling developer mode.
testTriggerDeclared()
Test trigger is properly enabled.
testAboutPageRendersMarkdownReadme()
Test about page is rendering Markdown.
byHref($value)
Helper function to select links by href.
testBoxDeclared()
Test box is properly declared.
authenticate()
Handle Dolibarr authentication.
testConfigurationPage()
Test access to the configuration page.
testTriggerEnabled()
Test trigger is properly declared.