public function testCreateTree()
 {
     $shop = self::getShop();
     $cm = $shop->getCategoryManager();
     $cats = ['Selenium Tree Root', 'Selenium Child 1', 'Selenium Child 2'];
     $tree = [2];
     $tree[] = $cm->createCategory(['name' => $cats[0], 'parent' => end($tree)]);
     $tree[] = $cm->createCategory(['name' => $cats[1], 'parent' => end($tree)]);
     $tree[] = $cm->createCategory(['name' => $cats[2], 'parent' => end($tree)]);
     // Add our category to blocktopmenu
     $browser = $shop->getBackOfficeNavigator()->visitModuleConfigurationPage('blocktopmenu');
     $browser->click('#availableItems option[value="CAT' . $tree[1] . '"]')->click('#addItem')->click('#module_form_submit_btn');
     $shop->expectStandardSuccessMessage();
     $shop->getFrontOfficeNavigator()->visitHome();
     $found = [];
     $spinner = new Spinner();
     $spinner->assertBecomesTrue(function () use($browser, $cats, &$found) {
         $browser->hover('#block_top_menu a[title="' . $cats[0] . '"]');
         sleep(1);
         $links = $browser->find('#block_top_menu ul.submenu-container a', ['unique' => false]);
         foreach ($links as $n => $link) {
             $text = strtolower(trim($link->getText()));
             if ($text !== '') {
                 $found[$text] = true;
             }
         }
         return count($found) > 0;
     });
     foreach ($cats as $n => $cat) {
         if ($n > 0 && !isset($found[strtolower(trim($cat))])) {
             throw new \PrestaShop\PSTAF\Exception\FailedTestException("Did not find this cat in the topmenu: {$cat}.");
         }
     }
 }
 private function saveProduct()
 {
     $browser = $this->getBrowser();
     $assert = new Spinner('Save button did not appear in time.', 30);
     $assert->assertBecomesTrue(function () use($browser) {
         $browser->clickButtonNamed('submitAddproductAndStay');
         return true;
     });
     $browser->ensureStandardSuccessMessageDisplayed();
 }
 public function testSubdomainsCanBeBound()
 {
     $storeDetailsPage = $this->homePage->visit()->gotoMyStores()->gotoDetails();
     $domain = md5(microtime()) . $this->getSecrets()['subdomain'];
     $storeDetailsPage->bindDomain($domain);
     $detailsPage = $this->homePage->visit()->gotoMyStores()->gotoDetails();
     $spinner = new Spinner('Domain `' . $domain . '` wasn\'t bound in 30 minutes.', 1800, 1000);
     $spinner->assertBecomesTrue(function () use($detailsPage, $domain) {
         $this->getBrowser()->reload();
         return $detailsPage->isDomainActive($domain);
     });
 }
 public function waitFor200($url)
 {
     $spinner = new Spinner('Did not find final FO URL in 1 hour.', 3600, 1000);
     $spinner->assertBecomesTrue(function () use($url) {
         $ch = curl_init($url);
         curl_setopt($ch, CURLOPT_NOBODY, true);
         curl_exec($ch);
         $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
         curl_close($ch);
         return $status == 200;
     });
 }
 public function ensureAnEmailIsSentTo($address, $timeout_in_seconds = 300, array $options = array())
 {
     $spinner = new Spinner("Did not get required email on {$address} after {$timeout_in_seconds}s.", $timeout_in_seconds, 10000);
     $spinner->assertBecomesTrue(function () use($address, $options) {
         $emails = $this->readEmails($address);
         if (isset($options['body']['contains'])) {
             foreach ($emails as $email) {
                 if (false !== strpos($email['body'], $options['body']['contains'])) {
                     return true;
                 }
             }
             return false;
         } else {
             return count($emails) > 0;
         }
     });
     return $this;
 }
 public static function spawnSelenium($headless = false)
 {
     $display = null;
     if ($headless) {
         for ($displayNumber = 10; $displayNumber < 50; ++$displayNumber) {
             try {
                 $xprocess = new Process('Xvfb', [':' . $displayNumber], ['-ac' => ''], ['upid' => true]);
                 $xprocess->run();
                 sleep(1);
             } catch (Exception $e) {
                 // never mind, try next display...
             }
             if ($xprocess->running()) {
                 self::$processesToKill[] = $xprocess;
                 $display = ':' . $displayNumber;
                 break;
             }
         }
     }
     list($process, $port) = self::buildStartProcess();
     self::$processesToKill[] = $process;
     if ($display) {
         $process->setEnv('DISPLAY', $display);
     }
     $process->run(null, 'selenium.log', 'selenium.log');
     if ($process->running()) {
         self::$host = 'http://127.0.0.1:' . $port . '/wd/hub';
         $spinner = new Spinner('Could not automatically start selenium.', 20, 1000);
         $spinner->assertBecomesTrue(function () {
             $ch = curl_init(self::$host . '/status');
             curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
             $status = json_decode(curl_exec($ch), true);
             curl_close($ch);
             return isset($status['status']) && $status['status'] === 0;
         });
     }
     register_shutdown_function(function () {
         self::unSpawnSelenium();
     });
 }
 /**
  * @depends testSubdomainsFromDeletedShopRemainAvailableToCustomer
  */
 public function testDomainsFromDeletedShopCanBeReAssigned($domainsPage)
 {
     $domainsPage->assignDomainToShop(self::getValue('sd1'), self::getValue('uidB'));
     $domainsPage->assignDomainToShop(self::getValue('sd3'), self::getValue('uidB'));
     $spinner = new Spinner('Domains from deleted shop could not be re-assigned to surviving shop.', 1800, 1000);
     $spinner->assertBecomesTrue(function () use($domainsPage) {
         $this->getBrowser()->reload();
         return $domainsPage->isGreen(self::getValue('sd1')) && $domainsPage->isGreen(self::getValue('sd3'));
     });
 }