[Phpmyadmin-git] [SCM] phpMyAdmin branch, master, updated. RELEASE_3_4_3_1-11695-g8489f41

Rouslan Placella roccivic at users.sourceforge.net
Fri Jul 22 12:57:21 CEST 2011


The branch, master has been updated
       via  8489f415c944a41524bfec1c8e388b0572958882 (commit)
      from  60fdffbafaa32ba629638894f42403d34b53de20 (commit)


- Log -----------------------------------------------------------------
commit 8489f415c944a41524bfec1c8e388b0572958882
Author: Rouslan Placella <rouslan at placella.com>
Date:   Fri Jul 22 11:54:03 2011 +0100

    Added unit tests for Routines, Triggers and Events

-----------------------------------------------------------------------

Summary of changes:
 phpunit.xml.dist                                   |    1 +
 .../rte/PMA_EVN_getDataFromRequest_test.php        |  104 +++
 test/libraries/rte/PMA_EVN_getEditorForm_test.php  |  445 ++++++++++
 .../rte/PMA_EVN_getQueryFromRequest_test.php       |  144 ++++
 .../libraries/rte/PMA_RTN_ParameterParser_test.php |  163 ++++
 .../rte/PMA_RTN_getDataFromRequest_test.php        |  197 +++++
 test/libraries/rte/PMA_RTN_getEditorForm_test.php  |  885 ++++++++++++++++++++
 test/libraries/rte/PMA_RTN_getExecuteForm_test.php |  244 ++++++
 .../rte/PMA_RTN_getQueryFromRequest_test.php       |  247 ++++++
 .../rte/PMA_TRI_getDataFromRequest_test.php        |   78 ++
 test/libraries/rte/PMA_TRI_getEditorForm_test.php  |  289 +++++++
 .../rte/PMA_TRI_getQueryFromRequest_test.php       |  103 +++
 12 files changed, 2900 insertions(+), 0 deletions(-)
 create mode 100644 test/libraries/rte/PMA_EVN_getDataFromRequest_test.php
 create mode 100644 test/libraries/rte/PMA_EVN_getEditorForm_test.php
 create mode 100644 test/libraries/rte/PMA_EVN_getQueryFromRequest_test.php
 create mode 100644 test/libraries/rte/PMA_RTN_ParameterParser_test.php
 create mode 100644 test/libraries/rte/PMA_RTN_getDataFromRequest_test.php
 create mode 100644 test/libraries/rte/PMA_RTN_getEditorForm_test.php
 create mode 100644 test/libraries/rte/PMA_RTN_getExecuteForm_test.php
 create mode 100644 test/libraries/rte/PMA_RTN_getQueryFromRequest_test.php
 create mode 100644 test/libraries/rte/PMA_TRI_getDataFromRequest_test.php
 create mode 100644 test/libraries/rte/PMA_TRI_getEditorForm_test.php
 create mode 100644 test/libraries/rte/PMA_TRI_getQueryFromRequest_test.php

diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index 41782b7..2d65b67 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -35,6 +35,7 @@
             <file>test/Environment_test.php</file>
             <directory suffix="_test.php">test/libraries/core</directory>
             <directory suffix="_test.php">test/libraries/common</directory>
+            <directory suffix="_test.php">test/libraries/rte</directory>
             <directory suffix="_test.php">test/libraries</directory>
         </testsuite>
         <!--<testsuite name="Selenium">-->
diff --git a/test/libraries/rte/PMA_EVN_getDataFromRequest_test.php b/test/libraries/rte/PMA_EVN_getDataFromRequest_test.php
new file mode 100644
index 0000000..382ade5
--- /dev/null
+++ b/test/libraries/rte/PMA_EVN_getDataFromRequest_test.php
@@ -0,0 +1,104 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Test for fetching event data from HTTP request
+ *
+ * @package phpMyAdmin-test
+ */
+
+/*
+ * Include to test.
+ */
+require_once 'libraries/rte/rte_events.lib.php';
+
+class PMA_EVN_getDataFromRequest_test extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider provider
+     */
+    public function testgetDataFromRequest_empty($in, $out)
+    {
+        global $_REQUEST;
+
+        unset($_REQUEST);
+        foreach ($in as $key => $value) {
+            if ($value !== '') {
+                $_REQUEST[$key] = $value;
+            }
+        }
+        $this->assertEquals($out, PMA_EVN_getDataFromRequest());
+    }
+
+    public function provider()
+    {
+        return array(
+            array(
+                array(
+                    'item_name'           => '',
+                    'item_type'           => '',
+                    'item_original_name'  => '',
+                    'item_status'         => '',
+                    'item_execute_at'     => '',
+                    'item_interval_value' => '',
+                    'item_interval_field' => '',
+                    'item_starts'         => '',
+                    'item_ends'           => '',
+                    'item_definition'     => '',
+                    'item_preserve'       => '',
+                    'item_comment'        => '',
+                    'item_definer'        => ''
+                ),
+                array(
+                    'item_name'           => '',
+                    'item_type'           => 'ONE TIME',
+                    'item_type_toggle'    => 'RECURRING',
+                    'item_original_name'  => '',
+                    'item_status'         => '',
+                    'item_execute_at'     => '',
+                    'item_interval_value' => '',
+                    'item_interval_field' => '',
+                    'item_starts'         => '',
+                    'item_ends'           => '',
+                    'item_definition'     => '',
+                    'item_preserve'       => '',
+                    'item_comment'        => '',
+                    'item_definer'        => ''
+                )
+            ),
+            array(
+                array(
+                    'item_name'           => 'foo',
+                    'item_type'           => 'RECURRING',
+                    'item_original_name'  => 'foo',
+                    'item_status'         => 'foo',
+                    'item_execute_at'     => 'foo',
+                    'item_interval_value' => 'foo',
+                    'item_interval_field' => 'foo',
+                    'item_starts'         => 'foo',
+                    'item_ends'           => 'foo',
+                    'item_definition'     => 'foo',
+                    'item_preserve'       => 'foo',
+                    'item_comment'        => 'foo',
+                    'item_definer'        => 'foo'
+                ),
+                array(
+                    'item_name'           => 'foo',
+                    'item_type'           => 'RECURRING',
+                    'item_type_toggle'    => 'ONE TIME',
+                    'item_original_name'  => 'foo',
+                    'item_status'         => 'foo',
+                    'item_execute_at'     => 'foo',
+                    'item_interval_value' => 'foo',
+                    'item_interval_field' => 'foo',
+                    'item_starts'         => 'foo',
+                    'item_ends'           => 'foo',
+                    'item_definition'     => 'foo',
+                    'item_preserve'       => 'foo',
+                    'item_comment'        => 'foo',
+                    'item_definer'        => 'foo'
+                )
+            ),
+        );
+    }
+}
+?>
diff --git a/test/libraries/rte/PMA_EVN_getEditorForm_test.php b/test/libraries/rte/PMA_EVN_getEditorForm_test.php
new file mode 100644
index 0000000..4480f9e
--- /dev/null
+++ b/test/libraries/rte/PMA_EVN_getEditorForm_test.php
@@ -0,0 +1,445 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Test for generating event editor
+ *
+ * @package phpMyAdmin-test
+ */
+require_once 'libraries/php-gettext/gettext.inc';
+require_once 'libraries/url_generating.lib.php';
+require_once 'libraries/common.lib.php';
+/*
+ * Include to test.
+ */
+require_once 'libraries/rte/rte_events.lib.php';
+
+class PMA_EVN_getEditorForm_test extends PHPUnit_Framework_TestCase
+{
+    public function setUp()
+    {
+        if (! function_exists('PMA_DBI_get_tables')) {
+            function PMA_DBI_get_tables($db)
+            {
+                return array('table1', 'table`2');
+            }
+        }
+        $GLOBALS['tear_down']['token'] = false;
+        $GLOBALS['tear_down']['server'] = false;
+        if (! isset($_SESSION[' PMA_token '])) {
+            $_SESSION[' PMA_token '] = '';
+            $GLOBALS['tear_down']['token'] = true;
+        }
+        if (! isset($GLOBALS['cfg']['ServerDefault'])) {
+            $GLOBALS['cfg']['ServerDefault'] = '';
+            $GLOBALS['tear_down']['server'] = true;
+        }
+    }
+
+    public function tearDown()
+    {
+        if ($GLOBALS['tear_down']['token']) {
+            unset($_SESSION[' PMA_token ']);
+        }
+        if ($GLOBALS['tear_down']['server']) {
+            unset($GLOBALS['cfg']['ServerDefault']);
+        }
+        unset($GLOBALS['tear_down']);
+    }
+
+    /**
+     * @dataProvider provider_add
+     */
+    public function testgetEditorForm_add($data, $matcher)
+    {
+        $GLOBALS['is_ajax_request'] = false;
+        PMA_EVN_setGlobals();
+        $this->assertTag($matcher, PMA_EVN_getEditorForm('add', 'change', $data), '', false);
+    }
+
+    public function provider_add()
+    {
+        $data = array(
+            'item_name'           => '',
+            'item_type'           => 'ONE TIME',
+            'item_type_toggle'    => 'RECURRING',
+            'item_original_name'  => '',
+            'item_status'         => '',
+            'item_execute_at'     => '',
+            'item_interval_value' => '',
+            'item_interval_field' => '',
+            'item_starts'         => '',
+            'item_ends'           => '',
+            'item_definition'     => '',
+            'item_preserve'       => '',
+            'item_comment'        => '',
+            'item_definer'        => ''
+        );
+
+        return array(
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'add_item'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_name'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_status'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_type'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_changetype'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_execute_at'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_interval_value'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_interval_field'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_starts'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_ends'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'textarea',
+                    'attributes' => array(
+                        'name' => 'item_definition'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_preserve'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_definer'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_comment'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'editor_process_add'
+                    )
+                )
+            )
+        );
+    }
+
+    /**
+     * @dataProvider provider_edit
+     */
+    public function testgetEditorForm_edit($data, $matcher)
+    {
+        $GLOBALS['is_ajax_request'] = false;
+        PMA_EVN_setGlobals();
+        $this->assertTag($matcher, PMA_EVN_getEditorForm('edit', 'change', $data), '', false);
+    }
+
+    public function provider_edit()
+    {
+        $data = array(
+            'item_name'           => 'foo',
+            'item_type'           => 'RECURRING',
+            'item_type_toggle'    => 'ONE TIME',
+            'item_original_name'  => 'bar',
+            'item_status'         => 'ENABLED',
+            'item_execute_at'     => '',
+            'item_interval_value' => '1',
+            'item_interval_field' => 'DAY',
+            'item_starts'         => '',
+            'item_ends'           => '',
+            'item_definition'     => 'SET @A=1;',
+            'item_preserve'       => '',
+            'item_comment'        => '',
+            'item_definer'        => ''
+        );
+
+        return array(
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'edit_item'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_name'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_status'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_type'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_changetype'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_execute_at'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_interval_value'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_interval_field'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_starts'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_ends'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'textarea',
+                    'attributes' => array(
+                        'name' => 'item_definition'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_preserve'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_definer'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_comment'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'editor_process_edit'
+                    )
+                )
+            )
+        );
+    }
+
+    /**
+     * @dataProvider provider_ajax
+     */
+    public function testgetEditorForm_ajax($data, $matcher)
+    {
+        $GLOBALS['is_ajax_request'] = true;
+        PMA_EVN_setGlobals();
+        $this->assertTag($matcher, PMA_EVN_getEditorForm('edit', 'change', $data), '', false);
+    }
+
+    public function provider_ajax()
+    {
+        $data = array(
+            'item_name'           => '',
+            'item_type'           => 'RECURRING',
+            'item_type_toggle'    => 'ONE TIME',
+            'item_original_name'  => '',
+            'item_status'         => 'ENABLED',
+            'item_execute_at'     => '',
+            'item_interval_value' => '',
+            'item_interval_field' => 'DAY',
+            'item_starts'         => '',
+            'item_ends'           => '',
+            'item_definition'     => '',
+            'item_preserve'       => '',
+            'item_comment'        => '',
+            'item_definer'        => ''
+        );
+
+        return array(
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_type'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'editor_process_edit'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'ajax_request'
+                    )
+                )
+            )
+        );
+    }
+}
+?>
diff --git a/test/libraries/rte/PMA_EVN_getQueryFromRequest_test.php b/test/libraries/rte/PMA_EVN_getQueryFromRequest_test.php
new file mode 100644
index 0000000..5c6603d
--- /dev/null
+++ b/test/libraries/rte/PMA_EVN_getQueryFromRequest_test.php
@@ -0,0 +1,144 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Test for generating CREATE EVENT query from HTTP request
+ *
+ * @package phpMyAdmin-test
+ */
+
+/*
+ * Needed for PMA_backquote()
+ */
+require_once 'libraries/common.lib.php';
+
+/*
+ * Needed by PMA_EVN_getQueryFromRequest()
+ */
+require_once 'libraries/php-gettext/gettext.inc';
+
+/*
+ * Include to test.
+ */
+require_once 'libraries/rte/rte_events.lib.php';
+
+
+class PMA_EVN_getQueryFromRequest_test extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider provider
+     */
+    public function testgetQueryFromRequest($request, $query, $num_err)
+    {
+        global $_REQUEST, $errors;
+
+        $errors = array();
+        PMA_EVN_setGlobals();
+
+        unset($_REQUEST);
+        $_REQUEST = $request;
+
+        $this->assertEquals($query, PMA_EVN_getQueryFromRequest());
+        $this->assertEquals($num_err, count($errors));
+    }
+
+    public function provider()
+    {
+        return array(
+            // Testing success
+            array(
+                array( // simple once-off event
+                    'item_name'       => 's o m e e v e n t\\',
+                    'item_type'       => 'ONE TIME',
+                    'item_execute_at' => '2050-01-01 00:00:00',
+                    'item_definition' => 'SET @A=0;'
+                ),
+                'CREATE EVENT `s o m e e v e n t\` ON SCHEDULE AT \'2050-01-01 00:00:00\' ON COMPLETION NOT PRESERVE DO SET @A=0;',
+                0
+            ),
+            array(
+                array( // full once-off event
+                    'item_name'       => 'evn',
+                    'item_definer'    => 'me at home',
+                    'item_type'       => 'ONE TIME',
+                    'item_execute_at' => '2050-01-01 00:00:00',
+                    'item_preserve'   => 'ON',
+                    'item_status'     => 'ENABLED',
+                    'item_definition' => 'SET @A=0;'
+                ),
+                'CREATE DEFINER=`me`@`home` EVENT `evn` ON SCHEDULE AT \'2050-01-01 00:00:00\' ON COMPLETION PRESERVE ENABLE DO SET @A=0;',
+                0
+            ),
+            array(
+                array( // simple recurring event
+                    'item_name'           => 'rec_``evn',
+                    'item_type'           => 'RECURRING',
+                    'item_interval_value' => '365',
+                    'item_interval_field' => 'DAY',
+                    'item_status'         => 'DISABLED',
+                    'item_definition'     => 'SET @A=0;'
+                ),
+                'CREATE EVENT `rec_````evn` ON SCHEDULE EVERY 365 DAY ON COMPLETION NOT PRESERVE DISABLE DO SET @A=0;',
+                0
+            ),
+            array(
+                array( // full recurring event
+                    'item_name'           => 'rec_evn2',
+                    'item_definer'        => 'evil``user><\\@work\\',
+                    'item_type'           => 'RECURRING',
+                    'item_interval_value' => '365',
+                    'item_interval_field' => 'DAY',
+                    'item_starts'         => '1900-01-01',
+                    'item_ends'           => '2050-01-01',
+                    'item_preserve'       => 'ON',
+                    'item_status'         => 'SLAVESIDE_DISABLED',
+                    'item_definition'     => 'SET @A=0;'
+                ),
+                'CREATE DEFINER=`evil````user><\`@`work\` EVENT `rec_evn2` ON SCHEDULE EVERY 365 DAY STARTS \'1900-01-01\' ENDS \'2050-01-01\' ON COMPLETION PRESERVE DISABLE ON SLAVE DO SET @A=0;',
+                0
+            ),
+            // Testing failures
+            array(
+                array( // empty request
+                ),
+                'CREATE EVENT ON SCHEDULE ON COMPLETION NOT PRESERVE DO ',
+                3
+            ),
+            array(
+                array(
+                    'item_name'       => 's o m e e v e n t\\',
+                    'item_definer'    => 'someuser', // invalid definer format
+                    'item_type'       => 'ONE TIME',
+                    'item_execute_at' => '', // no execution time
+                    'item_definition' => 'SET @A=0;'
+                ),
+                'CREATE EVENT `s o m e e v e n t\` ON SCHEDULE ON COMPLETION NOT PRESERVE DO SET @A=0;',
+                2
+            ),
+            array(
+                array(
+                    'item_name'           => 'rec_``evn',
+                    'item_type'           => 'RECURRING',
+                    'item_interval_value' => '', // no interval value
+                    'item_interval_field' => 'DAY',
+                    'item_status'         => 'DISABLED',
+                    'item_definition'     => 'SET @A=0;'
+                ),
+                'CREATE EVENT `rec_````evn` ON SCHEDULE ON COMPLETION NOT PRESERVE DISABLE DO SET @A=0;',
+                1
+            ),
+            array(
+                array( // simple recurring event
+                    'item_name'           => 'rec_``evn',
+                    'item_type'           => 'RECURRING',
+                    'item_interval_value' => '365',
+                    'item_interval_field' => 'CENTURIES', // invalid interval field
+                    'item_status'         => 'DISABLED',
+                    'item_definition'     => 'SET @A=0;'
+                ),
+                'CREATE EVENT `rec_````evn` ON SCHEDULE ON COMPLETION NOT PRESERVE DISABLE DO SET @A=0;',
+                1
+            ),
+        );
+    }
+}
+?>
diff --git a/test/libraries/rte/PMA_RTN_ParameterParser_test.php b/test/libraries/rte/PMA_RTN_ParameterParser_test.php
new file mode 100644
index 0000000..fa80f8b
--- /dev/null
+++ b/test/libraries/rte/PMA_RTN_ParameterParser_test.php
@@ -0,0 +1,163 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Test for parsing of Routine parameters
+ *
+ * @package phpMyAdmin-test
+ */
+
+/*
+ * Needed for PMA_unQuote() and PMA_SQP_parse()
+ */
+require_once 'libraries/common.lib.php';
+require_once 'libraries/sqlparser.lib.php';
+
+/*
+ * Include to test.
+ */
+require_once 'libraries/rte/rte_routines.lib.php';
+
+
+class PMA_RTN_parameterParser_test extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider definer_provider
+     */
+    public function test_parseDefiner($source, $target)
+    {
+        PMA_RTN_setGlobals();
+        $this->assertEquals($target, PMA_RTN_parseRoutineDefiner(PMA_SQP_parse($source)));
+    }
+
+    public function definer_provider()
+    {
+        return array(
+            array('CREATE PROCEDURE FOO() SELECT NULL', ''),
+            array('CREATE DEFINER=`root`@`localhost` PROCEDURE FOO() SELECT NULL', 'root at localhost'),
+            array('CREATE DEFINER=`root\\`@`localhost` PROCEDURE FOO() SELECT NULL', 'root\\@localhost'),
+        );
+    }
+
+    /**
+     * @dataProvider param_provider
+     */
+    public function test_parseOneParameter($source, $target)
+    {
+        PMA_RTN_setGlobals();
+        $this->assertEquals($target, PMA_RTN_parseOneParameter($source));
+    }
+
+    public function param_provider()
+    {
+        return array(
+            array('`foo` TEXT', array('', 'foo', 'TEXT', '', '')),
+            array('`foo` INT(20)', array('', 'foo', 'INT', '20', '')),
+            array('DECIMAL(5,5)', array('', '', 'DECIMAL', '5,5', '')),
+            array('IN `fo``fo` INT UNSIGNED', array('IN', 'fo`fo', 'INT', '', 'UNSIGNED')),
+            array('OUT bar VARCHAR(1) CHARSET utf8', array('OUT', 'bar', 'VARCHAR', '1', 'utf8')),
+            array('`"baz\'\'` ENUM(\'a\', \'b\') CHARSET latin1', array('', '"baz\'\'', 'ENUM', '\'a\',\'b\'', 'latin1')),
+            array('INOUT `foo` DECIMAL(5,2) UNSIGNED ZEROFILL', array('INOUT', 'foo', 'DECIMAL', '5,2', 'UNSIGNED ZEROFILL')),
+            array('`foo``s func` SET(\'test\'\'esc"\',   \'more\\\'esc\')', array('', 'foo`s func', 'SET', '\'test\'\'esc"\',\'more\\\'esc\'', ''))
+        );
+    }
+
+    /**
+     * @depends test_parseOneParameter
+     * @dataProvider query_provider
+     */
+    public function test_parseAllParameters($query, $type, $target)
+    {
+        PMA_RTN_setGlobals();
+        $this->assertEquals($target, PMA_RTN_parseAllParameters(PMA_SQP_parse($query), $type));
+    }
+
+    public function query_provider()
+    {
+        return array(
+            array(
+                'CREATE PROCEDURE `foo`() SET @A=0',
+                'PROCEDURE',
+                array(
+                    'num' => 0,
+                    'dir' => array(),
+                    'name' => array(),
+                    'type' => array(),
+                    'length' => array(),
+                    'opts' => array()
+                )
+            ),
+            array(
+                'CREATE DEFINER=`user\\`@`somehost``(` FUNCTION `foo```(`baz` INT) BEGIN SELECT NULL; END',
+                'FUNCTION',
+                array(
+                    'num' => 1,
+                    'dir' => array(
+                        0 => ''
+                    ),
+                    'name' => array(
+                        0 => 'baz'
+                    ),
+                    'type' => array(
+                        0 => 'INT'
+                    ),
+                    'length' => array(
+                        0 => ''
+                    ),
+                    'opts' => array(
+                        0 => ''
+                    )
+                )
+            ),
+            array(
+                'CREATE PROCEDURE `foo`(IN `baz\\)` INT(25) zerofill unsigned) BEGIN SELECT NULL; END',
+                'PROCEDURE',
+                array(
+                    'num' => 1,
+                    'dir' => array(
+                        0 => 'IN'
+                    ),
+                    'name' => array(
+                        0 => 'baz\\)'
+                    ),
+                    'type' => array(
+                        0 => 'INT'
+                    ),
+                    'length' => array(
+                        0 => '25'
+                    ),
+                    'opts' => array(
+                        0 => 'UNSIGNED ZEROFILL'
+                    )
+                )
+            ),
+            array(
+                'CREATE PROCEDURE `foo`(IN `baz\\` INT(001) zerofill, out bazz varchar(15) charset UTF8) BEGIN SELECT NULL; END',
+                'PROCEDURE',
+                array(
+                    'num' => 2,
+                    'dir' => array(
+                        0 => 'IN',
+                        1 => 'OUT'
+                    ),
+                    'name' => array(
+                        0 => 'baz\\',
+                        1 => 'bazz'
+                    ),
+                    'type' => array(
+                        0 => 'INT',
+                        1 => 'VARCHAR'
+                    ),
+                    'length' => array(
+                        0 => '1',
+                        1 => '15'
+                    ),
+                    'opts' => array(
+                        0 => 'ZEROFILL',
+                        1 => 'utf8'
+                    )
+                )
+            ),
+        );
+    }
+}
+?>
diff --git a/test/libraries/rte/PMA_RTN_getDataFromRequest_test.php b/test/libraries/rte/PMA_RTN_getDataFromRequest_test.php
new file mode 100644
index 0000000..d24de2b
--- /dev/null
+++ b/test/libraries/rte/PMA_RTN_getDataFromRequest_test.php
@@ -0,0 +1,197 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Test for fetching routine data from HTTP request
+ *
+ * @package phpMyAdmin-test
+ */
+
+require_once 'libraries/data_mysql.inc.php';
+require_once 'libraries/common.lib.php';
+
+
+/*
+ * Include to test.
+ */
+require_once 'libraries/rte/rte_routines.lib.php';
+
+class PMA_RTN_getDataFromRequest_test extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider provider
+     */
+    public function testgetDataFromRequest($in, $out)
+    {
+        global $cfg, $_REQUEST;
+
+        if (! isset($cfg['ColumnTypes'])) {
+            $this->markTestSkipped('Can\'t get column types'); // FIXME
+        }
+
+        unset($_REQUEST);
+        foreach ($in as $key => $value) {
+            if ($value !== '') {
+                $_REQUEST[$key] = $value;
+            }
+        }
+        PMA_RTN_setGlobals();
+        $this->assertEquals($out, PMA_RTN_getDataFromRequest());
+    }
+
+    public function provider()
+    {
+        return array(
+            array(
+                array(
+                    'item_name'                 => '',
+                    'item_original_name'        => '',
+                    'item_returnlength'         => '',
+                    'item_returnopts_num'       => '',
+                    'item_returnopts_text'      => '',
+                    'item_definition'           => '',
+                    'item_comment'              => '',
+                    'item_definer'              => '',
+                    'item_type'                 => '',
+                    'item_type_toggle'          => '',
+                    'item_original_type'        => '',
+                    'item_param_dir'            => '',
+                    'item_param_name'           => '',
+                    'item_param_type'           => '',
+                    'item_param_length'         => '',
+                    'item_param_opts_num'       => '',
+                    'item_param_opts_text'      => '',
+                    'item_returntype'           => '',
+                    'item_isdeterministic'      => '',
+                    'item_securitytype'         => '',
+                    'item_sqldataaccess'        => ''
+                ),
+                array(
+                    'item_name'                 => '',
+                    'item_original_name'        => '',
+                    'item_returnlength'         => '',
+                    'item_returnopts_num'       => '',
+                    'item_returnopts_text'      => '',
+                    'item_definition'           => '',
+                    'item_comment'              => '',
+                    'item_definer'              => '',
+                    'item_type'                 => 'PROCEDURE',
+                    'item_type_toggle'          => 'FUNCTION',
+                    'item_original_type'        => 'PROCEDURE',
+                    'item_num_params'           => 0,
+                    'item_param_dir'            => array(),
+                    'item_param_name'           => array(),
+                    'item_param_type'           => array(),
+                    'item_param_length'         => array(),
+                    'item_param_opts_num'       => array(),
+                    'item_param_opts_text'      => array(),
+                    'item_returntype'           => '',
+                    'item_isdeterministic'      => '',
+                    'item_securitytype_definer' => '',
+                    'item_securitytype_invoker' => '',
+                    'item_sqldataaccess'        => ''
+                )
+            ),
+            array(
+                array(
+                    'item_name'                 => 'proc2',
+                    'item_original_name'        => 'proc',
+                    'item_returnlength'         => '',
+                    'item_returnopts_num'       => '',
+                    'item_returnopts_text'      => '',
+                    'item_definition'           => 'SELECT NULL',
+                    'item_comment'              => 'some text',
+                    'item_definer'              => 'root at localhost',
+                    'item_type'                 => 'PROCEDURE',
+                    'item_type_toggle'          => 'FUNCTION',
+                    'item_original_type'        => 'PROCEDURE',
+                    'item_param_dir'            => array(0 => 'IN', 1 => 'FAIL'),
+                    'item_param_name'           => array(0 => 'bar', 1 => 'baz'),
+                    'item_param_type'           => array(0 => 'INT', 1 => 'FAIL'),
+                    'item_param_length'         => array(0 => '20', 1 => ''),
+                    'item_param_opts_num'       => array(0 => 'UNSIGNED', 1 => ''),
+                    'item_param_opts_text'      => array(0 => '', 1 => 'latin1'),
+                    'item_returntype'           => '',
+                    'item_isdeterministic'      => 'ON',
+                    'item_securitytype'         => 'INVOKER',
+                    'item_sqldataaccess'        => 'NO SQL'
+                ),
+                array(
+                    'item_name'                 => 'proc2',
+                    'item_original_name'        => 'proc',
+                    'item_returnlength'         => '',
+                    'item_returnopts_num'       => '',
+                    'item_returnopts_text'      => '',
+                    'item_definition'           => 'SELECT NULL',
+                    'item_comment'              => 'some text',
+                    'item_definer'              => 'root at localhost',
+                    'item_type'                 => 'PROCEDURE',
+                    'item_type_toggle'          => 'FUNCTION',
+                    'item_original_type'        => 'PROCEDURE',
+                    'item_num_params'           => 2,
+                    'item_param_dir'            => array(0 => 'IN', 1 => ''),
+                    'item_param_name'           => array(0 => 'bar', 1 => 'baz'),
+                    'item_param_type'           => array(0 => 'INT', 1 => ''),
+                    'item_param_length'         => array(0 => '20', 1 => ''),
+                    'item_param_opts_num'       => array(0 => 'UNSIGNED', 1 => ''),
+                    'item_param_opts_text'      => array(0 => '', 1 => 'latin1'),
+                    'item_returntype'           => '',
+                    'item_isdeterministic'      => ' checked=\'checked\'',
+                    'item_securitytype_definer' => '',
+                    'item_securitytype_invoker' => ' selected=\'selected\'',
+                    'item_sqldataaccess'        => 'NO SQL'
+                )
+            ),
+            array(
+                array(
+                    'item_name'                 => 'func2',
+                    'item_original_name'        => 'func',
+                    'item_returnlength'         => '20',
+                    'item_returnopts_num'       => '',
+                    'item_returnopts_text'      => 'CHARSET utf8',
+                    'item_definition'           => 'SELECT NULL',
+                    'item_comment'              => 'some text',
+                    'item_definer'              => 'root at localhost',
+                    'item_type'                 => 'FUNCTION',
+                    'item_type_toggle'          => 'PROCEDURE',
+                    'item_original_type'        => 'FUNCTION',
+                    'item_param_dir'            => array(0 => '', 1 => ''),
+                    'item_param_name'           => array(0 => 'bar', 1 => 'baz'),
+                    'item_param_type'           => array(0 => '<s>XSS</s>', 1 => 'TEXT'),
+                    'item_param_length'         => array(0 => '10,10', 1 => ''),
+                    'item_param_opts_num'       => array(0 => 'UNSIGNED', 1 => ''),
+                    'item_param_opts_text'      => array(0 => '', 1 => 'utf8'),
+                    'item_returntype'           => 'VARCHAR',
+                    'item_isdeterministic'      => '',
+                    'item_securitytype'         => 'DEFINER',
+                    'item_sqldataaccess'        => ''
+                ),
+                array(
+                    'item_name'                 => 'func2',
+                    'item_original_name'        => 'func',
+                    'item_returnlength'         => '20',
+                    'item_returnopts_num'       => '',
+                    'item_returnopts_text'      => 'CHARSET utf8',
+                    'item_definition'           => 'SELECT NULL',
+                    'item_comment'              => 'some text',
+                    'item_definer'              => 'root at localhost',
+                    'item_type'                 => 'FUNCTION',
+                    'item_type_toggle'          => 'PROCEDURE',
+                    'item_original_type'        => 'FUNCTION',
+                    'item_num_params'           => '2',
+                    'item_param_dir'            => array(),
+                    'item_param_name'           => array(0 => 'bar', 1 => 'baz'),
+                    'item_param_type'           => array(0 => '', 1 => 'TEXT'),
+                    'item_param_length'         => array(0 => '10,10', 1 => ''),
+                    'item_param_opts_num'       => array(0 => 'UNSIGNED', 1 => ''),
+                    'item_param_opts_text'      => array(0 => '', 1 => 'utf8'),
+                    'item_returntype'           => 'VARCHAR',
+                    'item_isdeterministic'      => '',
+                    'item_securitytype_definer' => ' selected=\'selected\'',
+                    'item_securitytype_invoker' => '',
+                    'item_sqldataaccess'        => ''
+                )
+            ),
+        );
+    }
+}
+?>
diff --git a/test/libraries/rte/PMA_RTN_getEditorForm_test.php b/test/libraries/rte/PMA_RTN_getEditorForm_test.php
new file mode 100644
index 0000000..ef96a79
--- /dev/null
+++ b/test/libraries/rte/PMA_RTN_getEditorForm_test.php
@@ -0,0 +1,885 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Test for generating routine editor
+ *
+ * @package phpMyAdmin-test
+ */
+require_once 'libraries/common.lib.php';
+require_once 'libraries/data_mysql.inc.php';
+require_once 'libraries/php-gettext/gettext.inc';
+require_once 'libraries/url_generating.lib.php';
+/*
+ * Include to test.
+ */
+require_once 'libraries/rte/rte_routines.lib.php';
+
+class PMA_RTN_getEditorForm_test extends PHPUnit_Framework_TestCase
+{
+    public function setUp()
+    {
+        if (! function_exists('PMA_generateCharsetDropdownBox')) {
+            function PMA_generateCharsetDropdownBox() {}
+        }
+        if (! defined('PMA_CSDROPDOWN_CHARSET')) {
+            define('PMA_CSDROPDOWN_CHARSET', '');
+        }
+        if (! function_exists('PMA_DBI_get_tables')) {
+            function PMA_DBI_get_tables($db)
+            {
+                return array('table1', 'table`2');
+            }
+        }
+        $GLOBALS['tear_down']['token'] = false;
+        $GLOBALS['tear_down']['server'] = false;
+        if (! isset($_SESSION[' PMA_token '])) {
+            $_SESSION[' PMA_token '] = '';
+            $GLOBALS['tear_down']['token'] = true;
+        }
+        if (! isset($GLOBALS['cfg']['ServerDefault'])) {
+            $GLOBALS['cfg']['ServerDefault'] = '';
+            $GLOBALS['tear_down']['server'] = true;
+        }
+    }
+
+    public function tearDown()
+    {
+        if ($GLOBALS['tear_down']['token']) {
+            unset($_SESSION[' PMA_token ']);
+        }
+        if ($GLOBALS['tear_down']['server']) {
+            unset($GLOBALS['cfg']['ServerDefault']);
+        }
+        unset($GLOBALS['tear_down']);
+    }
+
+    public function testgetParameterRow_empty()
+    {
+        $GLOBALS['is_ajax_request'] = false;
+        PMA_RTN_setGlobals();
+        $this->assertEquals('', PMA_RTN_getParameterRow(array(), 0));
+    }
+
+    /**
+     * @depends testgetParameterRow_empty
+     * @dataProvider provider_row
+     */
+    public function testgetParameterRow($data, $index, $matcher)
+    {
+        $GLOBALS['is_ajax_request'] = false;
+        PMA_RTN_setGlobals();
+        $this->assertTag($matcher, PMA_RTN_getParameterRow($data, $index), false);
+    }
+
+    public function provider_row()
+    {
+        $data = array(
+            'item_name'                 => '',
+            'item_original_name'        => '',
+            'item_returnlength'         => '',
+            'item_returnopts_num'       => '',
+            'item_returnopts_text'      => '',
+            'item_definition'           => '',
+            'item_comment'              => '',
+            'item_definer'              => '',
+            'item_type'                 => 'PROCEDURE',
+            'item_type_toggle'          => 'FUNCTION',
+            'item_original_type'        => 'PROCEDURE',
+            'item_num_params'           => 1,
+            'item_param_dir'            => array(0 => 'IN'),
+            'item_param_name'           => array(0 => 'foo'),
+            'item_param_type'           => array(0 => 'INT'),
+            'item_param_length'         => array(0 => ''),
+            'item_param_opts_num'       => array(0 => 'UNSIGNED'),
+            'item_param_opts_text'      => array(0 => ''),
+            'item_returntype'           => '',
+            'item_isdeterministic'      => '',
+            'item_securitytype_definer' => '',
+            'item_securitytype_invoker' => '',
+            'item_sqldataaccess'        => ''
+        );
+
+        return array(
+            array(
+                $data,
+                0,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_param_dir[0]'
+                    )
+                )
+            ),
+            array(
+                $data,
+                0,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_param_name[0]'
+                    )
+                )
+            ),
+            array(
+                $data,
+                0,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_param_type[0]'
+                    )
+                )
+            ),
+            array(
+                $data,
+                0,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_param_length[0]'
+                    )
+                )
+            ),
+            array(
+                $data,
+                0,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_param_opts_num[0]'
+                    )
+                )
+            ),
+            array(
+                $data,
+                0,
+                array(
+                    'tag' => 'a',
+                    'attributes' => array(
+                        'class' => 'routine_param_remove_anchor'
+                    )
+                )
+            ),
+        );
+    }
+
+    /**
+     * @depends testgetParameterRow
+     * @dataProvider provider_row_ajax
+     */
+    public function testgetParameterRow_ajax($data, $matcher)
+    {
+        $GLOBALS['is_ajax_request'] = false;
+        PMA_RTN_setGlobals();
+        $this->assertTag($matcher, PMA_RTN_getParameterRow($data), false);
+    }
+
+    public function provider_row_ajax()
+    {
+        $data = array(
+            'item_name'                 => '',
+            'item_original_name'        => '',
+            'item_returnlength'         => '',
+            'item_returnopts_num'       => '',
+            'item_returnopts_text'      => '',
+            'item_definition'           => '',
+            'item_comment'              => '',
+            'item_definer'              => '',
+            'item_type'                 => 'PROCEDURE',
+            'item_type_toggle'          => 'FUNCTION',
+            'item_original_type'        => 'PROCEDURE',
+            'item_num_params'           => 1,
+            'item_param_dir'            => array(0 => 'IN'),
+            'item_param_name'           => array(0 => 'foo'),
+            'item_param_type'           => array(0 => 'INT'),
+            'item_param_length'         => array(0 => ''),
+            'item_param_opts_num'       => array(0 => 'UNSIGNED'),
+            'item_param_opts_text'      => array(0 => ''),
+            'item_returntype'           => '',
+            'item_isdeterministic'      => '',
+            'item_securitytype_definer' => '',
+            'item_securitytype_invoker' => '',
+            'item_sqldataaccess'        => ''
+        );
+
+        return array(
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_param_dir[%s]'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_param_name[%s]'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_param_type[%s]'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_param_length[%s]'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_param_opts_num[%s]'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'a',
+                    'attributes' => array(
+                        'class' => 'routine_param_remove_anchor'
+                    )
+                )
+            ),
+        );
+    }
+
+    /**
+     * @depends testgetParameterRow_ajax
+     * @dataProvider provider_editor_1
+     */
+    public function testgetEditorForm_1($data, $matcher)
+    {
+        $GLOBALS['is_ajax_request'] = false;
+        PMA_RTN_setGlobals();
+        $this->assertTag($matcher, PMA_RTN_getEditorForm('add', '', $data), false);
+    }
+
+    public function provider_editor_1()
+    {
+        $data = array(
+            'item_name'                 => '',
+            'item_original_name'        => '',
+            'item_returnlength'         => '',
+            'item_returnopts_num'       => '',
+            'item_returnopts_text'      => '',
+            'item_definition'           => '',
+            'item_comment'              => '',
+            'item_definer'              => '',
+            'item_type'                 => 'PROCEDURE',
+            'item_type_toggle'          => 'FUNCTION',
+            'item_original_type'        => 'PROCEDURE',
+            'item_num_params'           => 0,
+            'item_param_dir'            => array(),
+            'item_param_name'           => array(),
+            'item_param_type'           => array(),
+            'item_param_length'         => array(),
+            'item_param_opts_num'       => array(),
+            'item_param_opts_text'      => array(),
+            'item_returntype'           => '',
+            'item_isdeterministic'      => '',
+            'item_securitytype_definer' => '',
+            'item_securitytype_invoker' => '',
+            'item_sqldataaccess'        => ''
+        );
+
+        return array(
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'add_item'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_name'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_type'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'routine_changetype'
+                    )
+                )
+            ),
+
+
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'routine_addparameter'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'routine_removeparameter'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_returntype'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_returnlength'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_returnopts_num'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'textarea',
+                    'attributes' => array(
+                        'name' => 'item_definition'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_isdeterministic'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_definer'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_securitytype'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_sqldataaccess'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_comment'
+                    )
+                )
+            ),
+           array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'editor_process_add'
+                    )
+                )
+            ),
+
+        );
+    }
+
+    /**
+     * @depends testgetParameterRow_ajax
+     * @dataProvider provider_editor_2
+     */
+    public function testgetEditorForm_2($data, $matcher)
+    {
+        $GLOBALS['is_ajax_request'] = false;
+        PMA_RTN_setGlobals();
+        $this->assertTag($matcher, PMA_RTN_getEditorForm('edit', 'change', $data), false);
+    }
+
+    public function provider_editor_2()
+    {
+        $data = array(
+            'item_name'                 => 'foo',
+            'item_original_name'        => 'bar',
+            'item_returnlength'         => '',
+            'item_returnopts_num'       => '',
+            'item_returnopts_text'      => '',
+            'item_definition'           => 'SELECT 1',
+            'item_comment'              => '',
+            'item_definer'              => '',
+            'item_type'                 => 'PROCEDURE',
+            'item_type_toggle'          => 'FUNCTION',
+            'item_original_type'        => 'PROCEDURE',
+            'item_num_params'           => 1,
+            'item_param_dir'            => array(0 => 'IN'),
+            'item_param_name'           => array(0 => 'baz'),
+            'item_param_type'           => array(0 => 'INT'),
+            'item_param_length'         => array(0 => '20'),
+            'item_param_opts_num'       => array(0 => 'UNSIGNED'),
+            'item_param_opts_text'      => array(0 => ''),
+            'item_returntype'           => '',
+            'item_isdeterministic'      => '',
+            'item_securitytype_definer' => '',
+            'item_securitytype_invoker' => '',
+            'item_sqldataaccess'        => 'NO SQL'
+        );
+
+        return array(
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'edit_item'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_name'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_type',
+                        'value' => 'FUNCTION'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'routine_changetype'
+                    )
+                )
+            ),
+
+
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'routine_addparameter'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'routine_removeparameter'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_returntype'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_returnlength'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_returnopts_num'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'textarea',
+                    'attributes' => array(
+                        'name' => 'item_definition'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_isdeterministic'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_definer'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_securitytype'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_sqldataaccess'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_comment'
+                    )
+                )
+            ),
+           array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'editor_process_edit'
+                    )
+                )
+            ),
+
+        );
+    }
+
+    /**
+     * @depends testgetParameterRow_ajax
+     * @dataProvider provider_editor_3
+     */
+    public function testgetEditorForm_3($data, $matcher)
+    {
+        $GLOBALS['is_ajax_request'] = true;
+        PMA_RTN_setGlobals();
+        $this->assertTag($matcher, PMA_RTN_getEditorForm('edit', 'remove', $data), false);
+    }
+
+    public function provider_editor_3()
+    {
+        $data = array(
+            'item_name'                 => 'foo',
+            'item_original_name'        => 'bar',
+            'item_returnlength'         => '',
+            'item_returnopts_num'       => 'UNSIGNED',
+            'item_returnopts_text'      => '',
+            'item_definition'           => 'SELECT 1',
+            'item_comment'              => '',
+            'item_definer'              => '',
+            'item_type'                 => 'FUNCTION',
+            'item_type_toggle'          => 'PROCEDURE',
+            'item_original_type'        => 'FUNCTION',
+            'item_num_params'           => 1,
+            'item_param_dir'            => array(0 => ''),
+            'item_param_name'           => array(0 => 'baz'),
+            'item_param_type'           => array(0 => 'INT'),
+            'item_param_length'         => array(0 => '20'),
+            'item_param_opts_num'       => array(0 => 'UNSIGNED'),
+            'item_param_opts_text'      => array(0 => ''),
+            'item_returntype'           => 'INT',
+            'item_isdeterministic'      => '',
+            'item_securitytype_definer' => '',
+            'item_securitytype_invoker' => '',
+            'item_sqldataaccess'        => 'NO SQL'
+        );
+
+        return array(
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'edit_item'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_name'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_type'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'routine_addparameter'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'routine_removeparameter'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_returntype'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_returnlength'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_returnopts_num'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'textarea',
+                    'attributes' => array(
+                        'name' => 'item_definition'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_isdeterministic'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_definer'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_securitytype'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_sqldataaccess'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_comment'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'ajax_request'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'editor_process_edit'
+                    )
+                )
+            ),
+
+        );
+    }
+
+    /**
+     * @depends testgetParameterRow_ajax
+     * @dataProvider provider_editor_4
+     */
+    public function testgetEditorForm_4($data, $matcher)
+    {
+        $GLOBALS['is_ajax_request'] = false;
+        PMA_RTN_setGlobals();
+        $this->assertTag($matcher, PMA_RTN_getEditorForm('edit', 'change', $data), false);
+    }
+
+    public function provider_editor_4()
+    {
+        $data = array(
+            'item_name'                 => 'foo',
+            'item_original_name'        => 'bar',
+            'item_returnlength'         => '',
+            'item_returnopts_num'       => '',
+            'item_returnopts_text'      => '',
+            'item_definition'           => 'SELECT 1',
+            'item_comment'              => '',
+            'item_definer'              => '',
+            'item_type'                 => 'FUNCTION',
+            'item_type_toggle'          => 'PROCEDURE',
+            'item_original_type'        => 'PROCEDURE',
+            'item_num_params'           => 1,
+            'item_param_dir'            => array(0 => 'IN'),
+            'item_param_name'           => array(0 => 'baz'),
+            'item_param_type'           => array(0 => 'INT'),
+            'item_param_length'         => array(0 => '20'),
+            'item_param_opts_num'       => array(0 => 'UNSIGNED'),
+            'item_param_opts_text'      => array(0 => ''),
+            'item_returntype'           => '',
+            'item_isdeterministic'      => '',
+            'item_securitytype_definer' => '',
+            'item_securitytype_invoker' => '',
+            'item_sqldataaccess'        => 'NO SQL'
+        );
+
+        return array(
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_type',
+                        'value' => 'PROCEDURE'
+                    )
+                )
+            ),
+        );
+    }
+}
+?>
diff --git a/test/libraries/rte/PMA_RTN_getExecuteForm_test.php b/test/libraries/rte/PMA_RTN_getExecuteForm_test.php
new file mode 100644
index 0000000..eab74b4
--- /dev/null
+++ b/test/libraries/rte/PMA_RTN_getExecuteForm_test.php
@@ -0,0 +1,244 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Test for generating routine execution dialog
+ *
+ * @package phpMyAdmin-test
+ */
+require_once 'libraries/common.lib.php';
+require_once 'libraries/sqlparser.lib.php';
+require_once 'libraries/php-gettext/gettext.inc';
+require_once 'libraries/url_generating.lib.php';
+/*
+ * Include to test.
+ */
+require_once 'libraries/rte/rte_routines.lib.php';
+
+class PMA_RTN_getExecuteForm_test extends PHPUnit_Framework_TestCase
+{
+    public function setUp()
+    {
+        global $cfg;
+
+        if (! defined('PMA_MYSQL_INT_VERSION')) {
+            define('PMA_MYSQL_INT_VERSION', 51000);
+        }
+
+        if (! function_exists('PMA_generateCharsetDropdownBox')) {
+            function PMA_generateCharsetDropdownBox() {}
+        }
+        if (! defined('PMA_CSDROPDOWN_CHARSET')) {
+            define('PMA_CSDROPDOWN_CHARSET', '');
+        }
+        if (! function_exists('PMA_DBI_get_tables')) {
+            function PMA_DBI_get_tables($db)
+            {
+                return array('table1', 'table`2');
+            }
+        }
+        $GLOBALS['tear_down']['token'] = false;
+        $GLOBALS['tear_down']['server'] = false;
+        $GLOBALS['tear_down']['default'] = false;
+        if (! isset($_SESSION[' PMA_token '])) {
+            $_SESSION[' PMA_token '] = '';
+            $GLOBALS['tear_down']['token'] = true;
+        }
+        if (! isset($GLOBALS['cfg']['ServerDefault'])) {
+            $GLOBALS['cfg']['ServerDefault'] = '';
+            $GLOBALS['tear_down']['server'] = true;
+        }
+        $cfg['ShowFunctionFields'] = true;
+        if (! isset($GLOBALS['cfg']['DefaultFunctions'])) {
+            $cfg['DefaultFunctions']['FUNC_NUMBER'] = '';
+            $cfg['DefaultFunctions']['FUNC_DATE'] = '';
+            $GLOBALS['tear_down']['default'] = true;
+        }
+        eval(substr(file_get_contents('libraries/data_mysql.inc.php'), 5, -3)); // FIXME
+    }
+
+    public function tearDown()
+    {
+        if ($GLOBALS['tear_down']['token']) {
+            unset($_SESSION[' PMA_token ']);
+        }
+        if ($GLOBALS['tear_down']['server']) {
+            unset($GLOBALS['cfg']['ServerDefault']);
+        }
+        if ($GLOBALS['tear_down']['default']) {
+            unset($GLOBALS['cfg']['DefaultFunctions']);
+        }
+        unset($GLOBALS['tear_down']);
+    }
+
+
+    /**
+     * @dataProvider provider_1
+     */
+    public function testgetExecuteForm_1($data, $matcher)
+    {
+        $GLOBALS['is_ajax_request'] = false;
+        PMA_RTN_setGlobals();
+        $this->assertTag($matcher, PMA_RTN_getExecuteForm($data), false);
+    }
+
+    public function provider_1()
+    {
+        $data = array(
+            'item_name'                 => 'foo',
+            'item_returnlength'         => '',
+            'item_returnopts_num'       => '',
+            'item_returnopts_text'      => '',
+            'item_definition'           => 'SELECT 1;',
+            'item_comment'              => '',
+            'item_definer'              => '',
+            'item_type'                 => 'PROCEDURE',
+            'item_num_params'           => 6,
+            'item_param_dir'            => array(0 => 'IN',   1 => 'OUT',     2 => 'IN',       3 => 'IN',       4 => 'IN',      5 => 'IN'),
+            'item_param_name'           => array(0 => 'foo',  1 => 'foa',     2 => 'fob',      3 => 'foc',      4 => 'fod',     5 => 'foe'),
+            'item_param_type'           => array(0 => 'DATE', 1 => 'VARCHAR', 2 => 'DATETIME', 3 => 'GEOMETRY', 4 => 'ENUM',    5 => 'SET'),
+            'item_param_length'         => array(0 => '',     1 => '22',      2 => '',         3 => '',         4 => "'a','b'", 5 => "'a','b'"),
+            'item_param_opts_num'       => array(0 => '',     1 => '',        2 => '',         3 => '',         4 => '',        5 => ''),
+            'item_param_opts_text'      => array(0 => '',     1 => 'utf8',    2 => '',         3 => '',         4 => '',        5 => ''),
+            'item_returntype'           => '',
+            'item_isdeterministic'      => '',
+            'item_securitytype_definer' => '',
+            'item_securitytype_invoker' => '',
+            'item_sqldataaccess'        => ''
+        );
+
+        return array(
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_name'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'funcs[foo]'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'params[foo]',
+                        'class' => 'datefield'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'funcs[fob]'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'params[fob]',
+                        'class' => 'datetimefield'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'params[fod][]'
+                    ),
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'params[foe][]'
+                    ),
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'execute_routine'
+                    )
+                )
+            ),
+        );
+    }
+
+    /**
+     * @dataProvider provider_2
+     */
+    public function testgetExecuteForm_2($data, $matcher)
+    {
+        $GLOBALS['is_ajax_request'] = true;
+        PMA_RTN_setGlobals();
+        $this->assertTag($matcher, PMA_RTN_getExecuteForm($data), false);
+    }
+
+    public function provider_2()
+    {
+        $data = array(
+            'item_name'                 => 'foo',
+            'item_returnlength'         => '',
+            'item_returnopts_num'       => '',
+            'item_returnopts_text'      => '',
+            'item_definition'           => 'SELECT 1;',
+            'item_comment'              => '',
+            'item_definer'              => '',
+            'item_type'                 => 'PROCEDURE',
+            'item_num_params'           => 6,
+            'item_param_dir'            => array(0 => 'IN',   1 => 'OUT',     2 => 'IN',       3 => 'IN',       4 => 'IN',      5 => 'IN'),
+            'item_param_name'           => array(0 => 'foo',  1 => 'foa',     2 => 'fob',      3 => 'foc',      4 => 'fod',     5 => 'foe'),
+            'item_param_type'           => array(0 => 'DATE', 1 => 'VARCHAR', 2 => 'DATETIME', 3 => 'GEOMETRY', 4 => 'ENUM',    5 => 'SET'),
+            'item_param_length'         => array(0 => '',     1 => '22',      2 => '',         3 => '',         4 => "'a','b'", 5 => "'a','b'"),
+            'item_param_opts_num'       => array(0 => '',     1 => '',        2 => '',         3 => '',         4 => '',        5 => ''),
+            'item_param_opts_text'      => array(0 => '',     1 => 'utf8',    2 => '',         3 => '',         4 => '',        5 => ''),
+            'item_returntype'           => '',
+            'item_isdeterministic'      => '',
+            'item_securitytype_definer' => '',
+            'item_securitytype_invoker' => '',
+            'item_sqldataaccess'        => ''
+        );
+
+        return array(
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'execute_routine'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'ajax_request'
+                    )
+                )
+            ),
+        );
+    }
+}
+?>
diff --git a/test/libraries/rte/PMA_RTN_getQueryFromRequest_test.php b/test/libraries/rte/PMA_RTN_getQueryFromRequest_test.php
new file mode 100644
index 0000000..175c95b
--- /dev/null
+++ b/test/libraries/rte/PMA_RTN_getQueryFromRequest_test.php
@@ -0,0 +1,247 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Test for generating CREATE [PROCEDURE|FUNCTION] query from HTTP request
+ *
+ * @package phpMyAdmin-test
+ */
+
+/*
+ * Needed for PMA_backquote() and PMA_RTN_getQueryFromRequest()
+ */
+//require_once 'libraries/data_mysql.inc.php';
+require_once 'libraries/common.lib.php';
+require_once 'libraries/php-gettext/gettext.inc';
+
+/*
+ * Include to test.
+ */
+require_once 'libraries/rte/rte_routines.lib.php';
+
+
+class PMA_RTN_getQueryFromRequest_test extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider provider
+     */
+    public function testgetQueryFromRequest($request, $query, $num_err)
+    {
+        global $_REQUEST, $errors, $cfg;
+
+        // FIXME: the below two lines are needed to get the test to work,
+        // but are definitely the wrong way to go about the issue
+        // of $cfg['ColumnTypes'] being undefined
+        $cfg['ShowFunctionFields'] = false;
+        eval(substr(file_get_contents('libraries/data_mysql.inc.php'), 5, -3));
+
+        if (! isset($cfg['ColumnTypes'])) {
+            $this->markTestSkipped('Can\'t get column types'); // FIXME
+        }
+
+        $errors = array();
+        PMA_RTN_setGlobals();
+
+        unset($_REQUEST);
+        $_REQUEST = $request;
+        $this->assertEquals($query, PMA_RTN_getQueryFromRequest());
+        $this->assertEquals($num_err, count($errors));
+    }
+
+    public function provider()
+    {
+        return array(
+            // Testing success
+            array(
+                array(
+                    'item_name'                 => 'p r o c',
+                    'item_returnlength'         => '',
+                    'item_returnopts_num'       => '',
+                    'item_returnopts_text'      => '',
+                    'item_definition'           => 'SELECT 0;',
+                    'item_comment'              => 'foo',
+                    'item_definer'              => 'me at home',
+                    'item_type'                 => 'PROCEDURE',
+                    'item_num_params'           => '0',
+                    'item_param_dir'            => '',
+                    'item_param_name'           => '',
+                    'item_param_type'           => '',
+                    'item_param_length'         => '',
+                    'item_param_opts_num'       => '',
+                    'item_param_opts_text'      => '',
+                    'item_returntype'           => '',
+                    'item_isdeterministic'      => '',
+                    'item_securitytype'         => 'INVOKER',
+                    'item_sqldataaccess'        => 'NO SQL'
+                ),
+                'CREATE DEFINER=`me`@`home` PROCEDURE `p r o c`() COMMENT \'foo\' DETERMINISTIC NO SQL SQL SECURITY INVOKER SELECT 0;',
+                0
+            ),
+            array(
+                array(
+                    'item_name'                 => 'pr``oc',
+                    'item_returnlength'         => '',
+                    'item_returnopts_num'       => '',
+                    'item_returnopts_text'      => '',
+                    'item_definition'           => 'SELECT \'foobar\';',
+                    'item_comment'              => '',
+                    'item_definer'              => 'someuser at somehost',
+                    'item_type'                 => 'PROCEDURE',
+                    'item_num_params'           => '2',
+                    'item_param_dir'            => array('IN', 'INOUT'),
+                    'item_param_name'           => array('pa`ram', 'par 2'),
+                    'item_param_type'           => array('INT', 'ENUM'),
+                    'item_param_length'         => array('10', '\'a\', \'b\''),
+                    'item_param_opts_num'       => array('ZEROFILL', ''),
+                    'item_param_opts_text'      => array('utf8', 'latin1'),
+                    'item_returntype'           => '',
+                    'item_securitytype'         => 'DEFINER',
+                    'item_sqldataaccess'        => 'foobar'
+                ),
+                'CREATE DEFINER=`someuser`@`somehost` PROCEDURE `pr````oc`(IN `pa``ram` INT(10) ZEROFILL, INOUT `par 2` ENUM(\'a\', \'b\') CHARSET latin1) NOT DETERMINISTIC SQL SECURITY DEFINER SELECT \'foobar\';',
+                0
+            ),
+            array(
+                array(
+                    'item_name'                 => 'func\\',
+                    'item_returnlength'         => '5,5',
+                    'item_returnopts_num'       => 'UNSIGNED ZEROFILL',
+                    'item_returnopts_text'      => '',
+                    'item_definition'           => 'SELECT \'foobar\';',
+                    'item_comment'              => 'foo\'s bar',
+                    'item_definer'              => '',
+                    'item_type'                 => 'FUNCTION',
+                    'item_num_params'           => '1',
+                    'item_param_dir'            => '',
+                    'item_param_name'           => array('pa`ram'),
+                    'item_param_type'           => array('VARCHAR'),
+                    'item_param_length'         => array('45'),
+                    'item_param_opts_num'       => array(''),
+                    'item_param_opts_text'      => array('latin1'),
+                    'item_returntype'           => 'DECIMAL',
+                    'item_isdeterministic'      => 'ON',
+                    'item_securitytype'         => 'DEFINER',
+                    'item_sqldataaccess'        => 'READ SQL DATA'
+                ),
+                'CREATE FUNCTION `func\\`(`pa``ram` VARCHAR(45) CHARSET latin1) RETURNS DECIMAL(5,5) UNSIGNED ZEROFILL COMMENT \'foo\'\'s bar\' DETERMINISTIC SQL SECURITY DEFINER SELECT \'foobar\';',
+                0
+            ),
+            array(
+                array(
+                    'item_name'                 => 'func',
+                    'item_returnlength'         => '20',
+                    'item_returnopts_num'       => '',
+                    'item_returnopts_text'      => 'utf8',
+                    'item_definition'           => 'SELECT 0;',
+                    'item_comment'              => '',
+                    'item_definer'              => '',
+                    'item_type'                 => 'FUNCTION',
+                    'item_num_params'           => '1',
+                    'item_returntype'           => 'VARCHAR',
+                    'item_securitytype'         => 'DEFINER',
+                    'item_sqldataaccess'        => 'READ SQL DATA'
+                ),
+                'CREATE FUNCTION `func`() RETURNS VARCHAR(20) CHARSET utf8 NOT DETERMINISTIC SQL SECURITY DEFINER SELECT 0;',
+                0
+            ),
+            // Testing failures
+            array(
+                array(
+                ),
+                'CREATE () NOT DETERMINISTIC ', // invalid query
+                3
+            ),
+            array(
+                array(
+                    'item_name'                 => 'proc',
+                    'item_returnlength'         => '',
+                    'item_returnopts_num'       => '',
+                    'item_returnopts_text'      => '',
+                    'item_definition'           => 'SELECT 0;',
+                    'item_comment'              => 'foo',
+                    'item_definer'              => 'mehome', // invalid definer format
+                    'item_type'                 => 'PROCEDURE',
+                    'item_num_params'           => '0',
+                    'item_param_dir'            => '',
+                    'item_param_name'           => '',
+                    'item_param_type'           => '',
+                    'item_param_length'         => '',
+                    'item_param_opts_num'       => '',
+                    'item_param_opts_text'      => '',
+                    'item_returntype'           => '',
+                    'item_isdeterministic'      => '',
+                    'item_securitytype'         => 'INVOKER',
+                    'item_sqldataaccess'        => 'NO SQL'
+                ),
+                'CREATE PROCEDURE `proc`() COMMENT \'foo\' DETERMINISTIC NO SQL SQL SECURITY INVOKER SELECT 0;', // valid query
+                1
+            ),
+            array(
+                array(
+                    'item_name'                 => 'proc',
+                    'item_returnlength'         => '',
+                    'item_returnopts_num'       => '',
+                    'item_returnopts_text'      => '',
+                    'item_definition'           => 'SELECT 0;',
+                    'item_comment'              => '',
+                    'item_definer'              => '',
+                    'item_type'                 => 'PROCEDURE',
+                    'item_num_params'           => '2',
+                    'item_param_dir'            => array('FAIL', 'INOUT'), // invalid direction
+                    'item_param_name'           => array('pa`ram', 'goo'),
+                    'item_param_type'           => array('INT', 'ENUM'),
+                    'item_param_length'         => array('10', ''), // missing ENUM values
+                    'item_param_opts_num'       => array('ZEROFILL', ''),
+                    'item_param_opts_text'      => array('utf8', 'latin1'),
+                    'item_returntype'           => '',
+                    'item_securitytype'         => 'DEFINER',
+                    'item_sqldataaccess'        => 'foobar' // invalid, will just be ignored withour throwing errors
+                ),
+                'CREATE PROCEDURE `proc`((10) ZEROFILL, INOUT `goo` ENUM CHARSET latin1) NOT DETERMINISTIC SQL SECURITY DEFINER SELECT 0;', // invalid query
+                2
+            ),
+            array(
+                array(
+                    'item_name'                 => 'func',
+                    'item_returnlength'         => '', // missing length for VARCHAR
+                    'item_returnopts_num'       => '',
+                    'item_returnopts_text'      => 'utf8',
+                    'item_definition'           => 'SELECT 0;',
+                    'item_comment'              => '',
+                    'item_definer'              => '',
+                    'item_type'                 => 'FUNCTION',
+                    'item_num_params'           => '2',
+                    'item_param_dir'            => array('IN'),
+                    'item_param_name'           => array(''), // missing name
+                    'item_param_type'           => array('INT'),
+                    'item_param_length'         => array('10'),
+                    'item_param_opts_num'       => array('ZEROFILL'),
+                    'item_param_opts_text'      => array('latin1'),
+                    'item_returntype'           => 'VARCHAR',
+                    'item_securitytype'         => 'DEFINER',
+                    'item_sqldataaccess'        => ''
+                ),
+                'CREATE FUNCTION `func`() RETURNS VARCHAR CHARSET utf8 NOT DETERMINISTIC SQL SECURITY DEFINER SELECT 0;', // invalid query
+                2
+            ),
+            array(
+                array(
+                    'item_name'                 => 'func',
+                    'item_returnlength'         => '',
+                    'item_returnopts_num'       => '',
+                    'item_returnopts_text'      => '',
+                    'item_definition'           => 'SELECT 0;',
+                    'item_comment'              => '',
+                    'item_definer'              => '',
+                    'item_type'                 => 'FUNCTION',
+                    'item_num_params'           => '0',
+                    'item_returntype'           => 'FAIL', // invalid return type
+                    'item_securitytype'         => 'DEFINER',
+                    'item_sqldataaccess'        => ''
+                ),
+                'CREATE FUNCTION `func`()  NOT DETERMINISTIC SQL SECURITY DEFINER SELECT 0;', // invalid query
+                1
+            ),
+        );
+    }
+}
+?>
diff --git a/test/libraries/rte/PMA_TRI_getDataFromRequest_test.php b/test/libraries/rte/PMA_TRI_getDataFromRequest_test.php
new file mode 100644
index 0000000..af10eaa
--- /dev/null
+++ b/test/libraries/rte/PMA_TRI_getDataFromRequest_test.php
@@ -0,0 +1,78 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Test for fetching trigger data from HTTP request
+ *
+ * @package phpMyAdmin-test
+ */
+
+/*
+ * Include to test.
+ */
+require_once 'libraries/rte/rte_triggers.lib.php';
+
+class PMA_TRI_getDataFromRequest_test extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider provider
+     */
+    public function testgetDataFromRequest_empty($in, $out)
+    {
+        global $_REQUEST;
+
+        unset($_REQUEST);
+        foreach ($in as $key => $value) {
+            if ($value !== '') {
+                $_REQUEST[$key] = $value;
+            }
+        }
+        $this->assertEquals($out, PMA_TRI_getDataFromRequest());
+    }
+
+    public function provider()
+    {
+        return array(
+            array(
+                array(
+                    'item_name'               => '',
+                    'item_table'              => '',
+                    'item_original_name'      => '',
+                    'item_action_timing'      => '',
+                    'item_event_manipulation' => '',
+                    'item_definition'         => '',
+                    'item_definer'            => ''
+                ),
+                array(
+                    'item_name'               => '',
+                    'item_table'              => '',
+                    'item_original_name'      => '',
+                    'item_action_timing'      => '',
+                    'item_event_manipulation' => '',
+                    'item_definition'         => '',
+                    'item_definer'            => ''
+                )
+            ),
+            array(
+                array(
+                    'item_name'               => 'foo',
+                    'item_table'              => 'foo',
+                    'item_original_name'      => 'foo',
+                    'item_action_timing'      => 'foo',
+                    'item_event_manipulation' => 'foo',
+                    'item_definition'         => 'foo',
+                    'item_definer'            => 'foo'
+                ),
+                array(
+                    'item_name'               => 'foo',
+                    'item_table'              => 'foo',
+                    'item_original_name'      => 'foo',
+                    'item_action_timing'      => 'foo',
+                    'item_event_manipulation' => 'foo',
+                    'item_definition'         => 'foo',
+                    'item_definer'            => 'foo'
+                )
+            )
+        );
+    }
+}
+?>
diff --git a/test/libraries/rte/PMA_TRI_getEditorForm_test.php b/test/libraries/rte/PMA_TRI_getEditorForm_test.php
new file mode 100644
index 0000000..53dc510
--- /dev/null
+++ b/test/libraries/rte/PMA_TRI_getEditorForm_test.php
@@ -0,0 +1,289 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Test for generating trigger editor
+ *
+ * @package phpMyAdmin-test
+ */
+require_once 'libraries/php-gettext/gettext.inc';
+require_once 'libraries/url_generating.lib.php';
+require_once 'libraries/common.lib.php';
+/*
+ * Include to test.
+ */
+require_once 'libraries/rte/rte_triggers.lib.php';
+
+class PMA_TRI_getEditorForm_test extends PHPUnit_Framework_TestCase
+{
+    public function setUp()
+    {
+        if (! function_exists('PMA_DBI_get_tables')) {
+            function PMA_DBI_get_tables($db)
+            {
+                return array('table1', 'table`2');
+            }
+        }
+        $GLOBALS['tear_down']['token'] = false;
+        $GLOBALS['tear_down']['server'] = false;
+        if (! isset($_SESSION[' PMA_token '])) {
+            $_SESSION[' PMA_token '] = '';
+            $GLOBALS['tear_down']['token'] = true;
+        }
+        if (! isset($GLOBALS['cfg']['ServerDefault'])) {
+            $GLOBALS['cfg']['ServerDefault'] = '';
+            $GLOBALS['tear_down']['server'] = true;
+        }
+    }
+
+    public function tearDown()
+    {
+        if ($GLOBALS['tear_down']['token']) {
+            unset($_SESSION[' PMA_token ']);
+        }
+        if ($GLOBALS['tear_down']['server']) {
+            unset($GLOBALS['cfg']['ServerDefault']);
+        }
+        unset($GLOBALS['tear_down']);
+    }
+
+    /**
+     * @dataProvider provider_add
+     */
+    public function testgetEditorForm_add($data, $matcher)
+    {
+        $GLOBALS['is_ajax_request'] = false;
+        PMA_TRI_setGlobals();
+        $this->assertTag($matcher, PMA_TRI_getEditorForm('add', $data), '', false);
+    }
+
+    public function provider_add()
+    {
+        $data = array(
+            'item_name'               => '',
+            'item_table'              => 'table1',
+            'item_original_name'      => '',
+            'item_action_timing'      => '',
+            'item_event_manipulation' => '',
+            'item_definition'         => '',
+            'item_definer'            => ''
+        );
+
+        return array(
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'add_item'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_name'
+                    )
+                )
+            ),
+            array(
+                $data,
+                 array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_table'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_timing'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_event'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'textarea',
+                    'attributes' => array(
+                        'name' => 'item_definition'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_definer'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'editor_process_add'
+                    )
+                )
+            )
+        );
+    }
+
+    /**
+     * @dataProvider provider_edit
+     */
+    public function testgetEditorForm_edit($data, $matcher)
+    {
+        $GLOBALS['is_ajax_request'] = false;
+        PMA_TRI_setGlobals();
+        $this->assertTag($matcher, PMA_TRI_getEditorForm('edit', $data), '', false);
+    }
+
+    public function provider_edit()
+    {
+        $data = array(
+            'item_name'               => 'foo',
+            'item_table'              => 'table1',
+            'item_original_name'      => 'bar',
+            'item_action_timing'      => 'BEFORE',
+            'item_event_manipulation' => 'INSERT',
+            'item_definition'         => 'SET @A=1;',
+            'item_definer'            => ''
+        );
+
+        return array(
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'edit_item'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_name'
+                    )
+                )
+            ),
+            array(
+                $data,
+                 array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_table'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_timing'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'select',
+                    'attributes' => array(
+                        'name' => 'item_event'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'textarea',
+                    'attributes' => array(
+                        'name' => 'item_definition'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'item_definer'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'editor_process_edit'
+                    )
+                )
+            )
+        );
+    }
+
+    /**
+     * @dataProvider provider_ajax
+     */
+    public function testgetEditorForm_ajax($data, $matcher)
+    {
+        $GLOBALS['is_ajax_request'] = true;
+        PMA_TRI_setGlobals();
+        $this->assertTag($matcher, PMA_TRI_getEditorForm('edit', $data), '', false);
+    }
+
+    public function provider_ajax()
+    {
+        $data = array(
+            'item_name'               => 'foo',
+            'item_table'              => 'table1',
+            'item_original_name'      => 'bar',
+            'item_action_timing'      => 'BEFORE',
+            'item_event_manipulation' => 'INSERT',
+            'item_definition'         => 'SET @A=1;',
+            'item_definer'            => ''
+        );
+
+        return array(
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'editor_process_edit'
+                    )
+                )
+            ),
+            array(
+                $data,
+                array(
+                    'tag' => 'input',
+                    'attributes' => array(
+                        'name' => 'ajax_request'
+                    )
+                )
+            )
+        );
+    }
+}
+?>
diff --git a/test/libraries/rte/PMA_TRI_getQueryFromRequest_test.php b/test/libraries/rte/PMA_TRI_getQueryFromRequest_test.php
new file mode 100644
index 0000000..d6e18ad
--- /dev/null
+++ b/test/libraries/rte/PMA_TRI_getQueryFromRequest_test.php
@@ -0,0 +1,103 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Test for generating CREATE TRIGGER query from HTTP request
+ *
+ * @package phpMyAdmin-test
+ */
+
+/*
+ * Needed for PMA_backquote()
+ */
+require_once 'libraries/common.lib.php';
+
+/*
+ * Needed by PMA_TRI_getQueryFromRequest()
+ */
+require_once 'libraries/php-gettext/gettext.inc';
+
+/*
+ * Include to test.
+ */
+require_once 'libraries/rte/rte_triggers.lib.php';
+
+
+class PMA_TRI_getQueryFromRequest_test extends PHPUnit_Framework_TestCase
+{
+    public function setUp()
+    {
+        if (! function_exists('PMA_DBI_get_tables')) {
+            function PMA_DBI_get_tables($db)
+            {
+                return array('table1', 'table`2');
+            }
+        }
+    }
+
+    /**
+     * @dataProvider provider
+     */
+    public function testgetQueryFromRequest($definer, $name, $timing, $event, $table, $definition, $query, $num_err)
+    {
+        global $_REQUEST, $errors;
+
+        $errors = array();
+        PMA_TRI_setGlobals();
+
+        $_REQUEST['item_definer']    = $definer;
+        $_REQUEST['item_name']       = $name;
+        $_REQUEST['item_timing']     = $timing;
+        $_REQUEST['item_event']      = $event;
+        $_REQUEST['item_table']      = $table;
+        $_REQUEST['item_definition'] = $definition;
+
+        $this->assertEquals($query, PMA_TRI_getQueryFromRequest());
+        $this->assertEquals($num_err, count($errors));
+    }
+
+    public function provider()
+    {
+        return array(
+            array('',
+                '',
+                '',
+                '',
+                '',
+                '',
+                'CREATE TRIGGER ON  FOR EACH ROW ',
+                5
+            ),
+            array(
+                'root',
+                'trigger',
+                'BEFORE',
+                'INSERT',
+                'table`2',
+                'SET @A=NULL',
+                'CREATE TRIGGER `trigger` BEFORE INSERT ON `table``2` FOR EACH ROW SET @A=NULL',
+                1
+            ),
+            array(
+                'foo`s at host',
+                'trigger`s test',
+                'AFTER',
+                'foo',
+                'table3',
+                'BEGIN SET @A=1; SET @B=2; END',
+                'CREATE DEFINER=`foo``s`@`host` TRIGGER `trigger``s test` AFTER ON  FOR EACH ROW BEGIN SET @A=1; SET @B=2; END',
+                2
+            ),
+            array(
+                'root at localhost',
+                'trigger',
+                'BEFORE',
+                'INSERT',
+                'table1',
+                'SET @A=NULL',
+                'CREATE DEFINER=`root`@`localhost` TRIGGER `trigger` BEFORE INSERT ON `table1` FOR EACH ROW SET @A=NULL',
+                0
+            ),
+        );
+    }
+}
+?>


hooks/post-receive
-- 
phpMyAdmin




More information about the Git mailing list