Left: | ||
Right: |
LEFT | RIGHT |
---|---|
1 # This file is part of the Adblock Plus web scripts, | 1 # This file is part of the Adblock Plus web scripts, |
2 # Copyright (C) 2006-present eyeo GmbH | 2 # Copyright (C) 2006-present eyeo GmbH |
3 # | 3 # |
4 # Adblock Plus is free software: you can redistribute it and/or modify | 4 # Adblock Plus is free software: you can redistribute it and/or modify |
5 # it under the terms of the GNU General Public License version 3 as | 5 # it under the terms of the GNU General Public License version 3 as |
6 # published by the Free Software Foundation. | 6 # published by the Free Software Foundation. |
7 # | 7 # |
8 # Adblock Plus is distributed in the hope that it will be useful, | 8 # Adblock Plus is distributed in the hope that it will be useful, |
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
11 # GNU General Public License for more details. | 11 # GNU General Public License for more details. |
12 # | 12 # |
13 # You should have received a copy of the GNU General Public License | 13 # You should have received a copy of the GNU General Public License |
14 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 14 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
15 | 15 |
16 """Test Mercurial Trac integration hook.""" | 16 """Test Mercurial Trac integration hook.""" |
17 | 17 |
18 import mock | 18 import mock |
19 import pytest | 19 import pytest |
20 | 20 |
21 import sitescripts.hg.bin.update_issues as update_issues | 21 import sitescripts.hg.bin.update_issues as update_issues |
22 | 22 |
23 COMMIT_HASH = '000011112222' | |
23 | 24 |
24 class RepoMock(list): | 25 |
25 """Very simple mock of a Mercurial repository.""" | 26 class MercurialRepositoryMock(list): |
mathias
2019/05/14 09:32:02
If you call the class "MercurialRepositoryMock" th
Vasily Kuznetsov
2019/05/14 10:29:00
Done.
| |
26 | 27 |
27 def __init__(self, message): | 28 def __init__(self, message): |
28 change_mock = mock.MagicMock() | 29 change_mock = mock.MagicMock() |
29 change_mock.rev.return_value = 0 | 30 change_mock.rev.return_value = 0 |
30 change_mock.hex.return_value = '000011112222' | 31 change_mock.hex.return_value = COMMIT_HASH |
mathias
2019/05/14 09:32:02
This magic number string should be a constant.
Vasily Kuznetsov
2019/05/14 10:29:00
Done.
| |
31 change_mock.description.return_value = message | 32 change_mock.description.return_value = message |
32 list.__init__(self, [change_mock]) | 33 list.__init__(self, [change_mock]) |
33 | 34 |
34 def url(self): | 35 def url(self): |
35 return 'repo/mock' | 36 return 'repo/mock' |
36 | 37 |
37 | 38 |
38 @pytest.fixture | 39 @pytest.fixture |
39 def server_proxy_mock(mocker): | 40 def server_proxy_mock(mocker): |
40 return mocker.patch('xmlrpclib.ServerProxy') | 41 return mocker.patch('xmlrpclib.ServerProxy') |
41 | 42 |
42 | 43 |
43 @pytest.fixture | 44 @pytest.fixture |
44 def ui_mock(): | 45 def ui_mock(): |
45 return mock.MagicMock() | 46 return mock.MagicMock() |
46 | 47 |
47 | 48 |
48 @pytest.mark.parametrize('message', [ | 49 @pytest.mark.parametrize('message', [ |
49 '', 'Issue #1337', 'Tissue 1337', 'Issue 13b', | 50 '', 'Issue #1337', 'Tissue 1337', 'Issue 13b', |
50 ]) | 51 ]) |
51 def test_invalid_message_format(message, ui_mock, server_proxy_mock): | 52 def test_invalid_message_format(message, ui_mock, server_proxy_mock): |
52 """Check that commits with invalid messages are ignored with a warning.""" | 53 """Check that commits with invalid messages are ignored with a warning.""" |
53 repo_mock = RepoMock(message) | 54 repo_mock = MercurialRepositoryMock(message) |
54 update_issues.hook(ui_mock, repo_mock, 0) | 55 update_issues.hook(ui_mock, repo_mock, 0) |
55 ui_mock.warn.assert_called_once() | 56 ui_mock.warn.assert_called_once() |
56 assert not server_proxy_mock.called | 57 assert not server_proxy_mock.called |
57 | 58 |
58 | 59 |
59 @pytest.mark.parametrize('message', ['Noissue - foobar', 'noissue']) | 60 @pytest.mark.parametrize('message', ['Noissue - foobar', 'noissue']) |
60 def test_noissue(message, ui_mock, server_proxy_mock): | 61 def test_noissue(message, ui_mock, server_proxy_mock): |
61 """Check that noissue commits are ignored without warning.""" | 62 """Check that noissue commits are ignored without warning.""" |
62 repo_mock = RepoMock(message) | 63 repo_mock = MercurialRepositoryMock(message) |
63 update_issues.hook(ui_mock, repo_mock, 0) | 64 update_issues.hook(ui_mock, repo_mock, 0) |
64 assert not ui_mock.warn.called | 65 assert not ui_mock.warn.called |
65 assert not server_proxy_mock.called | 66 assert not server_proxy_mock.called |
66 | 67 |
67 | 68 |
68 @pytest.mark.parametrize('message', ['Issue 1337 - foo', 'issue 1337 - foo']) | 69 @pytest.mark.parametrize('message', ['Issue 1337 - foo', 'issue 1337 - foo']) |
69 def test_single_issue(message, ui_mock, server_proxy_mock): | 70 def test_single_issue(message, ui_mock, server_proxy_mock): |
70 """Check that a commit referencing a single issue gets linked.""" | 71 """Check that a commit referencing a single issue gets linked.""" |
71 server_proxy = server_proxy_mock.return_value | 72 server_proxy = server_proxy_mock.return_value |
72 repo_mock = RepoMock(message) | 73 repo_mock = MercurialRepositoryMock(message) |
73 update_issues.hook(ui_mock, repo_mock, 0) | 74 update_issues.hook(ui_mock, repo_mock, 0) |
74 assert not ui_mock.warn.called | 75 assert not ui_mock.warn.called |
75 server_proxy.ticket.update.assert_called_once() | 76 server_proxy.ticket.update.assert_called_once() |
76 call = server_proxy.ticket.update.call_args | 77 call = server_proxy.ticket.update.call_args |
77 assert call[0][0] == 1337 | 78 assert call[0][0] == 1337 |
78 comment = call[0][1] | 79 comment = call[0][1] |
79 assert comment.startswith('A commit referencing this issue has landed') | 80 assert comment.startswith('A commit referencing this issue has landed') |
80 assert '000011112222' in comment | 81 assert COMMIT_HASH in comment |
mathias
2019/05/14 09:32:02
This magic number string should be a constant.
Vasily Kuznetsov
2019/05/14 10:29:00
Done.
| |
81 assert comment.endswith('- foo]') | 82 assert comment.endswith('- foo]') |
82 | 83 |
83 | 84 |
84 def test_multiple_issues(ui_mock, server_proxy_mock): | 85 def test_multiple_issues(ui_mock, server_proxy_mock): |
85 """Check that a commit referencing two issues gets linked twice.""" | 86 """Check that a commit referencing two issues gets linked twice.""" |
86 server_proxy = server_proxy_mock.return_value | 87 server_proxy = server_proxy_mock.return_value |
87 repo_mock = RepoMock('Issue 1337, issue 2448') | 88 repo_mock = MercurialRepositoryMock('Issue 1337, issue 2448') |
88 update_issues.hook(ui_mock, repo_mock, 0) | 89 update_issues.hook(ui_mock, repo_mock, 0) |
89 assert not ui_mock.warn.called | 90 assert not ui_mock.warn.called |
90 calls = server_proxy.ticket.update.call_args_list | 91 calls = server_proxy.ticket.update.call_args_list |
91 assert len(calls) == 2 | 92 assert len(calls) == 2 |
92 assert calls[0][0][0] == 1337 | 93 assert calls[0][0][0] == 1337 |
93 assert calls[1][0][0] == 2448 | 94 assert calls[1][0][0] == 2448 |
LEFT | RIGHT |