annotate conftest.py @ 8925:ee1da602b590 stable

repo_groups: fix deletion of subgroups Deletion of a repository group that has a parent group (i.e. is not at the root of the repository group tree) failed as follows: Traceback (most recent call last): [...] File ".../lib/python3.9/site-packages/tg/configurator/components/dispatch.py", line 114, in _call_controller return controller(*remainder, **params) File "<decorator-gen-5>", line 2, in delete File "/home/tdescham/repo/contrib/kallithea/kallithea-release/kallithea/lib/auth.py", line 572, in __wrapper return func(*fargs, **fkwargs) File "/home/tdescham/repo/contrib/kallithea/kallithea-release/kallithea/controllers/admin/repo_groups.py", line 271, in delete if gr.parent_group: File ".../lib/python3.9/site-packages/sqlalchemy/orm/attributes.py", line 294, in __get__ return self.impl.get(instance_state(instance), dict_) File ".../lib/python3.9/site-packages/sqlalchemy/orm/attributes.py", line 730, in get value = self.callable_(state, passive) File ".../lib/python3.9/site-packages/sqlalchemy/orm/strategies.py", line 717, in _load_for_state raise orm_exc.DetachedInstanceError( sqlalchemy.orm.exc.DetachedInstanceError: Parent instance <RepoGroup at 0x7f1f2664f4c0> is not bound to a Session; lazy load operation of attribute 'parent_group' cannot proceed (Background on this error at: http://sqlalche.me/e/13/bhk3) In the reference 'gr.parent_group', 'gr' is an SQLAlchemy object referring to the group being deleted, and 'gr.parent_group' is a lazy reference to its parent group. The 'lazy' means that the parent group object is not loaded automatically when 'gr' is assigned, but instead will be loaded on-the-fly when the parent group is actually accessed. See [1] and [2] for more information. The problem was that the lazy 'parent_group' attribute was accessed _after_ deleting the database object it was part of. Fix this by obtaining a handle to the parent group _before_ deleting the subgroup. Reported-by: André Klitzing (via mailing list) [1] https://docs.sqlalchemy.org/en/13/errors.html#error-bhk3 [2] https://docs.sqlalchemy.org/en/13/orm/loading_relationships.html
author Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
date Wed, 01 Sep 2021 22:08:45 +0200
parents 9948ed9916c4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7811
0a277465fddf scripts: initial run of import cleanup using isort
Mads Kiilerich <mads@kiilerich.com>
parents: 7752
diff changeset
1 import os
0a277465fddf scripts: initial run of import cleanup using isort
Mads Kiilerich <mads@kiilerich.com>
parents: 7752
diff changeset
2
7734
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
3 import mock
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
4 import pytest
8208
9948ed9916c4 py3: work around incompatibility between pytest, py3 inspect, and tg
Mads Kiilerich <mads@kiilerich.com>
parents: 8157
diff changeset
5 import tg
7811
0a277465fddf scripts: initial run of import cleanup using isort
Mads Kiilerich <mads@kiilerich.com>
parents: 7752
diff changeset
6
7734
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
7
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
8 here = os.path.dirname(__file__)
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
9
8208
9948ed9916c4 py3: work around incompatibility between pytest, py3 inspect, and tg
Mads Kiilerich <mads@kiilerich.com>
parents: 8157
diff changeset
10 # HACK:
9948ed9916c4 py3: work around incompatibility between pytest, py3 inspect, and tg
Mads Kiilerich <mads@kiilerich.com>
parents: 8157
diff changeset
11 def pytest_configure():
9948ed9916c4 py3: work around incompatibility between pytest, py3 inspect, and tg
Mads Kiilerich <mads@kiilerich.com>
parents: 8157
diff changeset
12 # Register global dummy tg.context to avoid "TypeError: No object (name: context) has been registered for this thread"
9948ed9916c4 py3: work around incompatibility between pytest, py3 inspect, and tg
Mads Kiilerich <mads@kiilerich.com>
parents: 8157
diff changeset
13 tg.request_local.context._push_object(tg.util.bunch.Bunch())
9948ed9916c4 py3: work around incompatibility between pytest, py3 inspect, and tg
Mads Kiilerich <mads@kiilerich.com>
parents: 8157
diff changeset
14 # could be removed again after use with
9948ed9916c4 py3: work around incompatibility between pytest, py3 inspect, and tg
Mads Kiilerich <mads@kiilerich.com>
parents: 8157
diff changeset
15 # tg.request_local.context._pop_object ... but we keep it around forever as
9948ed9916c4 py3: work around incompatibility between pytest, py3 inspect, and tg
Mads Kiilerich <mads@kiilerich.com>
parents: 8157
diff changeset
16 # a reasonable sentinel
9948ed9916c4 py3: work around incompatibility between pytest, py3 inspect, and tg
Mads Kiilerich <mads@kiilerich.com>
parents: 8157
diff changeset
17
7734
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
18 def pytest_ignore_collect(path):
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
19 # ignore all files outside the 'kallithea' directory
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
20 if not str(path).startswith(os.path.join(here, 'kallithea')):
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
21 return True
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
22
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
23 # during doctest verification, normally all python files will be imported.
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
24 # Thus, files that cannot be imported normally should be ignored.
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
25 # Files that generate ImportErrors are ignored via
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
26 # '--doctest-ignore-import-errors' (pytest.ini)
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
27 kallithea_ignore_paths = (
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
28 # AttributeError: 'module' object has no attribute 'config'
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
29 '/kallithea/alembic/env.py',
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
30 # collection of the following file messes up the rest of test execution
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
31 '/kallithea/tests/scripts/manual_test_concurrency.py',
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
32 )
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
33 if str(path).endswith(kallithea_ignore_paths):
afa5e0bdb76f tests: run doctests via pytest
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents:
diff changeset
34 return True
7752
3929ff3f21c6 tests: introduce doctest_mock_ugettext to allow doctests of localized code
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7734
diff changeset
35
3929ff3f21c6 tests: introduce doctest_mock_ugettext to allow doctests of localized code
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7734
diff changeset
36 @pytest.fixture()
3929ff3f21c6 tests: introduce doctest_mock_ugettext to allow doctests of localized code
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7734
diff changeset
37 def doctest_mock_ugettext(request):
3929ff3f21c6 tests: introduce doctest_mock_ugettext to allow doctests of localized code
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7734
diff changeset
38 """Mock ugettext ('_') in the module using this fixture.
3929ff3f21c6 tests: introduce doctest_mock_ugettext to allow doctests of localized code
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7734
diff changeset
39
3929ff3f21c6 tests: introduce doctest_mock_ugettext to allow doctests of localized code
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7734
diff changeset
40 Intended to be used for doctests.
3929ff3f21c6 tests: introduce doctest_mock_ugettext to allow doctests of localized code
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7734
diff changeset
41
3929ff3f21c6 tests: introduce doctest_mock_ugettext to allow doctests of localized code
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7734
diff changeset
42 In a doctest, enable this fixture using:
3929ff3f21c6 tests: introduce doctest_mock_ugettext to allow doctests of localized code
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7734
diff changeset
43 >>> getfixture('doctest_mock_ugettext')
3929ff3f21c6 tests: introduce doctest_mock_ugettext to allow doctests of localized code
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7734
diff changeset
44 """
3929ff3f21c6 tests: introduce doctest_mock_ugettext to allow doctests of localized code
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7734
diff changeset
45 m = __import__(request.module.__name__, globals(), locals(), [None], 0)
3929ff3f21c6 tests: introduce doctest_mock_ugettext to allow doctests of localized code
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7734
diff changeset
46 with mock.patch.object(m, '_', lambda s: s):
3929ff3f21c6 tests: introduce doctest_mock_ugettext to allow doctests of localized code
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7734
diff changeset
47 yield
8157
56de50d57ff0 pytest: fix register_assert_rewrite call
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7812
diff changeset
48
56de50d57ff0 pytest: fix register_assert_rewrite call
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7812
diff changeset
49 if getattr(pytest, 'register_assert_rewrite', None):
56de50d57ff0 pytest: fix register_assert_rewrite call
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7812
diff changeset
50 # make sure that all asserts under kallithea/tests benefit from advanced
56de50d57ff0 pytest: fix register_assert_rewrite call
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7812
diff changeset
51 # assert reporting with pytest-3.0.0+, including api/api_base.py,
56de50d57ff0 pytest: fix register_assert_rewrite call
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7812
diff changeset
52 # models/common.py etc.
56de50d57ff0 pytest: fix register_assert_rewrite call
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7812
diff changeset
53 # See also: https://docs.pytest.org/en/latest/assert.html#advanced-assertion-introspection
56de50d57ff0 pytest: fix register_assert_rewrite call
Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
parents: 7812
diff changeset
54 pytest.register_assert_rewrite('kallithea.tests')