|
16 | 16 | from mock import patch |
17 | 17 | from pyquery import PyQuery |
18 | 18 | from StringIO import StringIO |
| 19 | +from bs4 import BeautifulSoup |
19 | 20 |
|
20 | 21 | from ietf.doc.models import Document |
21 | 22 | from ietf.group.models import Group, Role |
@@ -1613,6 +1614,23 @@ def tearDown(self): |
1613 | 1614 | settings.AGENDA_PATH = self.saved_agenda_path |
1614 | 1615 | shutil.rmtree(self.materials_dir) |
1615 | 1616 |
|
| 1617 | + def crawl_materials(self, url, top): |
| 1618 | + seen = set() |
| 1619 | + def follow(url): |
| 1620 | + seen.add(url) |
| 1621 | + r = self.client.get(url) |
| 1622 | + self.assertEqual(r.status_code, 200) |
| 1623 | + if not ('.' in url and url.rsplit('.', 1)[1] in ['tgz', 'pdf', ]): |
| 1624 | + if r.content: |
| 1625 | + page = unicontent(r) |
| 1626 | + soup = BeautifulSoup(page, 'html.parser') |
| 1627 | + for a in soup('a'): |
| 1628 | + href = a.get('href') |
| 1629 | + path = urlparse.urlparse(href).path |
| 1630 | + if (path and path not in seen and path.startswith(top)): |
| 1631 | + follow(path) |
| 1632 | + follow(url) |
| 1633 | + |
1616 | 1634 | def test_upload_bluesheets(self): |
1617 | 1635 | session = SessionFactory(meeting__type_id='ietf') |
1618 | 1636 | url = urlreverse('ietf.meeting.views.upload_session_bluesheets',kwargs={'num':session.meeting.number,'session_id':session.id}) |
@@ -1757,6 +1775,11 @@ def test_upload_minutes_agenda(self): |
1757 | 1775 | r = self.client.post(url,dict(file=test_file)) |
1758 | 1776 | self.assertContains(r, 'Could not identify the file encoding') |
1759 | 1777 |
|
| 1778 | + # Verify that we don't have dead links |
| 1779 | + url = url=urlreverse('ietf.meeting.views.session_details', kwargs={'num':session.meeting.number, 'acronym': session.group.acronym}) |
| 1780 | + top = '/meeting/%s/' % session.meeting.number |
| 1781 | + self.crawl_materials(url=url, top=top) |
| 1782 | + |
1760 | 1783 | def test_upload_minutes_agenda_unscheduled(self): |
1761 | 1784 | for doctype in ('minutes','agenda'): |
1762 | 1785 | session = SessionFactory(meeting__type_id='ietf', add_to_schedule=False) |
@@ -1799,6 +1822,11 @@ def test_upload_minutes_agenda_interim(self): |
1799 | 1822 | doc = session.sessionpresentation_set.filter(document__type_id=doctype).first().document |
1800 | 1823 | self.assertEqual(doc.rev,'00') |
1801 | 1824 |
|
| 1825 | + # Verify that we don't have dead links |
| 1826 | + url = url=urlreverse('ietf.meeting.views.session_details', kwargs={'num':session.meeting.number, 'acronym': session.group.acronym}) |
| 1827 | + top = '/meeting/%s/' % session.meeting.number |
| 1828 | + self.crawl_materials(url=url, top=top) |
| 1829 | + |
1802 | 1830 | def test_upload_slides(self): |
1803 | 1831 |
|
1804 | 1832 | session1 = SessionFactory(meeting__type_id='ietf') |
|
0 commit comments