Mercurial > kallithea
annotate conftest.py @ 8455:d727e81e0097 stable
vcs: fix cloning remote repository with HTTP authentication (Issue #379)
Using a remote clone URI of
http://user:pass@host/...
triggered an exception:
...
E File ".../kallithea/lib/utils.py", line 256, in is_valid_repo_uri
E GitRepository._check_url(url)
E File ".../kallithea/lib/vcs/backends/git/repository.py", line 183, in _check_url
E passmgr.add_password(*authinfo)
E File "/usr/lib/python3.7/urllib/request.py", line 848, in add_password
E self.reduce_uri(u, default_port) for u in uri)
E File "/usr/lib/python3.7/urllib/request.py", line 848, in <genexpr>
E self.reduce_uri(u, default_port) for u in uri)
E File "/usr/lib/python3.7/urllib/request.py", line 875, in reduce_uri
E host, port = splitport(authority)
E File "/usr/lib/python3.7/urllib/parse.py", line 1022, in splitport
E match = _portprog.fullmatch(host)
E TypeError: cannot use a string pattern on a bytes-like object
The authinfo tuple is obtained via mercurial.util.url, which unfortunately
returns a tuple of bytes whereas urllib expects strings.
It seems that mercurial internally has some more hacking around urllib as
urllibcompat.py, which we don't use.
Therefore, transform the bytes into strings before passing authinfo to
urllib. As the realm can be None, we need to check it specifically otherwise
safe_str would return a string 'None'.
A basic test that catches the mentioned problem is added, even though it
does not actually test that cloning with auth info will actually work (it
only tests that it fails cleanly if the URI is not reachable).
Additionally, one use of 'test_uri' in hg/repository.py still needed to be
transformed from bytes to string. For git this was already ok.
author | Thomas De Schampheleire <thomas.de_schampheleire@nokia.com> |
---|---|
date | Wed, 22 Jul 2020 21:55:57 +0200 |
parents | 9948ed9916c4 |
children |
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') |