You are here

function PathologicTestCase::testPathologic in Pathologic 7.2

Same name and namespace in other branches
  1. 7.3 tests/pathologic.test \PathologicTestCase::testPathologic()
  2. 7 pathologic.test \PathologicTestCase::testPathologic()

File

./pathologic.test, line 29
Pathologic behavior testing.

Class

PathologicTestCase
Tests that Pathologic ain't broke.

Code

function testPathologic() {

  // Start by testing our function to build protocol-relative URLs
  $this
    ->assertEqual(_pathologic_url_to_protocol_relative('http://example.com/foo/bar'), '//example.com/foo/bar', t('Protocol-relative URL creation with http:// URL'));
  $this
    ->assertEqual(_pathologic_url_to_protocol_relative('https://example.org/baz'), '//example.org/baz', t('Protocol-relative URL creation with https:// URL'));

  // Build a phony filter
  $filter = new stdClass();
  $filter->callback = '_pathologic';
  $filter->settings = array(
    'protocol_style' => 'full',
    'local_paths' => '',
  );
  $filter->format = 0;

  // Build some paths to check against
  $test_paths = array(
    'foo' => array(
      'path' => 'foo',
      'opts' => array(),
    ),
    'foo/bar' => array(
      'path' => 'foo/bar',
      'opts' => array(),
    ),
    'foo/bar?baz' => array(
      'path' => 'foo/bar',
      'opts' => array(
        'query' => array(
          'baz' => NULL,
        ),
      ),
    ),
    'foo/bar?baz=qux' => array(
      'path' => 'foo/bar',
      'opts' => array(
        'query' => array(
          'baz' => 'qux',
        ),
      ),
    ),
    'foo/bar#baz' => array(
      'path' => 'foo/bar',
      'opts' => array(
        'fragment' => 'baz',
      ),
    ),
    'foo/bar?baz=qux&quux=quuux#quuuux' => array(
      'path' => 'foo/bar',
      'opts' => array(
        'query' => array(
          'baz' => 'qux',
          'quux' => 'quuux',
        ),
        'fragment' => 'quuuux',
      ),
    ),
    'foo%20bar?baz=qux%26quux' => array(
      'path' => 'foo bar',
      'opts' => array(
        'query' => array(
          'baz' => 'qux&quux',
        ),
      ),
    ),
    '/' => array(
      'path' => '<front>',
      'opts' => array(),
    ),
  );

  // Run tests with clean URLs both enabled and disabled
  foreach (array(
    TRUE,
    FALSE,
  ) as $clean_url) {
    variable_set('clean_url', $clean_url);

    // Run tests with absoulte filtering enabled and disabled
    foreach (array(
      'full',
      'proto-rel',
      'path',
    ) as $protocol_style) {
      $filter->settings['protocol_style'] = $protocol_style;
      $filter->format++;
      $paths = array();
      foreach ($test_paths as $path => $args) {
        $args['opts']['absolute'] = $protocol_style !== 'path';
        $paths[$path] = _pathologic_content_url($args['path'], $args['opts']);
        if ($protocol_style === 'proto-rel') {
          $paths[$path] = _pathologic_url_to_protocol_relative($paths[$path]);
        }
      }
      $t10ns = array(
        '!clean' => $clean_url ? t('Yes') : t('No'),
        '!ps' => $protocol_style,
      );
      $this
        ->assertEqual(_pathologic_filter('<a href="foo"><img src="foo/bar" /></a>', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="' . $paths['foo'] . '"><img src="' . $paths['foo/bar'] . '" /></a>', t('Simple paths. Clean URLs: !clean; protocol style: !ps.', $t10ns));
      $this
        ->assertEqual(_pathologic_filter('<form action="foo/bar?baz"><IMG LONGDESC="foo/bar?baz=qux" /></a>', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<form action="' . $paths['foo/bar?baz'] . '"><IMG LONGDESC="' . $paths['foo/bar?baz=qux'] . '" /></a>', t('Paths with query string. Clean URLs: !clean; protocol style: !ps.', $t10ns));
      $this
        ->assertEqual(_pathologic_filter('<a href="foo/bar#baz">', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="' . $paths['foo/bar#baz'] . '">', t('Path with fragment. Clean URLs: !clean; protocol style: !ps.', $t10ns));
      $this
        ->assertEqual(_pathologic_filter('<a href="#foo">', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="#foo">', t('Fragment-only href. Clean URLs: !clean; protocol style: !ps.', $t10ns));

      // @see https://drupal.org/node/2208223
      $this
        ->assertEqual(_pathologic_filter('<a href="#">', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="#">', t('Hash-only href. Clean URLs: !clean; protocol style: !ps.', $t10ns));
      $this
        ->assertEqual(_pathologic_filter('<a href="foo/bar?baz=qux&amp;quux=quuux#quuuux">', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="' . $paths['foo/bar?baz=qux&amp;quux=quuux#quuuux'] . '">', t('Path with query string and fragment. Clean URLs: !clean; protocol style: !ps.', $t10ns));
      $this
        ->assertEqual(_pathologic_filter('<a href="foo%20bar?baz=qux%26quux">', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="' . $paths['foo%20bar?baz=qux%26quux'] . '">', t('Path with URL encoded parts'));
      $this
        ->assertEqual(_pathologic_filter('<a href="/"></a>', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="' . $paths['/'] . '"></a>', t('Path with just slash. Clean URLs: !clean; protocol style: !ps', $t10ns));
    }
  }
  global $base_path;
  $this
    ->assertEqual(_pathologic_filter('<a href="' . $base_path . 'foo">bar</a>', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="' . _pathologic_content_url('foo', array(
    'absolute' => FALSE,
  )) . '">bar</a>', t('Paths beginning with $base_path (like WYSIWYG editors like to make)'));
  global $base_url;
  $this
    ->assertEqual(_pathologic_filter('<a href="' . $base_url . '/foo">bar</a>', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="' . _pathologic_content_url('foo', array(
    'absolute' => FALSE,
  )) . '">bar</a>', t('Paths beginning with $base_url'));

  // @see http://drupal.org/node/1617944
  $this
    ->assertEqual(_pathologic_filter('<a href="//example.com/foo">bar</a>', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="//example.com/foo">bar</a>', t('Off-site schemeless URLs (//example.com/foo) ignored'));

  // Test internal: and all base paths
  $filter->settings = array(
    'protocol_style' => 'full',
    'local_paths' => "http://example.com/qux\nhttp://example.org\n/bananas",
  );
  $filter->format++;

  // @see https://drupal.org/node/2030789
  $this
    ->assertEqual(_pathologic_filter('<a href="//example.org/foo">bar</a>', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="' . _pathologic_content_url('foo', array(
    'absolute' => TRUE,
  )) . '">bar</a>', t('On-site schemeless URLs processed'));
  $this
    ->assertEqual(_pathologic_filter('<a href="internal:foo">', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="' . _pathologic_content_url('foo', array(
    'absolute' => TRUE,
  )) . '">', t('Path Filter compatibility (internal:)'));
  $this
    ->assertEqual(_pathologic_filter('<a href="files:image.jpeg">', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="' . _pathologic_content_url(file_create_url('public://image.jpeg'), array(
    'absolute' => TRUE,
    'is_file' => TRUE,
  )) . '">', t('Path Filter compatibility (files:)'));
  $this
    ->assertEqual(_pathologic_filter('<a href="http://example.com/qux/foo"><img src="http://example.org/bar.jpeg" longdesc="/bananas/baz" /></a>', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="' . _pathologic_content_url('foo', array(
    'absolute' => TRUE,
  )) . '"><img src="' . _pathologic_content_url('bar.jpeg', array(
    'absolute' => TRUE,
  )) . '" longdesc="' . _pathologic_content_url('baz', array(
    'absolute' => TRUE,
  )) . '" /></a>', t('"All base paths for this site" functionality'));
  $this
    ->assertEqual(_pathologic_filter('<a href="webcal:foo">bar</a>', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="webcal:foo">bar</a>', t('URLs with likely protocols are ignored'));

  // Test hook_pathologic_alter() implementation.
  $this
    ->assertEqual(_pathologic_filter('<a href="foo?test=add_foo_qpart">', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="' . _pathologic_content_url('foo', array(
    'absolute' => TRUE,
    'query' => array(
      'test' => 'add_foo_qpart',
      'foo' => 'bar',
    ),
  )) . '">', t('hook_pathologic_alter(): Alter $url_params'));
  $this
    ->assertEqual(_pathologic_filter('<a href="bar?test=use_original">', $filter, NULL, LANGUAGE_NONE, NULL, NULL), '<a href="bar?test=use_original">', t('hook_pathologic_alter(): Passthrough with use_original option'));

  // Test paths to existing files when clean URLs are disabled.
  // @see http://drupal.org/node/1672430
  variable_set('clean_url', FALSE);
  $filtered_tag = _pathologic_filter('<img src="misc/druplicon.png" />', $filter, NULL, LANGUAGE_NONE, NULL, NULL);
  $this
    ->assertTrue(strpos($filtered_tag, 'q=') === FALSE, t('Paths to files don\'t have ?q= when clean URLs are off'));
}