diff --git a/phpcs.xml b/phpcs.xml index fa281b1..af02220 100644 --- a/phpcs.xml +++ b/phpcs.xml @@ -13,6 +13,9 @@ before the method parameter documentation. --> + + + diff --git a/src/Palantirnet/PalantirBehatExtension/Context/FieldContext.php b/src/Palantirnet/PalantirBehatExtension/Context/FieldContext.php new file mode 100644 index 0000000..df4df3a --- /dev/null +++ b/src/Palantirnet/PalantirBehatExtension/Context/FieldContext.php @@ -0,0 +1,161 @@ +. For example, "body" + * checks for the existence of the element, "#edit-body". Note, for almost + * everything this will begin with "field-", like "field-tags". + * + * @Then the form at :path has the expected fields: + * @Then the content type :type has the expected fields: + * + * @param TableNode $fieldsTable A table of fields to check with field types. + * @param String $path The path to the form to check fields on. + * @param String $content_type Optional content type to derive the form path from. + * | field | tag | type | + * | title | input | text | + * | body | textarea | | + * | field-subheadline | input | text | + * | field-author | input | text | + * | field-summary | textarea | | + * | field-full-text | textarea | | + * | field-ref-sections | select | | + * + * @return bool + * @throws \Exception + */ + public function assertFields(TableNode $fieldsTable, $path = '', $content_type = '') + { + // Load the page with the form on it. + if (true === empty($path)) { + $path = 'node/add/'.$content_type; + } + + $this->getSession()->visit($this->locatePath($path)); + $page = $this->getSession()->getPage(); + + foreach ($fieldsTable->getHash() as $row) { + $fieldSelector = '#edit-'.$row['field']; + $page->hasField($fieldSelector); + $this->assertFieldType('#edit-'.$row['field'], $row['tag'], $row['type']); + } + + return true; + + } + + + /** + * Test a field on the page to see if it matches the expected HTML field type. + * + * @Then the ":field" field is ":tag" + * @Then the ":field" field is ":tag" with type ":type" + * + * @param string $field Field selector used when testing this field. + * @param string $expectedTag Expected tag for this field. + * @param string $expectedType Expected "type" used with this field. + * + * @return bool + * @throws Exception + */ + public function assertFieldType($field, $expectedTag, $expectedType = '') + { + $callback = 'assert'.ucfirst($expectedTag); + if (false === method_exists($this, $callback)) { + throw new Exception(sprintf('%s is not a field tag we know how to validate.', $expectedTag)); + } + + $this->$callback($field, $expectedType); + + return true; + + } + + + /** + * Verify the field is a textarea. + * + * @param string $field Field selector used when testing this field. + * @param string $expectedType Expected "type" used with this field. + * + * @return bool + * @throws Exception + */ + public function assertTextarea($field, $expectedType = '') + { + $element = $this->getSession()->getPage()->find('css', $field); + if (null === $element->find('css', 'textarea.form-textarea')) { + throw new Exception(sprintf("Couldn't find %s of type textarea.", $field)); + } + + return true; + + } + + + /** + * Verify the field is an input field of the given type. + * + * @param string $field Field selector used when testing this field. + * @param string $expectedType Expected "type" used with this field. + * + * @return bool + * @throws Exception + */ + public function assertInput($field, $expectedType = '') + { + $element = $this->getSession()->getPage()->find('css', $field); + if (null === $element || null === $element->find('css', 'input[type="'.$expectedType.'"]')) { + throw new Exception(sprintf("Couldn't find %s of type %s", $field, $expectedType)); + } + + return true; + + } + + + /** + * Verify the field is a select list. + * + * @param string $field Field selector used when testing this field. + * @param string $expectedType Expected "type" used with this field. + * + * @return bool + * @throws Exception + */ + public function assertSelect($field, $expectedType = '') + { + $element = $this->getSession()->getPage()->find('css', $field); + if (null === $element->find('css', 'select.form-select')) { + throw new Exception(sprintf("Couldn't find %s of type select.", $field)); + } + + // Verify that the select list is not part of a multivalue widget. + if (false === $element->find('css', 'select.form-select')->isVisible()) { + throw new Exception(sprintf("Couldn't find %s of type select.", $field)); + } + + return true; + + } + + +}