[ Index ]

PHP Cross Reference of DokuWiki

title

Body

[close]

/_test/tests/inc/File/ -> PageResolverTest.php (source)

   1  <?php
   2  
   3  namespace tests\inc\File;
   4  
   5  use dokuwiki\File\PageResolver;
   6  
   7  /**
   8   * @todo tests that make use of revisions might be wanted
   9   */
  10  class PageResolverTest extends \DokuWikiTest
  11  {
  12      /**
  13       * @return \Generator|array
  14       * @see testResolveID
  15       */
  16      public function provideResolveData()
  17      {
  18          $data = [
  19              // relative current in root
  20              ['context', 'page', 'page'],
  21              ['context', '.page', 'page'],
  22              ['context', '.:page', 'page'],
  23  
  24              // relative current in namespace
  25              ['lev1:lev2:context', 'page', 'lev1:lev2:page'],
  26              ['lev1:lev2:context', '.page', 'lev1:lev2:page'],
  27              ['lev1:lev2:context', '.:page', 'lev1:lev2:page'],
  28  
  29              // relative upper in root
  30              ['context', '..page', 'page'],
  31              ['context', '..:page', 'page'],
  32  
  33              // relative upper in namespace
  34              ['lev1:lev2:context', '..page', 'lev1:page'],
  35              ['lev1:lev2:context', '..:page', 'lev1:page'],
  36              ['lev1:lev2:context', '..:..:page', 'page'],
  37              ['lev1:lev2:context', '..:..:..:page', 'page'],
  38  
  39              // deeper nesting
  40              ['lev1:lev2:lev3:context', '..page', 'lev1:lev2:page'],
  41              ['lev1:lev2:lev3:context', '..:page', 'lev1:lev2:page'],
  42              ['lev1:lev2:lev3:context', '..:..page', 'lev1:page'],
  43              ['lev1:lev2:lev3:context', '..:..:page', 'lev1:page'],
  44              ['lev1:lev2:lev3:context', '..:..:..page', 'page'],
  45              ['lev1:lev2:lev3:context', '..:..:..:page', 'page'],
  46              ['lev1:lev2:lev3:context', '..:..:..:..page', 'page'],
  47              ['lev1:lev2:lev3:context', '..:..:..:..:page', 'page'],
  48  
  49              // strange and broken ones
  50              ['lev1:lev2:context', '....:....:page', 'lev1:lev2:page'],
  51              ['lev1:lev2:context', '..:..:lev3:page', 'lev3:page'],
  52              ['lev1:lev2:context', '..:..:lev3:..:page', 'page'],
  53              ['lev1:lev2:context', '..:..:lev3:..:page:....:...', 'page'],
  54  
  55              // relative to current page
  56              ['context', '~page', 'context:page'],
  57              ['context', '~:page', 'context:page'],
  58              ['lev1:lev2:context', '~page', 'lev1:lev2:context:page'],
  59              ['lev1:lev2:context', '~:page', 'lev1:lev2:context:page'],
  60  
  61              // start pages
  62              ['context', '.:', 'start'],
  63              ['foo:context', '.:', 'foo:start'],
  64              ['context', 'foo:', 'foo:start'],
  65              ['foo:context', 'foo:', 'foo:start'],
  66              ['context', '~foo:', 'context:foo:start'],
  67              ['foo:context', '~foo:', 'foo:context:foo:start'],
  68  
  69              // empty page links to itself
  70              ['context', '', 'context'],
  71              ['foo:context', '', 'foo:context'],
  72          ];
  73  
  74          // run each test without a hash
  75          foreach ($data as $row) {
  76              yield $row;
  77          }
  78  
  79          // run each test with a hash
  80          foreach ($data as $row) {
  81              $row[1] .= '#somehash';
  82              $row[2] .= '#somehash';
  83              yield $row;
  84          }
  85      }
  86  
  87      /**
  88       * @dataProvider provideResolveData
  89       * @param string $context
  90       * @param string $id
  91       * @param string $expected
  92       */
  93      public function testResolveID($context, $id, $expected)
  94      {
  95          $resolver = new PageResolver($context);
  96          $this->assertEquals($expected, $resolver->resolveId($id));
  97      }
  98  
  99      /**
 100       * Tilde start page bahaviour
 101       *
 102       * Please note that a ~ alone is the same as ~:
 103       */
 104      public function testTildeStartPage() {
 105          $context = 'foo:context';
 106          $resolver = new PageResolver($context);
 107  
 108          // the $context page itself does not exist
 109          // a link like that is usually not possible, but we fall back to standard start
 110          // page behaviour
 111          $this->assertEquals("$context:start", $resolver->resolveId('~:'));
 112          $this->assertEquals("$context:start", $resolver->resolveId('~'));
 113  
 114          // now $context has become the start page
 115          saveWikiText($context, 'test', 'test');
 116          $this->assertEquals($context, $resolver->resolveId('~:'));
 117  
 118          // now we have a startpage named like the namespace
 119          saveWikiText("$context:context", 'test', 'test');
 120          $this->assertEquals("$context:context", $resolver->resolveId('~:'));
 121          $this->assertEquals("$context:context", $resolver->resolveId('~'));
 122  
 123          // now we have a dedicated start page
 124          saveWikiText("$context:start", 'test', 'test');
 125          $this->assertEquals("$context:start", $resolver->resolveId('~:'));
 126          $this->assertEquals("$context:start", $resolver->resolveId('~'));
 127      }
 128  
 129      public function testResolveStartPage() {
 130  
 131          $resolver = new PageResolver('arbitrary');
 132  
 133          $expect = 'foo:start';
 134          $actual = $this->callInaccessibleMethod($resolver, 'resolveStartPage', ['foo:', false, false]);
 135          $this->assertEquals($expect, $actual, 'default non-existing');
 136  
 137          saveWikiText('foo', 'test', 'test');
 138          $expect = 'foo';
 139          $actual = $this->callInaccessibleMethod($resolver, 'resolveStartPage', ['foo:', false, false]);
 140          $this->assertEquals($expect, $actual, 'page like namespace outside');
 141  
 142          saveWikiText('foo:foo', 'test', 'test');
 143          $expect = 'foo:foo';
 144          $actual = $this->callInaccessibleMethod($resolver, 'resolveStartPage', ['foo:', false, false]);
 145          $this->assertEquals($expect, $actual, 'page like namespace inside');
 146  
 147          saveWikiText('foo:start', 'test', 'test');
 148          $expect = 'foo:start';
 149          $actual = $this->callInaccessibleMethod($resolver, 'resolveStartPage', ['foo:', false, false]);
 150          $this->assertEquals($expect, $actual, 'default existing');
 151      }
 152  
 153      /**
 154       * @return array
 155       * @see testResolveRelatives
 156       */
 157      public function provideResolveRelatives() {
 158          return [
 159              ['foo', 'foo'],
 160              ['foo:bar', 'foo:bar'],
 161              ['foo:..:bar', 'bar'],
 162              ['foo:..:..:bar', 'bar'],
 163              ['foo:.:bar', 'foo:bar'],
 164              ['foo:.:..:.:bar', 'bar'],
 165              ['foo:.:.:.:bar', 'foo:bar'],
 166              ['foo::::bar', 'foo:bar'],
 167              ['foo::::bar:', 'foo:bar:'],
 168              ['foo:bar:', 'foo:bar:'],
 169          ];
 170      }
 171  
 172      /**
 173       * @dataProvider provideResolveRelatives
 174       * @param string $input
 175       * @param string $expected
 176       */
 177      public function testResolveRelatives($input, $expected) {
 178          $resolver = new PageResolver('arbitrary');
 179  
 180          $actual = $this->callInaccessibleMethod($resolver, 'resolveRelatives', [$input]);
 181          $this->assertEquals($expected, $actual);
 182      }
 183  
 184      public function testAutoPlural()
 185      {
 186          $resolver = new PageResolver('arbitrary');
 187  
 188          $singular = 'some:page';
 189          $plural = 'some:pages';
 190  
 191  
 192          $actual = $this->callInaccessibleMethod($resolver, 'resolveAutoPlural', [$singular, '', false]);
 193          $this->assertEquals($singular, $actual); // no pages exist
 194  
 195          saveWikiText($plural, 'plural', 'plural');
 196          $actual = $this->callInaccessibleMethod($resolver, 'resolveAutoPlural', [$singular, '', false]);
 197          $this->assertEquals($plural, $actual); // plural exists
 198  
 199          saveWikiText($singular, 'singular', 'singular');
 200          $actual = $this->callInaccessibleMethod($resolver, 'resolveAutoPlural', [$singular, '', false]);
 201          $this->assertEquals($singular, $actual); // requested singular has preference
 202      }
 203  }