Mercurial > silorider
annotate tests/conftest.py @ 60:b7da3d97ea99
Add profile URL handlers
Silos register these handlers so that everybody knows if a hyperlink is
a mention to another user on a particular social network. If any handler
matches, silos not related to that social media will skip that link.
It's possible than in rare cases we want that link everywhere, but so
far I haven't needed it, compared to all the times I didn't want these
links.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sat, 28 Oct 2023 11:57:04 -0700 |
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 |