Skip to content
This repository has been archived by the owner on Feb 8, 2018. It is now read-only.

Commit

Permalink
Refactor a bit
Browse files Browse the repository at this point in the history
- consolidate markdown tests in one place
- rename render_like_npm for consistency
- add some docstrings/futures/newlines
  • Loading branch information
chadwhitacre committed Nov 9, 2016
1 parent 9ec8a8b commit 47daf81
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 54 deletions.
2 changes: 1 addition & 1 deletion gratipay/package_managers/readmes.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ def process(dirty):
)
if raw is None:
return
processed = markdown.marky(raw)
processed = markdown.render_like_npm(raw)
db.run('''
UPDATE packages
Expand Down
10 changes: 9 additions & 1 deletion gratipay/utils/markdown.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import absolute_import, division, print_function, unicode_literals

from subprocess import Popen, PIPE

import json
Expand All @@ -6,14 +8,20 @@


def render(markdown):
"""Process markdown approximately the same way that GitHub used to.
(Note that as of November, 2016 they are migrating to CommonMark, so we are
starting to drift.)
"""
return Markup(m.html(
markdown,
extensions=m.EXT_AUTOLINK | m.EXT_STRIKETHROUGH | m.EXT_NO_INTRA_EMPHASIS,
render_flags=m.HTML_SKIP_HTML | m.HTML_TOC | m.HTML_SMARTYPANTS | m.HTML_SAFELINK
))


def marky(markdown, package=None):
def render_like_npm(markdown, package=None):
"""Process markdown the same way npm does.
Package should be a dict representing the package. If it includes `name`
Expand Down
62 changes: 58 additions & 4 deletions tests/py/test_markdown.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,74 @@
from __future__ import absolute_import, division, print_function, unicode_literals

from gratipay.testing import Harness
from gratipay.utils import markdown

from HTMLParser import HTMLParser


class TestMarkdown(Harness):

def test_marky_works(self):
# render

def test_render_renders(self):
expected = "<p>Example</p>\n"
actual = markdown.render('Example')
assert expected == actual

def test_render_escapes_scripts(self):
expected = '<p>Example alert &ldquo;hi&rdquo;;</p>\n'
actual = markdown.render('Example <script>alert "hi";</script>')
assert expected == actual

def test_render_renders_http_links(self):
expected = '<p><a href="http://example.com/">foo</a></p>\n'
assert markdown.render('[foo](http://example.com/)') == expected
expected = '<p><a href="http://example.com/">http://example.com/</a></p>\n'
assert markdown.render('<http://example.com/>') == expected

def test_render_renders_https_links(self):
expected = '<p><a href="https://example.com/">foo</a></p>\n'
assert markdown.render('[foo](https://example.com/)') == expected
expected = '<p><a href="https://example.com/">https://example.com/</a></p>\n'
assert markdown.render('<https://example.com/>') == expected

def test_render_escapes_javascript_links(self):
expected = '<p>[foo](javascript:foo)</p>\n'
assert markdown.render('[foo](javascript:foo)') == expected
expected = '<p>&lt;javascript:foo&gt;</p>\n'
assert markdown.render('<javascript:foo>') == expected

def test_render_doesnt_allow_any_explicit_anchors(self):
expected = '<p>foo</p>\n'
assert markdown.render('<a href="http://example.com/">foo</a>') == expected
expected = '<p>foo</p>\n'
assert markdown.render('<a href="https://example.com/">foo</a>') == expected
expected = '<p>foo</p>\n'
assert markdown.render('<a href="javascript:foo">foo</a>') == expected

def test_render_autolinks(self):
expected = '<p><a href="http://google.com/">http://google.com/</a></p>\n'
actual = markdown.render('http://google.com/')
assert expected == actual

def test_render_no_intra_emphasis(self):
expected = '<p>Examples like this_one and this other_one.</p>\n'
actual = markdown.render('Examples like this_one and this other_one.')
assert expected == actual


# rln - render_like_npm

def test_rln_works(self):
md = "**Hello World!**"
actual = HTMLParser().unescape(markdown.marky(md)).strip()
actual = HTMLParser().unescape(markdown.render_like_npm(md)).strip()
expected = '<p><strong>Hello World!</strong></p>'
assert actual == expected

def test_marky_handles_npm_package(self):
def test_rln_handles_npm_package(self):
md = "# Greetings, program!\nGreetings. Program."
pkg = {'name': 'greetings-program', 'description': 'Greetings, program.'}
actual = HTMLParser().unescape(markdown.marky(md, pkg)).strip()
actual = HTMLParser().unescape(markdown.render_like_npm(md, pkg)).strip()
expected = '''\
<h1 class="package-name-redundant package-description-redundant"><a id="user-content-greetings-program" class="deep-link" href="#greetings-program"><svg aria-hidden="true" class="deep-link-icon" height="16" version="1.1" width="16"><path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Greetings, program!</h1>
<p class="package-description-redundant">Greetings. Program.</p>'''
Expand Down
2 changes: 1 addition & 1 deletion tests/py/test_npm_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def load(raw):
missing_ijson = False

try:
markdown.marky('test')
markdown.render_like_npm('test')
except OSError:
missing_marky_markdown = True
else:
Expand Down
48 changes: 1 addition & 47 deletions tests/py/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from aspen.http.response import Response
from gratipay import utils
from gratipay.testing import Harness, D
from gratipay.utils import i18n, markdown, pricing, encode_for_querystring, decode_from_querystring
from gratipay.utils import i18n, pricing, encode_for_querystring, decode_from_querystring
from gratipay.utils.username import safely_reserve_a_username, FailedToReserveUsername, \
RanOutOfUsernameAttempts
from psycopg2 import IntegrityError
Expand Down Expand Up @@ -131,52 +131,6 @@ def reserve(cursor, username):
with pytest.raises(RanOutOfUsernameAttempts):
safely_reserve_a_username(cursor, gen_test_username, reserve)

def test_markdown_render_does_render(self):
expected = "<p>Example</p>\n"
actual = markdown.render('Example')
assert expected == actual

def test_markdown_render_escapes_scripts(self):
expected = '<p>Example alert &ldquo;hi&rdquo;;</p>\n'
actual = markdown.render('Example <script>alert "hi";</script>')
assert expected == actual

def test_markdown_render_renders_http_links(self):
expected = '<p><a href="http://example.com/">foo</a></p>\n'
assert markdown.render('[foo](http://example.com/)') == expected
expected = '<p><a href="http://example.com/">http://example.com/</a></p>\n'
assert markdown.render('<http://example.com/>') == expected

def test_markdown_render_renders_https_links(self):
expected = '<p><a href="https://example.com/">foo</a></p>\n'
assert markdown.render('[foo](https://example.com/)') == expected
expected = '<p><a href="https://example.com/">https://example.com/</a></p>\n'
assert markdown.render('<https://example.com/>') == expected

def test_markdown_render_escapes_javascript_links(self):
expected = '<p>[foo](javascript:foo)</p>\n'
assert markdown.render('[foo](javascript:foo)') == expected
expected = '<p>&lt;javascript:foo&gt;</p>\n'
assert markdown.render('<javascript:foo>') == expected

def test_markdown_render_doesnt_allow_any_explicit_anchors(self):
expected = '<p>foo</p>\n'
assert markdown.render('<a href="http://example.com/">foo</a>') == expected
expected = '<p>foo</p>\n'
assert markdown.render('<a href="https://example.com/">foo</a>') == expected
expected = '<p>foo</p>\n'
assert markdown.render('<a href="javascript:foo">foo</a>') == expected

def test_markdown_render_autolinks(self):
expected = '<p><a href="http://google.com/">http://google.com/</a></p>\n'
actual = markdown.render('http://google.com/')
assert expected == actual

def test_markdown_render_no_intra_emphasis(self):
expected = '<p>Examples like this_one and this other_one.</p>\n'
actual = markdown.render('Examples like this_one and this other_one.')
assert expected == actual

def test_srau_retries_work_with_db(self):
self.make_participant('deadbeef')
def gen_test_username():
Expand Down

0 comments on commit 47daf81

Please sign in to comment.