Example #1
0
class RedirectorTest(unittest.TestCase):
    def setUp(self):
        self._redirector = Redirector(
            CompiledFileSystem.Factory(ObjectStoreCreator.ForTest()),
            file_system)

    def testExternalRedirection(self):
        self.assertEqual('http://something.absolute.com/',
                         self._redirector.Redirect(HOST, 'index.html'))
        self.assertEqual(
            'http://lmgtfy.com',
            self._redirector.Redirect(HOST, 'extensions/manifest/more-info'))

    def testAbsoluteRedirection(self):
        self.assertEqual('/index.html', self._redirector.Redirect(HOST, ''))
        self.assertEqual('/bar.html',
                         self._redirector.Redirect(HOST, 'apps/foo.html'))

    def testRelativeRedirection(self):
        self.assertEqual('apps/about_apps.html',
                         self._redirector.Redirect(HOST, 'apps/index.html'))
        self.assertEqual(
            'extensions/manifest.html',
            self._redirector.Redirect(HOST, 'extensions/manifest/'))
        self.assertEqual(
            'extensions/manifest.html',
            self._redirector.Redirect(HOST, 'extensions/manifest'))
        self.assertEqual('index.html',
                         self._redirector.Redirect(HOST, 'apps/'))
        self.assertEqual('index.html', self._redirector.Redirect(HOST, 'home'))

    def testNotFound(self):
        self.assertEqual(None,
                         self._redirector.Redirect(HOST, 'not/a/real/path'))
        self.assertEqual(
            None, self._redirector.Redirect(HOST, 'public/apps/okay.html'))

    def testOldHosts(self):
        self.assertEqual('https://developer.chrome.com/',
                         self._redirector.Redirect('code.google.com', ''))

    def testRefresh(self):
        self._redirector.Refresh().Get()

        expected_paths = set([
            'redirects.json', 'apps/redirects.json',
            'extensions/redirects.json', 'extensions/manifest/redirects.json'
        ])

        for path in expected_paths:
            self.assertEqual(
                Parse(file_system.ReadSingle(path).Get()),
                # Access the cache's object store to see what files were hit during
                # the cron run. Returns strings parsed as JSON.
                # TODO(jshumway): Make a non hack version of this check.
                self._redirector._cache._file_object_store.Get(
                    path).Get().cache_data)

    def testDirectoryRedirection(self):
        # Simple redirect.
        self.assertEqual(
            'extensions/manifest.html',
            self._redirector.Redirect(HOST, 'extensions/dev/manifest'))

        # Multiple hops with one file.
        self.assertEqual(
            'extensions/r4/manifest.html',
            self._redirector.Redirect(HOST, 'extensions/r1/manifest'))

        # Multiple hops w/ multiple redirection files.
        self.assertEqual(
            'extensions/r6/directory/manifest.html',
            self._redirector.Redirect(HOST, 'extensions/r5/manifest'))

        # Redirection from root directory redirector.
        self.assertEqual('apps/about_apps.html',
                         self._redirector.Redirect(HOST, 'foo/index.html'))

        # Short to long.
        self.assertEqual(
            'extensions/short/index.html',
            self._redirector.Redirect(
                HOST, 'extensions/a/very/long/dir/chain/index'))

        # Long to short.
        self.assertEqual(
            'extensions/another/long/chain/index.html',
            self._redirector.Redirect(HOST, 'extensions/_short/index'))

        # Directory redirection without a redirects.json in final directory.
        self.assertEqual(
            'extensions/noredirects2/file',
            self._redirector.Redirect(HOST, 'extensions/noredirects1/file'))

        # Directory redirection with redirects.json without rule for the filename.
        self.assertEqual(
            'extensions/nofile2/file',
            self._redirector.Redirect(HOST, 'extensions/nofile1/file'))

        # Relative directory path.
        self.assertEqual(
            'index.html',
            self._redirector.Redirect(HOST, 'relative_directory/home'))

        # Shallower directory redirects have priority.
        self.assertEqual(
            'priority/GOOD/index',
            self._redirector.Redirect(HOST, 'priority/directory/index'))

        # Don't infinitely redirect.
        self.assertEqual(
            'infinite_redirect/loop/index',
            self._redirector.Redirect(HOST, 'infinite_redirect/index'))

        # If a parent directory is redirected, redirect children properly.
        self.assertEqual(
            'parent_redirect/b/c/index',
            self._redirector.Redirect(HOST, 'parent_redirect/a/c/index'))