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