/**
  * Should carry out any processing required by the plugin.
  */
 public function handle()
 {
     global $INPUT;
     global $ID;
     $assignments = new Assignments();
     if ($INPUT->str('action') && $INPUT->arr('assignment') && checkSecurityToken()) {
         $assignment = $INPUT->arr('assignment');
         if (!blank($assignment['assign']) && !blank($assignment['tbl'])) {
             if ($INPUT->str('action') === 'delete') {
                 $ok = $assignments->removePattern($assignment['assign'], $assignment['tbl']);
                 if (!$ok) {
                     msg('failed to remove pattern', -1);
                 }
             } else {
                 if ($INPUT->str('action') === 'add') {
                     if ($assignment['assign'][0] == '/') {
                         if (@preg_match($assignment['assign'], null) === false) {
                             msg('Invalid regular expression. Pattern not saved', -1);
                         } else {
                             $ok = $assignments->addPattern($assignment['assign'], $assignment['tbl']);
                             if (!$ok) {
                                 msg('failed to add pattern', -1);
                             }
                         }
                     } else {
                         $ok = $assignments->addPattern($assignment['assign'], $assignment['tbl']);
                         if (!$ok) {
                             msg('failed to add pattern', -1);
                         }
                     }
                 }
             }
         }
         send_redirect(wl($ID, array('do' => 'admin', 'page' => 'struct_assignments'), true, '&'));
     }
 }
 public function test_diff()
 {
     $page = 'test_save_page_without_new_text';
     $assignment = new meta\Assignments();
     $schema = 'schema1';
     $assignment->addPattern($page, $schema);
     $wikitext = 'teststring';
     // first save;
     $request = new \TestRequest();
     $structData = array($schema => array('first' => 'foo', 'second' => 'bar, baz', 'third' => 'foobar', 'fourth' => '42'));
     $request->setPost('struct_schema_data', $structData);
     $request->setPost('wikitext', $wikitext);
     $request->setPost('summary', 'content and struct data saved');
     $request->post(array('id' => $page, 'do' => 'save'), '/doku.php');
     $this->waitForTick(true);
     // second save - only struct data
     $request = new \TestRequest();
     $structData = array($schema => array('first' => 'foo', 'second' => 'bar2, baz2', 'third' => 'foobar2', 'fourth' => '42'));
     $request->setPost('struct_schema_data', $structData);
     $request->setPost('wikitext', $wikitext);
     $request->setPost('summary', '2nd revision');
     $request->post(array('id' => $page, 'do' => 'save'), '/doku.php');
     // diff
     $request = new \TestRequest();
     $response = $request->post(array('id' => $page, 'do' => 'diff'), '/doku.php');
     $pq = $response->queryHTML('table.diff_sidebyside');
     $this->assertEquals(1, $pq->length);
     $added = $pq->find('td.diff-addedline');
     $deleted = $pq->find('td.diff-deletedline');
     $this->assertEquals(2, $added->length);
     $this->assertEquals(2, $deleted->length);
     $this->assertContains('bar', $deleted->eq(0)->html());
     $this->assertContains('baz', $deleted->eq(0)->html());
     $this->assertContains('bar2', $added->eq(0)->html());
     $this->assertContains('baz2', $added->eq(0)->html());
     $this->assertContains('foobar', $deleted->eq(1)->html());
     $this->assertContains('foobar2', $added->eq(1)->html());
 }
 /**
  * @group slow
  */
 public function test_revert_page()
 {
     $page = 'test_revert_page';
     $assignment = new meta\Assignments();
     $schema = 'Schema2';
     $assignment->addPattern($page, $schema);
     $wikitext = 'teststring';
     global $conf;
     $conf['useacl'] = 1;
     $conf['superuser'] = '******';
     $_SERVER['REMOTE_USER'] = '******';
     //now it's testing as admin
     global $default_server_vars;
     $default_server_vars['REMOTE_USER'] = '******';
     //Hack until Issue #1099 is fixed
     $USERINFO['grps'] = array('admin', 'user');
     // first save;
     $request = new \TestRequest();
     $structData = array($schema => array('afirst' => 'foo', 'asecond' => 'bar, baz', 'athird' => 'foobar', 'afourth' => '42'));
     $request->setPost('struct_schema_data', $structData);
     $request->setPost('wikitext', $wikitext);
     $request->setPost('summary', 'content and struct data saved');
     $request->post(array('id' => $page, 'do' => 'save', 'sectok' => getSecurityToken()), '/doku.php');
     $this->waitForTick(true);
     // second save
     $request = new \TestRequest();
     $structData = array($schema => array('afirst' => 'foo2', 'asecond' => 'bar2, baz2', 'athird' => 'foobar2', 'afourth' => '43'));
     $request->setPost('struct_schema_data', $structData);
     $request->setPost('wikitext', $wikitext . $wikitext);
     $request->setPost('summary', 'delete page');
     $request->post(array('id' => $page, 'do' => 'save', 'sectok' => getSecurityToken()), '/doku.php');
     $this->waitForTick(true);
     // revert to first save
     $actpagelog = new \PageChangelog($page);
     $actrevisions = $actpagelog->getRevisions(0, 200);
     $actrevinfo = $actpagelog->getRevisionInfo($actrevisions[0]);
     $request = new \TestRequest();
     $request->setPost('summary', 'revert page');
     $request->post(array('id' => $page, 'do' => 'revert', 'rev' => $actrevinfo['date'], 'sectok' => getSecurityToken()), '/doku.php');
     // assert
     $pagelog = new \PageChangelog($page);
     $revisions = $pagelog->getRevisions(-1, 200);
     $revinfo = $pagelog->getRevisionInfo($revisions[0]);
     $schemaData = meta\AccessTable::byTableName($schema, $page, 0);
     $actual_struct_data = $schemaData->getDataArray();
     $expected_struct_data = array('afirst' => 'foo', 'asecond' => array('bar', 'baz'), 'athird' => 'foobar', 'afourth' => '42');
     $this->assertEquals(3, count($revisions), 'there should be 3 (three) revisions');
     $this->assertContains('restored', $revinfo['sum']);
     $this->assertEquals(DOKU_CHANGE_TYPE_REVERT, $revinfo['type']);
     $this->assertEquals($expected_struct_data, $actual_struct_data);
     // todo: timestamps?
 }