test #7274
(self, fetch_method)
| 5376 | |
| 5377 | @testing.combinations("fetchmany", "fetchone", "fetchall") |
| 5378 | def test_cursor_is_closed_on_exhausted(self, fetch_method): |
| 5379 | """test #7274""" |
| 5380 | self._eagerload_mappings() |
| 5381 | |
| 5382 | User = self.classes.User |
| 5383 | |
| 5384 | sess = fixture_session() |
| 5385 | |
| 5386 | stmt = select(User).execution_options(yield_per=15) |
| 5387 | result = sess.execute(stmt) |
| 5388 | |
| 5389 | with mock.patch.object(result.raw, "_soft_close") as mock_close: |
| 5390 | # call assertions are implementation specific. |
| 5391 | # test needs that _soft_close called at least once and without |
| 5392 | # the hard=True flag |
| 5393 | if fetch_method == "fetchmany": |
| 5394 | while True: |
| 5395 | buf = result.fetchmany(2) |
| 5396 | if not buf: |
| 5397 | break |
| 5398 | eq_(mock_close.mock_calls, [mock.call()]) |
| 5399 | elif fetch_method == "fetchall": |
| 5400 | eq_(len(result.all()), 4) |
| 5401 | eq_( |
| 5402 | mock_close.mock_calls, [mock.call(), mock.call(hard=False)] |
| 5403 | ) |
| 5404 | elif fetch_method == "fetchone": |
| 5405 | while True: |
| 5406 | row = result.fetchone() |
| 5407 | if row is None: |
| 5408 | break |
| 5409 | eq_( |
| 5410 | mock_close.mock_calls, [mock.call(), mock.call(hard=False)] |
| 5411 | ) |
| 5412 | else: |
| 5413 | assert False |
| 5414 | |
| 5415 | # soft closed, we can still get an empty result |
| 5416 | eq_(result.all(), []) |
| 5417 | |
| 5418 | # real closed |
| 5419 | result.close() |
| 5420 | assert_raises(sa.exc.ResourceClosedError, result.all) |
| 5421 | |
| 5422 | def test_yield_per_close_on_interrupted_iteration_legacy(self): |
| 5423 | """test #8710""" |
nothing calls this directly
no test coverage detected