123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593 |
- <?php
- use Behat\Gherkin\Node\TableNode;
- use Behat\MinkExtension\Context\MinkContext;
- /**
- * Features context. (MinkContext extends BehatContext)
- */
- class FeatureContext extends MinkContext
- {
- /**
- * Initializes context.
- * Every scenario gets its own context object.
- */
- public function __construct()
- {
- }
- /**
- * @Given /^I am a platform administrator$/
- */
- public function iAmAPlatformAdministrator()
- {
- $this->visit('/index.php?logout=logout&uid=1');
- $this->iAmOnHomepage();
- $this->fillField('login', 'admin');
- $this->fillField('password', 'admin');
- $this->pressButton('submitAuth');
- $this->getSession()->back();
- }
- /**
- * @Given /^I am a teacher$/
- */
- public function iAmATeacher()
- {
- $this->visit('/index.php?logout=logout');
- $this->iAmOnHomepage();
- $this->fillField('login', 'mmosquera');
- $this->fillField('password', 'mmosquera');
- $this->pressButton('submitAuth');
- }
- /**
- * @Given /^I am a student$/
- */
- public function iAmAStudent()
- {
- $this->visit('/index.php?logout=logout');
- $this->iAmOnHomepage();
- $this->fillField('login', 'acostea');
- $this->fillField('password', 'acostea');
- $this->pressButton('submitAuth');
- }
- /**
- * @Given /^I am an HR manager$/
- */
- public function iAmAnHR()
- {
- $this->visit('/index.php?logout=logout');
- $this->iAmOnHomepage();
- $this->fillField('login', 'ptook');
- $this->fillField('password', 'ptook');
- $this->pressButton('submitAuth');
- }
- /**
- * @Given /^I am a student boss$/
- */
- public function iAmAStudentBoss()
- {
- $this->visit('/index.php?logout=logout');
- $this->iAmOnHomepage();
- $this->fillField('login', 'abaggins');
- $this->fillField('password', 'abaggins');
- $this->pressButton('submitAuth');
- }
- /**
- * @Given /^I am an invitee$/
- */
- public function iAmAnInvitee()
- {
- $this->visit('/index.php?logout=logout');
- $this->iAmOnHomepage();
- $this->fillField('login', 'bproudfoot');
- $this->fillField('password', 'bproudfoot');
- $this->pressButton('submitAuth');
- }
- /**
- * @Given /^course "([^"]*)" exists$/
- */
- public function courseExists($argument)
- {
- $this->iAmAPlatformAdministrator();
- $this->visit('/main/admin/course_list.php?keyword='.$argument);
- $this->assertPageContainsText($argument);
- }
- /**
- * @Given /^course "([^"]*)" is deleted$/
- */
- public function courseIsDeleted($argument)
- {
- $this->iAmAPlatformAdministrator();
- $this->visit('/main/admin/course_list.php?keyword='.$argument);
- $this->clickLink('Delete');
- }
- /**
- * @Given /^I am on course "([^"]*)" homepage$/
- */
- public function iAmOnCourseXHomepage($courseCode)
- {
- $this->visit('/courses/'.$courseCode.'/index.php');
- $this->assertElementNotOnPage('.alert-danger');
- }
- /**
- * @Given /^I am on course "([^"]*)" homepage in session "([^"]*)"$/
- */
- public function iAmOnCourseXHomepageInSessionY($courseCode, $sessionName)
- {
- $this->visit('/main/course_home/redirect.php?cidReq='.$courseCode.'&session_name='.$sessionName);
- }
- /**
- * @Given /^I am a "([^"]*)" user$/
- */
- public function iAmAXUser($argument)
- {
- $this->visit('/main/auth/profile.php');
- $this->assertFieldContains('language', $argument);
- }
- /**
- * @Given /^I am logged as "([^"]*)"$/
- */
- public function iAmLoggedAs($username)
- {
- $this->visit('/index.php?logout=logout');
- $this->iAmOnHomepage();
- $this->fillFields(
- new TableNode(
- [
- ['login', $username],
- ['password', $username],
- ]
- )
- );
- $this->pressButton('submitAuth');
- }
- /**
- * @Given /^I have a friend named "([^"]*)" with id "([^"]*)"$/
- */
- public function iHaveAFriend($friendUsername, $friendId)
- {
- $adminId = 1;
- $friendId = $friendId;
- $friendUsername = $friendUsername;
- $sendInvitationURL = '/main/inc/ajax/message.ajax.php?'.
- http_build_query(
- [
- 'a' => 'send_invitation',
- 'user_id' => $friendId,
- 'content' => 'Add me',
- ]
- );
- $acceptInvitationURL = '/main/inc/ajax/social.ajax.php?'.
- http_build_query(
- [
- 'a' => 'add_friend',
- 'friend_id' => $adminId,
- 'is_my_friend' => 'friend',
- ]
- );
- $this->iAmAPlatformAdministrator();
- $this->visit($sendInvitationURL);
- $this->iAmLoggedAs($friendUsername);
- $this->visit($acceptInvitationURL);
- $this->iAmAPlatformAdministrator();
- }
- /**
- * @Given /^I have a public password-protected course named "([^"]*)" with password "([^"]*)"$/
- */
- public function iHaveAPublicPasswordProtectedCourse($code, $password)
- {
- $this->visit('/main/admin/course_add.php');
- $this->fillFields(
- new TableNode(
- [
- ['title', 'Password Protected'],
- ['visual_code', $code],
- ['visibility', 3],
- ]
- )
- );
- $this->pressButton('submit');
- $this->visit('/main/course_info/infocours.php?cidReq='.$code);
- $this->assertPageContainsText('Course registration password');
- $this->fillField('course_registration_password', $password);
- $this->pressButton('submit_save');
- $this->assertFieldContains('course_registration_password', $password);
- }
- /**
- * @Given /^I am not logged$/
- */
- public function iAmNotLogged()
- {
- $this->visit('/index.php?logout=logout');
- $this->visit('I am on homepage');
- }
- /**
- * @When /^I invite to a friend with id "([^"]*)" to a social group with id "([^"]*)"$/
- */
- public function iInviteAFriendToASocialGroup($friendId, $groupId)
- {
- $this->visit('/main/social/group_invitation.php?id='.$groupId);
- $this->fillField('invitation[]', $friendId);
- $this->pressButton('submit');
- }
- /**
- * Sometimes the top admin toolbar has form buttons
- * that conflicts with the main page forms so we need
- * to disable it
- * @Given /^Admin top bar is disabled$/
- */
- public function adminTopBarIsDisabled()
- {
- $this->iAmAPlatformAdministrator();
- $this->visit('/main/admin/settings.php');
- $this->fillField('search_field', 'show_admin_toolbar');
- $this->pressButton('submit_button');
- $this->selectOption('show_admin_toolbar', 'do_not_show');
- $this->pressButton('submit');
- }
- /**
- * @Given /^Admin top bar is enabled$/
- */
- public function adminTopBarIsEnabled()
- {
- $this->iAmAPlatformAdministrator();
- $this->visit('/main/admin/settings.php');
- $this->fillField('search_field', 'show_admin_toolbar');
- $this->pressButton('submit_button');
- $this->selectOption('show_admin_toolbar', 'show_to_admin_and_teachers');
- $this->pressButton('submit');
- }
- /**
- * @Given /^I am on the social group members page with id "([^"]*)"$/
- */
- public function iAmOnSocialGroupMembersPageWithId($groupId)
- {
- $this->visit('/main/social/group_view.php?id='.$groupId);
- }
- /**
- * @When /^I try delete a friend with id "([^"]*)" from the social group with id "([^"]*)"$/
- */
- public function iTryDeleteAFriendFromSocialGroup($friendId, $groupId)
- {
- $this->visit(
- '/main/social/group_members.php?'.http_build_query(
- [
- 'id' => $groupId,
- 'u' => $friendId,
- 'action' => 'delete',
- ]
- )
- );
- }
- /**
- * @Then /^I fill in ckeditor field "([^"]*)" with "([^"]*)"$/
- */
- public function iFillInWysiwygOnFieldWith($locator, $value)
- {
- // Just in case wait that ckeditor is loaded
- $this->getSession()->wait(2000);
- $el = $this->getSession()->getPage()->findField($locator);
- $fieldId = $el->getAttribute('id');
- if (empty($fieldId)) {
- throw new Exception(
- 'Could not find an id for field with locator: '.$locator
- );
- }
- $this->getSession()->executeScript(
- "CKEDITOR.instances[\"$fieldId\"].setData(\"$value\");"
- );
- }
- /**
- * @Given /^I fill hidden field "([^"]*)" with "([^"]*)"$/
- */
- public function iFillHiddenFieldWith($field, $value)
- {
- $this->getSession()->getPage()->find(
- 'css',
- 'input[name="'.$field.'"]'
- )->setValue($value);
- }
- /**
- * @When /^(?:|I )fill in select2 input "(?P<field>(?:[^"]|\\")*)" with id "(?P<id>(?:[^"]|\\")*)" and value "(?P<value>(?:[^"]|\\")*)"$/
- */
- public function iFillInSelectInputWithAndSelect($field, $id, $value)
- {
- $this->getSession()->executeScript("$('$field').select2({data : [{id: $id, text: '$value'}]});");
- }
- /**
- * @When /^(?:|I )confirm the popup$/
- */
- public function confirmPopup()
- {
- // See
- // https://gist.github.com/blazarecki/2888851
- /** @var \Behat\Mink\Driver\Selenium2Driver $driver Needed because no cross-driver way yet */
- $this->getSession()->getDriver()->getWebDriverSession()->accept_alert();
- }
- /**
- * @When /^(?:|I )fill in select bootstrap input "(?P<field>(?:[^"]|\\")*)" with "(?P<value>(?:[^"]|\\")*)" and select "(?P<entry>(?:[^"]|\\")*)"$/
- */
- public function iFillInSelectBootstrapInputWithAndSelect($field, $value, $entry)
- {
- $page = $this->getSession()->getPage();
- $inputField = $page->find('css', $field);
- if (!$inputField) {
- throw new \Exception('No field found');
- }
- $choice = $inputField->getParent()->find('css', '.bootstrap-select');
- if (!$choice) {
- throw new \Exception('No select bootstrap choice found');
- }
- $choice->press();
- $selectInput = $inputField->getParent()->find('css', '.bootstrap-select .form-control');
- if (!$selectInput) {
- throw new \Exception('No input found');
- }
- $selectInput->setValue($value);
- $this->getSession()->wait(3000);
- $chosenResults = $inputField->getParent()->findAll('css', '.dropdown-menu inner li');
- foreach ($chosenResults as $result) {
- //$option = $result->find('css', '.text');
- if ($result->getText() == $entry) {
- $result->click();
- break;
- }
- }
- }
- /**
- * @When /^(?:|I )fill in select bootstrap static input "(?P<field>(?:[^"]|\\")*)" select "(?P<value>(?:[^"]|\\")*)"$/
- */
- public function iFillInSelectStaticBootstrapInputWithAndSelect($field, $value)
- {
- $this->getSession()->wait(1000);
- $this->getSession()->executeScript("
- $(function() {
- $('$field').selectpicker('val', '$value');
- });
- ");
- }
- /**
- * @When /^(?:|I )fill in select bootstrap static by text "(?P<field>(?:[^"]|\\")*)" select "(?P<value>(?:[^"]|\\")*)"$/
- */
- public function iFillInSelectStaticBootstrapInputWithAndSelectByText($field, $value)
- {
- $this->getSession()->wait(1000);
- $this->getSession()->executeScript("
- $('$field > option').each(function(index, option) {
- if (option.text == '$value') {
- $('$field').selectpicker('val', option.value);
- }
- });
- ");
- }
- /**
- * @When /^wait for the page to be loaded$/
- */
- public function waitForThePageToBeLoaded()
- {
- $this->getSession()->wait(3000);
- }
- /**
- * @When /^wait very long for the page to be loaded$/
- */
- public function waitVeryLongForThePageToBeLoaded()
- {
- //$this->getSession()->wait(10000, "document.readyState === 'complete'");
- $this->getSession()->wait(8000);
- }
- /**
- * @When /^I check the "([^"]*)" radio button$/
- */
- public function iCheckTheRadioButton($radioLabel)
- {
- $radioButton = $this->getSession()->getPage()->findField($radioLabel);
- if (null === $radioButton) {
- throw new Exception("Cannot find radio button ".$radioLabel);
- }
- //$value = $radioButton->getAttribute('value');
- $this->getSession()->getDriver()->click($radioButton->getXPath());
- }
- /**
- * @When /^I check radio button with label "([^"]*)"$/
- */
- public function iCheckTheRadioButtonWithLabel($label)
- {
- $this->getSession()->executeScript("
- $(function() {
- $(':contains(\$label\")').parent().find('input').prop('checked', true);
- });
- ");
- }
- /**
- * @When /^I press advanced settings$/
- */
- public function iSelectFromSelectWithLabel()
- {
- $this->pressButton('Advanced settings');
- }
- /**
- * Clicks link with specified id|title|alt|text
- * Example: When I follow "Log In"
- * Example: And I follow "Log In"
- *
- * @When /^(?:|I )focus "(?P<link>(?:[^"]|\\")*)"$/
- */
- public function focus($input)
- {
- $input = $this->getSession()->getPage()->findField($input);
- $input->focus();
- }
- /**
- * @Given /^I check the "([^"]*)" radio button with "([^"]*)" value$/
- */
- public function iCheckTheRadioButtonWithValue($element, $value)
- {
- $this->getSession()->executeScript("
- $(function() {
- $('input[type=\"radio\"][name=".$element."][value=".$value."]').prop('checked', true);
- });
- ");
- return true;
- }
- /**
- * @Then /^I should see an icon with title "([^"]*)"$/
- */
- public function iShouldSeeAnIconWithTitle($value)
- {
- $el = $this->getSession()->getPage()->find('xpath', "//img[@title='$value']");
- if (null === $el) {
- throw new Exception(
- 'Could not find an icon with title: '.$value
- );
- }
- return true;
- }
- /**
- * @Then /^I should not see an icon with title "([^"]*)"$/
- */
- public function iShouldNotSeeAnIconWithTitle($value)
- {
- $el = $this->getSession()->getPage()->find('xpath', "//img[@title='$value']");
- if (null === $el) {
- return true;
- }
- return false;
- }
- /**
- * @Then /^I save current URL with name "([^"]*)"$/
- */
- public function saveUrlWithName($name)
- {
- $url = $this->getSession()->getCurrentUrl();
- $this->getSession()->setCookie($name, $url);
- }
- /**
- * @Then /^I visit URL saved with name "([^"]*)"$/
- */
- public function visitSavedUrlWithName($name)
- {
- $url = $this->getSession()->getCookie($name);
- echo $url;
- if (empty($url)) {
- throw new Exception("Url with name: $name not found");
- }
- $this->visit($url);
- }
- /**
- * Example: Then I should see the table "#category_results":
- * | Categories | Absolute score | Relative score |
- * | Categoryname2 | 50 / 70 | 71.43% |
- * | Categoryname1 | 60 / 60 | 100% |
- *
- * @Then /^I should see the table "([^"]*)":$/
- *
- * @param string $tableId
- * @param TableNode $tableData
- *
- * @throws Exception
- */
- public function assertPageContainsTable($tableId, TableNode $tableData)
- {
- $table = $this->getSession()->getPage()->find('css', $tableId);
- $rows = $tableData->getRowsHash();
- $i = 1;
- $right = array_keys($rows);
- foreach ($right as $text) {
- $cell = $table->find('css', 'tr:nth-child('.$i.') :nth-child(1)');
- $i++;
- if (!$cell) {
- throw new Exception('Cell not found.');
- }
- if ($cell->getText() != $text) {
- throw new Exception('Table text not found.');
- }
- }
- $i = 1;
- foreach ($rows as $field => $cols) {
- if (is_array($cols)) {
- $j = 2;
- foreach ($cols as $col) {
- $cell = $table->find('css', 'tr:nth-child('.$i.') :nth-child('.$j.')');
- $j++;
- if (!$cell) {
- throw new Exception('Cell not found.');
- }
- if ($cell->getText() != $col) {
- throw new Exception('Table text not found. Found "'.$cell->getText().'" <> "'.$col.'"');
- }
- }
- } else {
- $cell = $table->find('css', 'tr:nth-child('.$i.') :nth-child(2)');
- if (!$cell) {
- throw new Exception('Cell not found.');
- }
- if ($cell->getText() != $cols) {
- throw new Exception('Table text not found. Found "'.$cell->getText().'" <> "'.$cols.'"');
- }
- }
- $i++;
- }
- }
- }
|