+
+Submitting a simple form
+
+
+ When a page is fetched by the WebTestCase + using get() or + post() the page content is + automatically parsed. + This results in any form controls that are inside <form> tags + being available from within the test case. + For example, if we have this snippet of HTML... +
+<form> + <input type="text" name="a" value="A default" /> + <input type="submit" value="Go" /> +</form> ++ Which looks like this... + +
+
+ ++ We can navigate to this code, via the + LastCraft + site, with the following test... +
+class SimpleFormTests extends WebTestCase {
+
+ function testDefaultValue() {
+ $this->get('http://www.lastcraft.com/form_testing_documentation.php');
+ $this->assertField('a', 'A default');
+ }
+}
+
+ Immediately after loading the page all of the HTML controls are set at
+ their default values just as they would appear in the web browser.
+ The assertion tests that a HTML widget exists in the page with the
+ name "a" and that it is currently set to the value
+ "A default"
+
+ + We could submit the form straight away, but first we'll change + the value of the text field and only then submit it... +
+class SimpleFormTests extends WebTestCase {
+
+ function testDefaultValue() {
+ $this->get('http://www.my-site.com/');
+ $this->assertField('a', 'A default');
+ $this->setField('a', 'New value');
+ $this->clickSubmit('Go');
+ }
+}
+
+ Because we didn't specify a method attribute on the form tag, and
+ didn't specify an action either, the test case will follow
+ the usual browser behaviour of submitting the form data as a GET
+ request back to the same location.
+ SimpleTest tries to emulate typical browser behaviour as much as possible,
+ rather than attempting to catch missing attributes on tags.
+ This is because the target of the testing framework is the PHP application
+ logic, not syntax or other errors in the HTML code.
+ For HTML errors, other tools such as
+ HTMLTidy should be used.
+
+ + If a field is not present in any form, or if an option is unavailable, + then WebTestCase::setField() will return + false. + For example, suppose we wish to verify that a "Superuser" + option is not present in this form... +
+<strong>Select type of user to add:</strong> +<select name="type"> + <option>Subscriber</option> + <option>Author</option> + <option>Administrator</option> +</select> ++ Which looks like... + +
+
+ ++ The following test will confirm it... +
+class SimpleFormTests extends WebTestCase {
+ ...
+ function testNoSuperuserChoiceAvailable() {
+ $this->get('http://www.lastcraft.com/form_testing_documentation.php');
+ $this->assertFalse($this->setField('type', 'Superuser'));
+ }
+}
+
+ The selection will not be changed on a failure to set
+ a widget value.
+
+ + Here is the full list of widgets currently supported... +
-
+
- Text fields, including hidden and password fields. +
- Submit buttons including the button tag, although not yet reset buttons +
- Text area. This includes text wrapping behaviour. +
- Checkboxes, including multiple checkboxes in the same form. +
- Drop down selections, including multiple selects. +
- Radio buttons. +
- Images. +
+ Although most standard HTML widgets are catered for by SimpleTest's + built in parser, it is unlikely that JavaScript will be implemented + anytime soon. +
+ +
+
+Fields with multiple values
+
+
+ SimpleTest can cope with two types of multivalue controls: Multiple + selection drop downs, and multiple checkboxes with the same name + within a form. + The multivalue nature of these means that setting and testing + are slightly different. + Using checkboxes as an example... +
+<form class="demo"> + <strong>Create privileges allowed:</strong> + <input type="checkbox" name="crud" value="c" checked><br> + <strong>Retrieve privileges allowed:</strong> + <input type="checkbox" name="crud" value="r" checked><br> + <strong>Update privileges allowed:</strong> + <input type="checkbox" name="crud" value="u" checked><br> + <strong>Destroy privileges allowed:</strong> + <input type="checkbox" name="crud" value="d" checked><br> + <input type="submit" value="Enable Privileges"> +</form> ++ Which renders as... + +
+
+ ++ If we wish to disable all but the retrieval privileges and + submit this information we can do it like this... +
+class SimpleFormTests extends WebTestCase {
+ ...
+ function testDisableNastyPrivileges() {
+ $this->get('http://www.lastcraft.com/form_testing_documentation.php');
+ $this->assertField('crud', array('c', 'r', 'u', 'd'));
+ $this->setField('crud', array('r'));
+ $this->clickSubmit('Enable Privileges');
+ }
+}
+
+ Instead of setting the field to a single value, we give it a list
+ of values.
+ We do the same when testing expected values.
+ We can then write other test code to confirm the effect of this, perhaps
+ by logging in as that user and attempting an update.
+
+
+
+Raw posting
+
+
+ If you want to test a form handler, but have not yet written + or do not have access to the form itself, you can create a + form submission by hand. +
+class SimpleFormTests extends WebTestCase {
+ ...
+ function testAttemptedHack() {
+ $this->post(
+ 'http://www.my-site.com/add_user.php',
+ array('type' => 'superuser'));
+ $this->assertNoUnwantedPattern('/user created/i');
+ }
+}
+
+ By adding data to the WebTestCase::post()
+ method, we are attempting to fetch the page as a form submission.
+
+
+