Mercurial > silorider
annotate tests/conftest.py @ 68:c678ca85cc25
Fixes for url flatteners
| author | Ludovic Chabant <ludovic@chabant.com> |
|---|---|
| date | Tue, 26 Dec 2023 16:32:17 -0800 |
| parents | b404445082f8 |
| children |
| rev | line source |
|---|---|
| 0 | 1 import io |
| 2 import os | |
| 3 import os.path | |
| 4 import re | |
| 5 import logging | |
| 6 import tempfile | |
| 7 import pytest | |
|
59
b404445082f8
Prevent unit tests from downloading fake posts
Ludovic Chabant <ludovic@chabant.com>
parents:
19
diff
changeset
|
8 import unittest.mock |
| 0 | 9 import silorider.main |
|
59
b404445082f8
Prevent unit tests from downloading fake posts
Ludovic Chabant <ludovic@chabant.com>
parents:
19
diff
changeset
|
10 import silorider.format |
| 0 | 11 |
| 12 | |
| 19 | 13 logger = logging.getLogger(__name__) |
| 14 | |
| 15 | |
| 0 | 16 # def pytest_collect_file(parent, path): |
| 17 # if path.ext == ".html" and path.basename.startswith("feeds"): | |
| 18 # return FeedFile(path, parent) | |
| 19 | |
| 20 | |
| 21 re_feed_test_sep = re.compile(r'^---$') | |
| 22 | |
|
59
b404445082f8
Prevent unit tests from downloading fake posts
Ludovic Chabant <ludovic@chabant.com>
parents:
19
diff
changeset
|
23 silorider.format._disable_get_card_info = True |
|
b404445082f8
Prevent unit tests from downloading fake posts
Ludovic Chabant <ludovic@chabant.com>
parents:
19
diff
changeset
|
24 |
| 0 | 25 |
| 26 class FeedFile(pytest.File): | |
| 27 def collect(self): | |
| 28 with self.fspath.open() as fp: | |
| 29 markup = fp.read() | |
| 30 | |
| 31 name = self.fspath.basename | |
| 32 html_markup, yaml_markup = re_feed_test_sep.split(markup, 1) | |
| 33 yield FeedItem(name, self, html_markup, yaml_markup) | |
| 34 | |
| 35 | |
| 36 class FeedItem(pytest.Item): | |
| 37 def __init__(self, name, parent, in_spec, out_spec): | |
| 38 super().__init__(name, parent) | |
| 39 self.in_spec = in_spec | |
| 40 self.out_spec = out_spec | |
| 41 | |
| 42 def runtest(self): | |
| 43 pass | |
| 44 | |
| 45 | |
| 46 @pytest.fixture | |
| 47 def cli(): | |
| 48 return CliRunner() | |
| 49 | |
| 50 | |
| 51 class CliRunner: | |
| 52 def __init__(self): | |
| 53 self._cfgtxt = """ | |
| 54 [cache] | |
| 55 uri=memory://for_test | |
| 56 """ | |
|
18
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
57 self._feedcfg = [] |
| 0 | 58 self._pre_hooks = [] |
| 59 self._cleanup = [] | |
| 60 | |
| 61 def getFeedPath(self, name): | |
| 62 return os.path.join(os.path.dirname(__file__), | |
| 63 'feeds', | |
| 64 '%s.html' % name) | |
| 65 | |
| 66 def createTempFeed(self, contents): | |
| 67 tmpfd, tmpname = tempfile.mkstemp() | |
| 68 with os.fdopen(tmpfd, 'w', encoding='utf8') as tmpfp: | |
| 69 tmpfp.write(contents) | |
| 70 self._cleanup.append(tmpname) | |
| 71 return tmpname | |
| 72 | |
| 73 def setConfig(self, cfgtxt): | |
| 74 self._cfgtxt = cfgtxt | |
| 75 return self | |
| 76 | |
| 77 def appendConfig(self, cfgtxt): | |
| 78 self._cfgtxt += cfgtxt | |
| 79 return self | |
| 80 | |
|
18
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
81 def appendFeedConfig(self, feed_name, feed_url): |
|
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
82 self._feedcfg.append((feed_name, feed_url)) |
|
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
83 return self |
|
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
84 |
|
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
85 def setFeedConfig(self, feed_name, feed_url): |
|
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
86 self._feedcfg = [] |
|
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
87 return self.appendFeedConfig(feed_name, feed_url) |
|
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
88 |
| 0 | 89 def appendSiloConfig(self, silo_name, silo_type, **options): |
| 90 cfgtxt = '[silo:%s]\n' % silo_name | |
| 91 cfgtxt += 'type=%s\n' % silo_type | |
| 92 if options is not None: | |
| 93 for n, v in options.items(): | |
| 94 cfgtxt += '%s=%s\n' % (n, v) | |
| 95 return self.appendConfig(cfgtxt) | |
| 96 | |
| 97 def preExecHook(self, hook): | |
| 98 self._pre_hooks.append(hook) | |
| 99 | |
| 100 def run(self, *args): | |
| 19 | 101 pre_args = ['-v'] |
|
18
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
102 if self._cfgtxt or self._feedcfg: |
|
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
103 cfgtxt = self._cfgtxt |
|
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
104 cfgtxt += '\n\n[urls]\n' |
|
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
105 for n, u in self._feedcfg: |
|
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
106 cfgtxt += '%s=%s\n' % (n, u) |
|
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
107 |
| 0 | 108 tmpfd, tmpcfg = tempfile.mkstemp() |
| 19 | 109 logger.info("Creating temporary configuration file: %s" % tmpcfg) |
| 0 | 110 with os.fdopen(tmpfd, 'w') as tmpfp: |
|
18
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
111 tmpfp.write(cfgtxt) |
| 0 | 112 self._cleanup.append(tmpcfg) |
| 19 | 113 pre_args += ['-c', tmpcfg] |
| 0 | 114 |
| 115 captured = io.StringIO() | |
| 116 handler = logging.StreamHandler(captured) | |
| 117 handler.setLevel(logging.INFO) | |
| 118 silorider_logger = logging.getLogger('silorider') | |
| 119 silorider_logger.addHandler(handler) | |
| 120 | |
| 121 main_ctx = None | |
| 122 main_res = None | |
| 123 | |
| 124 def pre_exec_hook(ctx): | |
| 125 for h in self._pre_hooks: | |
| 126 h(ctx) | |
| 127 | |
| 128 def post_exec_hook(ctx, res): | |
| 129 nonlocal main_ctx, main_res | |
| 130 main_ctx = ctx | |
| 131 main_res = res | |
| 132 | |
| 133 silorider.main.pre_exec_hook = pre_exec_hook | |
| 134 silorider.main.post_exec_hook = post_exec_hook | |
| 135 | |
| 136 args = pre_args + list(args) | |
| 19 | 137 logger.info("Running command: %s" % list(args)) |
| 0 | 138 try: |
| 139 silorider.main._unsafe_main(args) | |
| 140 finally: | |
| 141 silorider.main.pre_exec_hook = None | |
| 142 silorider.main.post_exec_hook = None | |
| 143 | |
| 144 silorider_logger.removeHandler(handler) | |
| 145 | |
| 19 | 146 logger.info("Cleaning %d temporary files." % len(self._cleanup)) |
| 0 | 147 for tmpname in self._cleanup: |
|
18
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
148 try: |
|
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
149 os.remove(tmpname) |
|
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
150 except FileNotFoundError: |
|
a921cc2306bc
Do our own HTML parsing/stripping of micropost contents.
Ludovic Chabant <ludovic@chabant.com>
parents:
0
diff
changeset
|
151 pass |
| 0 | 152 |
| 153 return main_ctx, main_res | |
| 154 | |
| 155 | |
| 156 @pytest.fixture | |
| 157 def feedutil(): | |
| 158 return FeedUtil() | |
| 159 | |
| 160 | |
| 161 class FeedUtil: | |
| 162 def makeFeed(self, *entries): | |
|
59
b404445082f8
Prevent unit tests from downloading fake posts
Ludovic Chabant <ludovic@chabant.com>
parents:
19
diff
changeset
|
163 feed = '<html><body class="h-feed">\n' |
| 0 | 164 for e in entries: |
| 165 feed += '<article class="h-entry">\n' | |
| 166 feed += e | |
| 167 feed += '</article>\n' | |
| 168 feed += '</body></html>' | |
| 169 return feed |
