xref: /dokuwiki/_test/tests/test/edit_and_save.test.php (revision 572dc222f8ab503392a593483bcc14fb9104f557)
1*572dc222SLarsDW223<?php
2*572dc222SLarsDW223
3*572dc222SLarsDW223/**
4*572dc222SLarsDW223 * @group integration
5*572dc222SLarsDW223 */
6*572dc222SLarsDW223class EditAndSaveTest extends DokuWikiTest {
7*572dc222SLarsDW223
8*572dc222SLarsDW223    /**
9*572dc222SLarsDW223     * Execute the following requests:
10*572dc222SLarsDW223     * - Section edit a page (headline 2, first occurrence)
11*572dc222SLarsDW223     * - Save a page
12*572dc222SLarsDW223     * - Redirect
13*572dc222SLarsDW223     * Check if the header id is transmitted and if the final redirect
14*572dc222SLarsDW223     * points to the correct header.
15*572dc222SLarsDW223     */
16*572dc222SLarsDW223    function testEditSaveRedirect_Headline2_A() {
17*572dc222SLarsDW223        $request = new TestRequest();
18*572dc222SLarsDW223
19*572dc222SLarsDW223        $input = array(
20*572dc222SLarsDW223            'id'     => 'wiki:editandsavetest'
21*572dc222SLarsDW223        );
22*572dc222SLarsDW223
23*572dc222SLarsDW223        // Show page
24*572dc222SLarsDW223        $response = $request->post($input);
25*572dc222SLarsDW223        $content = $response->getContent();
26*572dc222SLarsDW223        $this->assertTrue(!empty($content));
27*572dc222SLarsDW223
28*572dc222SLarsDW223        // If the test page has got the right content for our test it should have
29*572dc222SLarsDW223        // two headlines with the title "Headline2"
30*572dc222SLarsDW223        preg_match_all('#<h1[^>]*>Headline2</h1[^>]*>#', $content, $matches, PREG_SET_ORDER);
31*572dc222SLarsDW223        $this->assertEquals(2, count($matches));
32*572dc222SLarsDW223
33*572dc222SLarsDW223        // Get the header ids
34*572dc222SLarsDW223        $result = preg_match('/id="(.*)"/', $matches [0][0], $idA);
35*572dc222SLarsDW223        $this->assertEquals(1, $result);
36*572dc222SLarsDW223        $result = preg_match('/id="(.*)"/', $matches [1][0], $idB);
37*572dc222SLarsDW223        $this->assertEquals(1, $result);
38*572dc222SLarsDW223        $this->assertTrue($idA != $idB);
39*572dc222SLarsDW223
40*572dc222SLarsDW223        // Search the section edit form/button for the second id
41*572dc222SLarsDW223        $pattern  = '/<form class="button btn_secedit".*>.*';
42*572dc222SLarsDW223        $pattern .= '<input type="hidden" name="hid" value="';
43*572dc222SLarsDW223        $pattern .= $idA[1];
44*572dc222SLarsDW223        $pattern .= '" \/>.*<\/form>/';
45*572dc222SLarsDW223        $result = preg_match($pattern, $content, $formA);
46*572dc222SLarsDW223        $this->assertEquals(1, $result);
47*572dc222SLarsDW223
48*572dc222SLarsDW223        // Extract all inputs from the form
49*572dc222SLarsDW223        $result = preg_match_all('/<input type="hidden" name="([^"]*)" value="([^"]*)" \/>/', $formA[0], $matches, PREG_SET_ORDER);
50*572dc222SLarsDW223        $input = array();
51*572dc222SLarsDW223        foreach ($matches as $match) {
52*572dc222SLarsDW223            $input[$match[1]] = $match[2];
53*572dc222SLarsDW223        }
54*572dc222SLarsDW223        $this->assertEquals($input['hid'], $idA[1]);
55*572dc222SLarsDW223
56*572dc222SLarsDW223        // Post the input fields (= do a section edit)
57*572dc222SLarsDW223        $response = $request->post($input, '/doku.php');
58*572dc222SLarsDW223        $content = $response->getContent();
59*572dc222SLarsDW223
60*572dc222SLarsDW223        // Our header id should have been sent back to us in the edit
61*572dc222SLarsDW223        // form as an hidden input field
62*572dc222SLarsDW223        $content = str_replace("\n", " ", $content);
63*572dc222SLarsDW223        $pattern  = '/<form id="dw__editform"[^>]*>.*';
64*572dc222SLarsDW223        $pattern .= '<input type="hidden" name="hid" value="';
65*572dc222SLarsDW223        $pattern .= $idA[1];
66*572dc222SLarsDW223        $pattern .= '" \/>.*<\/form>/';
67*572dc222SLarsDW223        $result = preg_match($pattern, $content, $editForm);
68*572dc222SLarsDW223        $this->assertEquals(1, $result);
69*572dc222SLarsDW223
70*572dc222SLarsDW223        // Extract all inputs from the edit form
71*572dc222SLarsDW223        $result = preg_match_all('/<input type="hidden" name="([^"]*)" value="([^"]*)" \/>/', $editForm[0], $matches, PREG_SET_ORDER);
72*572dc222SLarsDW223        $input = array();
73*572dc222SLarsDW223        foreach ($matches as $match) {
74*572dc222SLarsDW223            $input[$match[1]] = $match[2];
75*572dc222SLarsDW223        }
76*572dc222SLarsDW223        $this->assertEquals($input['hid'], $idA[1]);
77*572dc222SLarsDW223        $input['do'] = 'save';
78*572dc222SLarsDW223
79*572dc222SLarsDW223        // Post the input fields (= save page)
80*572dc222SLarsDW223        $response = $request->post($input, '/doku.php');
81*572dc222SLarsDW223
82*572dc222SLarsDW223        // The response should carry a notification that a redirect
83*572dc222SLarsDW223        // was executed to our header ID
84*572dc222SLarsDW223        $found = null;
85*572dc222SLarsDW223        $notifications = $response->getNotifications();
86*572dc222SLarsDW223        foreach ($notifications as $notification) {
87*572dc222SLarsDW223            if ($notification['name'] == 'send_redirect') {
88*572dc222SLarsDW223                $found = &$notification;
89*572dc222SLarsDW223            }
90*572dc222SLarsDW223        }
91*572dc222SLarsDW223        $this->assertTrue($found !== null);
92*572dc222SLarsDW223        $hash = strpos($found['url'], '#');
93*572dc222SLarsDW223        $headerID = substr($found['url'], $hash);
94*572dc222SLarsDW223        $this->assertEquals($headerID, '#'.$idA[1]);
95*572dc222SLarsDW223    }
96*572dc222SLarsDW223
97*572dc222SLarsDW223    /**
98*572dc222SLarsDW223     * Execute the following requests:
99*572dc222SLarsDW223     * - Section edit a page (headline 2, second occurrence)
100*572dc222SLarsDW223     * - Save a page
101*572dc222SLarsDW223     * - Redirect
102*572dc222SLarsDW223     * Check if the header id is transmitted and if the final redirect
103*572dc222SLarsDW223     * points to the correct header.
104*572dc222SLarsDW223     */
105*572dc222SLarsDW223    function testEditSaveRedirect_Headline2_B() {
106*572dc222SLarsDW223        $request = new TestRequest();
107*572dc222SLarsDW223
108*572dc222SLarsDW223        $input = array(
109*572dc222SLarsDW223            'id'     => 'wiki:editandsavetest'
110*572dc222SLarsDW223        );
111*572dc222SLarsDW223
112*572dc222SLarsDW223        // Show page
113*572dc222SLarsDW223        $response = $request->post($input);
114*572dc222SLarsDW223        $content = $response->getContent();
115*572dc222SLarsDW223        $this->assertTrue(!empty($content));
116*572dc222SLarsDW223
117*572dc222SLarsDW223        // If the test page has got the right content for our test it should have
118*572dc222SLarsDW223        // two headlines with the title "Headline2"
119*572dc222SLarsDW223        preg_match_all('#<h1[^>]*>Headline2</h1[^>]*>#', $content, $matches, PREG_SET_ORDER);
120*572dc222SLarsDW223        $this->assertEquals(2, count($matches));
121*572dc222SLarsDW223
122*572dc222SLarsDW223        // Get the header ids
123*572dc222SLarsDW223        $result = preg_match('/id="(.*)"/', $matches [0][0], $idA);
124*572dc222SLarsDW223        $this->assertEquals(1, $result);
125*572dc222SLarsDW223        $result = preg_match('/id="(.*)"/', $matches [1][0], $idB);
126*572dc222SLarsDW223        $this->assertEquals(1, $result);
127*572dc222SLarsDW223        $this->assertTrue($idA != $idB);
128*572dc222SLarsDW223
129*572dc222SLarsDW223        // Search the section edit form/button for the second id
130*572dc222SLarsDW223        $pattern  = '/<form class="button btn_secedit".*>.*';
131*572dc222SLarsDW223        $pattern .= '<input type="hidden" name="hid" value="';
132*572dc222SLarsDW223        $pattern .= $idB[1];
133*572dc222SLarsDW223        $pattern .= '" \/>.*<\/form>/';
134*572dc222SLarsDW223        $result = preg_match($pattern, $content, $formB);
135*572dc222SLarsDW223        $this->assertEquals(1, $result);
136*572dc222SLarsDW223
137*572dc222SLarsDW223        // Extract all inputs from the form
138*572dc222SLarsDW223        $result = preg_match_all('/<input type="hidden" name="([^"]*)" value="([^"]*)" \/>/', $formB[0], $matches, PREG_SET_ORDER);
139*572dc222SLarsDW223        $input = array();
140*572dc222SLarsDW223        foreach ($matches as $match) {
141*572dc222SLarsDW223            $input[$match[1]] = $match[2];
142*572dc222SLarsDW223        }
143*572dc222SLarsDW223        $this->assertEquals($input['hid'], $idB[1]);
144*572dc222SLarsDW223
145*572dc222SLarsDW223        // Post the input fields (= do a section edit)
146*572dc222SLarsDW223        $response = $request->post($input, '/doku.php');
147*572dc222SLarsDW223        $content = $response->getContent();
148*572dc222SLarsDW223
149*572dc222SLarsDW223        // Our header id should have been sent back to us in the edit
150*572dc222SLarsDW223        // form as an hidden input field
151*572dc222SLarsDW223        $content = str_replace("\n", " ", $content);
152*572dc222SLarsDW223        $pattern  = '/<form id="dw__editform"[^>]*>.*';
153*572dc222SLarsDW223        $pattern .= '<input type="hidden" name="hid" value="';
154*572dc222SLarsDW223        $pattern .= $idB[1];
155*572dc222SLarsDW223        $pattern .= '" \/>.*<\/form>/';
156*572dc222SLarsDW223        $result = preg_match($pattern, $content, $editForm);
157*572dc222SLarsDW223        $this->assertEquals(1, $result);
158*572dc222SLarsDW223
159*572dc222SLarsDW223        // Extract all inputs from the edit form
160*572dc222SLarsDW223        $result = preg_match_all('/<input type="hidden" name="([^"]*)" value="([^"]*)" \/>/', $editForm[0], $matches, PREG_SET_ORDER);
161*572dc222SLarsDW223        $input = array();
162*572dc222SLarsDW223        foreach ($matches as $match) {
163*572dc222SLarsDW223            $input[$match[1]] = $match[2];
164*572dc222SLarsDW223        }
165*572dc222SLarsDW223        $this->assertEquals($input['hid'], $idB[1]);
166*572dc222SLarsDW223        $input['do'] = 'save';
167*572dc222SLarsDW223
168*572dc222SLarsDW223        // Post the input fields (= save page)
169*572dc222SLarsDW223        $response = $request->post($input, '/doku.php');
170*572dc222SLarsDW223
171*572dc222SLarsDW223        // The response should carry a notification that a redirect
172*572dc222SLarsDW223        // was executed to our header ID
173*572dc222SLarsDW223        $found = null;
174*572dc222SLarsDW223        $notifications = $response->getNotifications();
175*572dc222SLarsDW223        foreach ($notifications as $notification) {
176*572dc222SLarsDW223            if ($notification['name'] == 'send_redirect') {
177*572dc222SLarsDW223                $found = &$notification;
178*572dc222SLarsDW223            }
179*572dc222SLarsDW223        }
180*572dc222SLarsDW223        $this->assertTrue($found !== null);
181*572dc222SLarsDW223        $hash = strpos($found['url'], '#');
182*572dc222SLarsDW223        $headerID = substr($found['url'], $hash);
183*572dc222SLarsDW223        $this->assertEquals($headerID, '#'.$idB[1]);
184*572dc222SLarsDW223    }
185*572dc222SLarsDW223}
186