Mercurial > silorider
annotate tests/conftest.py @ 77:5381655e7f6d
Bluesky silo now tries to create link card embeds
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Wed, 28 Aug 2024 08:40:52 -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 |