view tests/test_silos_webmention.py @ 33:9e4eb3f2754e

Improve handling of character limits in html stripping The code now more closely keeps track of character counts during html stripping, and should be absolutely exact. When the limit is exceeded, it now restarts the stripping without any URLs to prevent incorrect trimming. It also better preserves whitespace in the original post. New tests are added for Twitter silo to ensure it works as expected.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 10 May 2023 16:10:12 -0700
parents d3c4c5082bbc
children
line wrap: on
line source

import unittest.mock
import requests


def test_one_article_no_mentions(cli, feedutil):
    feed = cli.createTempFeed(feedutil.makeFeed(
        """<h1 class="p-name">A new article</h1>
<div class="e-content">
<p>This is the abstract of the article.</p>
<p>Read more at <a class="u-url" href="https://example.org/a-new-article">permalink</a>.</p>
</div>
"""  # NOQA
    ))

    cli.appendSiloConfig('test', 'webmention', url='/blah')
    cli.setFeedConfig('feed', feed)

    with unittest.mock.patch('requests.get') as mock_get, \
            unittest.mock.patch('requests.post') as mock_post:
        mock_get.side_effect = [
            _MockResponse('')]
        mock_post.side_effect = []
        ctx, _ = cli.run('process')
        assert mock_get.call_args_list[0][0] == ('https://example.org/a-new-article',)  # NOQA


def test_one_article_one_mention(cli, feedutil):
    feed = cli.createTempFeed(feedutil.makeFeed(
        """<h1 class="p-name">A new article</h1>
<div class="e-content">
<p>This is the abstract of the article.</p>
<p>Read more at <a class="u-url" href="https://example.org/a-new-article">permalink</a>.</p>
</div>
"""  # NOQA
    ))

    cli.appendSiloConfig('test', 'webmention', url='/blah')
    cli.setFeedConfig('feed', feed)

    with unittest.mock.patch('requests.get') as mock_get, \
            unittest.mock.patch('requests.post') as mock_post:
        mock_get.side_effect = [
            _MockResponse("""
<p>This is a reply to <a href="https://other.org/article">another article<a>.</p>
"""),  # NOQA
            _MockResponse("""
<html><head>
    <link rel="webmention" href="https://other.org/webmention">
</head><body>
</body></html>""")]
        mock_post.side_effect = [
            _MockResponse('')]
        ctx, _ = cli.run('process')
        assert mock_get.call_args_list[0][0] == ('https://example.org/a-new-article',)  # NOQA
        assert mock_get.call_args_list[1][0] == ('https://other.org/article',)  # NOQA
        assert mock_post.call_args_list[0][0] == ('https://other.org/webmention',)  # NOQA


class _MockResponse:
    def __init__(self, txt):
        self.status_code = requests.codes.ok
        self.headers = {}
        self.history = []
        self.text = self.content = txt