Skip to content

Commit c65bc6b

Browse files
authored
Merge pull request #26 from ybilopolov/master
fix assertion in tests, add new test for blockon usage in fixture
2 parents 9fdc472 + 842ad41 commit c65bc6b

File tree

2 files changed

+79
-58
lines changed

2 files changed

+79
-58
lines changed

pytest_twisted.py

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ def in_reactor(d, f, *args):
120120

121121

122122
@pytest.fixture(scope="session", autouse=True)
123-
def twisted_greenlet(request, reactor):
123+
def twisted_greenlet(request):
124124
request.addfinalizer(stop_twisted_greenlet)
125125
return _instances.gr_twisted
126126

@@ -144,7 +144,7 @@ def init_default_reactor():
144144
)
145145

146146

147-
def init_qt5_reactor(qapp):
147+
def init_qt5_reactor():
148148
import qt5reactor
149149

150150
_install_reactor(
@@ -153,18 +153,12 @@ def init_qt5_reactor(qapp):
153153
)
154154

155155

156-
_reactor_fixtures = {
156+
_reactor_installers = {
157157
'default': init_default_reactor,
158158
'qt5reactor': init_qt5_reactor,
159159
}
160160

161161

162-
def _init_reactor():
163-
import twisted.internet.reactor
164-
_instances.reactor = twisted.internet.reactor
165-
init_twisted_greenlet()
166-
167-
168162
def _install_reactor(reactor_installer, reactor_type):
169163
try:
170164
reactor_installer()
@@ -177,24 +171,19 @@ def _install_reactor(reactor_installer, reactor_type):
177171
type(twisted.internet.reactor),
178172
)
179173
)
180-
_init_reactor()
174+
import twisted.internet.reactor
175+
_instances.reactor = twisted.internet.reactor
176+
init_twisted_greenlet()
181177

182178

183179
def pytest_addoption(parser):
184180
group = parser.getgroup('twisted')
185181
group.addoption(
186182
'--reactor',
187183
default='default',
188-
choices=tuple(_reactor_fixtures.keys()),
184+
choices=tuple(_reactor_installers.keys()),
189185
)
190186

191187

192188
def pytest_configure(config):
193-
reactor_fixture = _reactor_fixtures[config.getoption('reactor')]
194-
195-
class ReactorPlugin(object):
196-
reactor = staticmethod(
197-
pytest.fixture(scope='session', autouse=True)(reactor_fixture)
198-
)
199-
200-
config.pluginmanager.register(ReactorPlugin())
189+
_reactor_installers[config.getoption('reactor')]()

testing/test_basic.py

Lines changed: 71 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ def assert_outcomes(run_result, outcomes):
1010
formatted_output = format_run_result_output_for_assert(run_result)
1111

1212
try:
13-
outcomes = run_result.parseoutcomes()
13+
result_outcomes = run_result.parseoutcomes()
1414
except ValueError:
1515
assert False, formatted_output
1616

1717
for name, value in outcomes.items():
18-
assert outcomes.get(name) == value, formatted_output
18+
assert result_outcomes.get(name) == value, formatted_output
1919

2020

2121
def format_run_result_output_for_assert(run_result):
@@ -42,7 +42,12 @@ def skip_if_reactor_not(expected_reactor):
4242
)
4343

4444

45-
def test_fail_later(testdir):
45+
@pytest.fixture
46+
def cmd_opts(request):
47+
return '--reactor={}'.format(request.config.getoption('reactor')),
48+
49+
50+
def test_fail_later(testdir, cmd_opts):
4651
testdir.makepyfile("""
4752
from twisted.internet import reactor, defer
4853
@@ -57,11 +62,11 @@ def doit():
5762
reactor.callLater(0.01, doit)
5863
return d
5964
""")
60-
rr = testdir.run(sys.executable, "-m", "pytest")
65+
rr = testdir.run(sys.executable, "-m", "pytest", *cmd_opts)
6166
assert_outcomes(rr, {'failed': 1})
6267

6368

64-
def test_succeed_later(testdir):
69+
def test_succeed_later(testdir, cmd_opts):
6570
testdir.makepyfile("""
6671
from twisted.internet import reactor, defer
6772
@@ -70,31 +75,31 @@ def test_succeed():
7075
reactor.callLater(0.01, d.callback, 1)
7176
return d
7277
""")
73-
rr = testdir.run(sys.executable, "-m", "pytest")
78+
rr = testdir.run(sys.executable, "-m", "pytest", *cmd_opts)
7479
assert_outcomes(rr, {'passed': 1})
7580

7681

77-
def test_non_deferred(testdir):
82+
def test_non_deferred(testdir, cmd_opts):
7883
testdir.makepyfile("""
7984
from twisted.internet import reactor, defer
8085
8186
def test_succeed():
8287
return 42
8388
""")
84-
rr = testdir.run(sys.executable, "-m", "pytest")
89+
rr = testdir.run(sys.executable, "-m", "pytest", *cmd_opts)
8590
assert_outcomes(rr, {'passed': 1})
8691

8792

88-
def test_exception(testdir):
93+
def test_exception(testdir, cmd_opts):
8994
testdir.makepyfile("""
9095
def test_more_fail():
9196
raise RuntimeError("foo")
9297
""")
93-
rr = testdir.run(sys.executable, "-m", "pytest")
98+
rr = testdir.run(sys.executable, "-m", "pytest", *cmd_opts)
9499
assert_outcomes(rr, {'failed': 1})
95100

96101

97-
def test_inlineCallbacks(testdir):
102+
def test_inlineCallbacks(testdir, cmd_opts):
98103
testdir.makepyfile("""
99104
from twisted.internet import reactor, defer
100105
import pytest
@@ -112,11 +117,11 @@ def test_succeed(foo):
112117
if foo == "web":
113118
raise RuntimeError("baz")
114119
""")
115-
rr = testdir.run(sys.executable, "-m", "pytest", "-v")
120+
rr = testdir.run(sys.executable, "-m", "pytest", "-v", *cmd_opts)
116121
assert_outcomes(rr, {'passed': 2, 'failed': 1})
117122

118123

119-
def test_twisted_greenlet(testdir):
124+
def test_twisted_greenlet(testdir, cmd_opts):
120125
testdir.makepyfile("""
121126
import pytest, greenlet
122127
@@ -134,23 +139,50 @@ def test_MAIN():
134139
assert MAIN is greenlet.getcurrent()
135140
136141
""")
137-
rr = testdir.run(sys.executable, "-m", "pytest", "-v")
142+
rr = testdir.run(sys.executable, "-m", "pytest", "-v", *cmd_opts)
138143
assert_outcomes(rr, {'passed': 1})
139144

140145

146+
def test_blockon_in_fixture(testdir, cmd_opts):
147+
testdir.makepyfile("""
148+
from twisted.internet import reactor, defer
149+
import pytest
150+
import pytest_twisted
151+
152+
@pytest.fixture(scope="module",
153+
params=["fs", "imap", "web"])
154+
def foo(request):
155+
d1, d2 = defer.Deferred(), defer.Deferred()
156+
reactor.callLater(0.01, d1.callback, 1)
157+
reactor.callLater(0.02, d2.callback, request.param)
158+
pytest_twisted.blockon(d1)
159+
return d2
160+
161+
162+
@pytest_twisted.inlineCallbacks
163+
def test_succeed(foo):
164+
x = yield foo
165+
if x == "web":
166+
raise RuntimeError("baz")
167+
""")
168+
rr = testdir.run(sys.executable, "-m", "pytest", "-v", *cmd_opts)
169+
# assert not rr
170+
assert_outcomes(rr, {'passed': 2, 'failed': 1})
171+
172+
141173
@skip_if_reactor_not('default')
142-
def test_blockon_in_hook(testdir):
174+
def test_blockon_in_hook(testdir, cmd_opts):
143175
testdir.makeconftest("""
144176
import pytest_twisted as pt
145177
from twisted.internet import reactor, defer
146178
147179
def pytest_configure(config):
148180
pt.init_default_reactor()
149-
d, d2 = defer.Deferred(), defer.Deferred()
150-
reactor.callLater(0.01, d.callback, 1)
181+
d1, d2 = defer.Deferred(), defer.Deferred()
182+
reactor.callLater(0.01, d1.callback, 1)
151183
reactor.callLater(0.02, d2.callback, 1)
152-
pt.blockon(d)
153-
pt.blockon(d)
184+
pt.blockon(d1)
185+
pt.blockon(d2)
154186
""")
155187
testdir.makepyfile("""
156188
from twisted.internet import reactor, defer
@@ -160,36 +192,35 @@ def test_succeed():
160192
reactor.callLater(0.01, d.callback, 1)
161193
return d
162194
""")
163-
rr = testdir.run(sys.executable, "-m", "pytest", "-v")
195+
rr = testdir.run(sys.executable, "-m", "pytest", "-v", *cmd_opts)
164196
assert_outcomes(rr, {'passed': 1})
165197

166198

167199
@skip_if_reactor_not('default')
168-
def test_wrong_reactor(testdir):
169-
testdir.makepyfile("""
200+
def test_wrong_reactor(testdir, cmd_opts):
201+
testdir.makeconftest("""
202+
def pytest_addhooks():
170203
import twisted.internet.reactor
171204
twisted.internet.reactor = None
172-
205+
""")
206+
testdir.makepyfile("""
173207
def test_succeed():
174208
pass
175209
""")
176-
rr = testdir.run(sys.executable, "-m", "pytest", "-v")
177-
assert 'WrongReactorAlreadyInstalledError' in rr.stdout.str()
178-
assert_outcomes(rr, {'error': 1})
210+
rr = testdir.run(sys.executable, "-m", "pytest", "-v", *cmd_opts)
211+
assert 'WrongReactorAlreadyInstalledError' in rr.stderr.str()
179212

180213

181214
@skip_if_reactor_not('qt5reactor')
182-
def test_blockon_in_hook_with_qt5reactor(testdir):
215+
def test_blockon_in_hook_with_qt5reactor(testdir, cmd_opts):
183216
testdir.makeconftest("""
184217
import pytest_twisted as pt
185218
import pytestqt
186219
from twisted.internet import defer
187220
188221
189222
def pytest_configure(config):
190-
qapp = pytestqt.plugin.qapp(pytestqt.plugin.qapp_args())
191-
192-
pt.init_qt5_reactor(qapp)
223+
pt.init_qt5_reactor()
193224
d = defer.Deferred()
194225
195226
from twisted.internet import reactor
@@ -204,26 +235,27 @@ def test_succeed():
204235
reactor.callLater(0.01, d.callback, 1)
205236
return d
206237
""")
207-
rr = testdir.run(sys.executable, "-m", "pytest", "-v")
238+
rr = testdir.run(sys.executable, "-m", "pytest", "-v", *cmd_opts)
208239
assert_outcomes(rr, {'passed': 1})
209240

210241

211242
@skip_if_reactor_not('qt5reactor')
212-
def test_wrong_reactor_with_qt5reactor(testdir):
213-
testdir.makepyfile("""
243+
def test_wrong_reactor_with_qt5reactor(testdir, cmd_opts):
244+
testdir.makeconftest("""
245+
def pytest_addhooks():
214246
import twisted.internet.default
215247
twisted.internet.default.install()
216-
248+
""")
249+
testdir.makepyfile("""
217250
def test_succeed():
218251
pass
219252
""")
220-
rr = testdir.run(
221-
sys.executable, "-m", "pytest", "-v", "--reactor=qt5reactor"
222-
)
223-
assert 'WrongReactorAlreadyInstalledError' in rr.stdout.str()
224-
assert_outcomes(rr, {'error': 1})
253+
rr = testdir.run(sys.executable, "-m", "pytest", "-v", *cmd_opts)
254+
assert 'WrongReactorAlreadyInstalledError' in rr.stderr.str()
255+
# assert_outcomes(rr, {'error': 1})
225256

226257

258+
@skip_if_reactor_not('default')
227259
def test_pytest_from_reactor_thread(testdir):
228260
testdir.makepyfile("""
229261
import pytest

0 commit comments

Comments
 (0)