link_error_detector_test.py revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1#!/usr/bin/env python
2# Copyright 2013 The Chromium Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6import unittest
7
8from file_system import FileNotFoundError
9from link_error_detector import LinkErrorDetector
10from servlet import Response
11from test_file_system import TestFileSystem
12
13file_system = TestFileSystem({
14  'docs': {
15    'templates': {
16      'public': {
17        'apps': {
18          '404.html': '404',
19          'index.html': '''
20            <h1 id="actual-top">Hello</h1>
21            <a href="#top">world</p>
22            <a href="#actual-top">!</a>
23            <a href="broken.json"></a>
24            <a href="crx.html"></a>
25            ''',
26          'crx.html': '''
27            <a href="index.html#actual-top">back</a>
28            <a href="broken.html"></a>
29            <a href="devtools.events.html">do to underscore translation</a>
30            ''',
31          'devtools_events.html': '''
32            <a href=" http://www.google.com/">leading space in href</a>
33            <a href=" index.html">home</a>
34            <a href="index.html#invalid"></a>
35            <a href="fake.html#invalid"></a>
36            ''',
37          'unreachable.html': '''
38            <p>so lonely</p>
39            <a href="#aoesu"></a>
40            <a href="invalid.html"></a>
41            ''',
42          'devtools_disconnected.html': ''
43        }
44      }
45    },
46    'static': {},
47    'examples': {},
48  }
49})
50
51class LinkErrorDetectorTest(unittest.TestCase):
52  def _Render(self, path):
53    try:
54      return Response(
55          content=file_system.ReadSingle('docs/templates/public/' + path).Get(),
56          status=200)
57    except FileNotFoundError:
58      return Response(status=404)
59
60  def testGetBrokenLinks(self):
61    expected_broken_links = set([
62      (404, 'apps/crx.html', 'apps/broken.html', 'target page not found'),
63      (404, 'apps/index.html', 'apps/broken.json', 'target page not found'),
64      (404, 'apps/unreachable.html', 'apps/invalid.html',
65          'target page not found'),
66      (404, 'apps/devtools_events.html', 'apps/fake.html#invalid',
67          'target page not found'),
68      (200, 'apps/devtools_events.html', 'apps/index.html#invalid',
69          'target anchor not found'),
70      (200, 'apps/unreachable.html', '#aoesu', 'target anchor not found')])
71
72    link_error_detector = LinkErrorDetector(
73        file_system, self._Render, 'templates/public/', ('apps/index.html'))
74    broken_links = link_error_detector.GetBrokenLinks()
75
76    self.assertEqual(expected_broken_links, set(broken_links))
77
78  def testGetOrphanedPages(self):
79    expected_orphaned_pages = set([
80      'apps/unreachable.html',
81      'apps/devtools_disconnected.html'])
82
83    link_error_detector = LinkErrorDetector(
84        file_system, self._Render, 'templates/public/', ('apps/crx.html',))
85    orphaned_pages = link_error_detector.GetOrphanedPages()
86
87    self.assertEqual(expected_orphaned_pages, set(orphaned_pages))
88
89if __name__ == '__main__':
90  unittest.main()
91