Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: tests/test_rpy.py

Issue 30047570: Issue 7467 - Migrate rpy to Python 3 (Closed) Base URL: https://hg.adblockplus.org/python-abp
Patch Set: Created April 18, 2019, 12:15 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « abp/filters/rpy.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # This file is part of Adblock Plus <https://adblockplus.org/>, 1 # This file is part of Adblock Plus <https://adblockplus.org/>,
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 """Functional tests for testing rPython integration.""" 16 """Functional tests for testing rPython integration."""
17 from __future__ import unicode_literals
18 17
19 from collections import namedtuple 18 from collections import namedtuple
20 import pytest 19 import pytest
21 import sys
22 20
23 from abp.filters.rpy import tuple2dict, line2dict, lines2dicts 21 from abp.filters.rpy import tuple2dict, line2dict, lines2dicts
24 22
25 23
26 _SAMPLE_TUPLE = namedtuple('tuple', 'foo,bar') 24 _SAMPLE_TUPLE = namedtuple('tuple', 'foo,bar')
27 25
28 _TEST_EXAMPLES = { 26 _TEST_EXAMPLES = {
29 'header': { 27 'header': {
30 'in': b'[Adblock Plus 2.0]', 28 'in': '[Adblock Plus 2.0]',
31 'out': { 29 'out': {
32 b'type': b'Header', 30 'type': 'Header',
33 b'version': b'Adblock Plus 2.0', 31 'version': 'Adblock Plus 2.0',
34 }, 32 },
35 }, 33 },
36 'metadata': { 34 'metadata': {
37 'in': b'! Title: Example list', 35 'in': '! Title: Example list',
38 'out': { 36 'out': {
39 b'type': b'Metadata', 37 'type': 'Metadata',
40 b'key': b'Title', 38 'key': 'Title',
41 b'value': b'Example list', 39 'value': 'Example list',
42 }, 40 },
43 }, 41 },
44 'comment': { 42 'comment': {
45 'in': b'! Comment', 43 'in': '! Comment',
46 'out': { 44 'out': {
47 b'type': b'Comment', 45 'type': 'Comment',
48 b'text': b'Comment', 46 'text': 'Comment',
49 }, 47 },
50 }, 48 },
51 'empty': { 49 'empty': {
52 'in': b'', 50 'in': '',
53 'out': { 51 'out': {
54 b'type': b'EmptyLine', 52 'type': 'EmptyLine',
55 }, 53 },
56 }, 54 },
57 'include': { 55 'include': {
58 'in': b'%include www.test.py/filtelist.txt%', 56 'in': '%include www.test.py/filtelist.txt%',
59 'out': { 57 'out': {
60 b'type': b'Include', 58 'type': 'Include',
61 b'target': b'www.test.py/filtelist.txt', 59 'target': 'www.test.py/filtelist.txt',
62 }, 60 },
63 }, 61 },
64 'filter_single': { 62 'filter_single': {
65 'in': b'foo.com##div#ad1', 63 'in': 'foo.com##div#ad1',
66 'out': { 64 'out': {
67 b'type': b'Filter', 65 'type': 'Filter',
68 b'text': b'foo.com##div#ad1', 66 'text': 'foo.com##div#ad1',
69 b'selector': {b'type': b'css', b'value': b'div#ad1'}, 67 'selector': {'type': 'css', 'value': 'div#ad1'},
70 b'action': b'hide', 68 'action': 'hide',
71 b'options': {b'domain': {b'foo.com': True}}, 69 'options': {'domain': {'foo.com': True}},
72 }, 70 },
73 }, 71 },
74 'filter_with_%': { 72 'filter_with_%': {
75 'in': b'%22banner%*%22idzone%', 73 'in': '%22banner%*%22idzone%',
76 'out': { 74 'out': {
77 b'type': b'Filter', 75 'type': 'Filter',
78 b'text': b'%22banner%*%22idzone%', 76 'text': '%22banner%*%22idzone%',
79 b'selector': {b'type': b'url-pattern', 77 'selector': {'type': 'url-pattern',
80 b'value': b'%22banner%*%22idzone%'}, 78 'value': '%22banner%*%22idzone%'},
81 b'action': b'block', 79 'action': 'block',
82 b'options': {}, 80 'options': {},
83 }, 81 },
84 }, 82 },
85 'filter_multiple': { 83 'filter_multiple': {
86 'in': b'foo.com,bar.com##div#ad1', 84 'in': 'foo.com,bar.com##div#ad1',
87 'out': { 85 'out': {
88 b'type': b'Filter', 86 'type': 'Filter',
89 b'text': b'foo.com,bar.com##div#ad1', 87 'text': 'foo.com,bar.com##div#ad1',
90 b'selector': {b'type': b'css', b'value': b'div#ad1'}, 88 'selector': {'type': 'css', 'value': 'div#ad1'},
91 b'action': b'hide', 89 'action': 'hide',
92 b'options': {b'domain': {b'foo.com': True, b'bar.com': True}}, 90 'options': {'domain': {'foo.com': True, 'bar.com': True}},
93 }, 91 },
94 }, 92 },
95 'filter_with_sitekey_list': { 93 'filter_with_sitekey_list': {
96 'in': b'@@bla$ping,domain=foo.com|~bar.foo.com,sitekey=foo|bar', 94 'in': '@@bla$ping,domain=foo.com|~bar.foo.com,sitekey=foo|bar',
97 'out': { 95 'out': {
98 b'text': 96 'text':
99 b'@@bla$ping,domain=foo.com|~bar.foo.com,sitekey=foo|bar', 97 '@@bla$ping,domain=foo.com|~bar.foo.com,sitekey=foo|bar',
100 b'selector': {b'value': b'bla', b'type': b'url-pattern'}, 98 'selector': {'value': 'bla', 'type': 'url-pattern'},
101 b'action': b'allow', 99 'action': 'allow',
102 b'options': { 100 'options': {
103 b'ping': True, 101 'ping': True,
104 b'domain': {b'foo.com': True, 102 'domain': {'foo.com': True,
105 b'bar.foo.com': False}, 103 'bar.foo.com': False},
106 b'sitekey': [b'foo', b'bar']}, 104 'sitekey': ['foo', 'bar']},
107 b'type': b'Filter', 105 'type': 'Filter',
108 }, 106 },
109 }, 107 },
110 } 108 }
111 109
112 110
113 def check_data_utf8(data):
114 """Check if all the strings in a dict are encoded as unicode.
115
116 Parameters
117 ----------
118 data: dict
119 The dictionary to be checked
120
121 Raises
122 -------
123 AssertionError
124 If any of the strings encountered are not unicode
125
126 """
127 if isinstance(data, dict):
128 for key, value in data.items():
129 check_data_utf8(key)
130 check_data_utf8(value)
131 elif isinstance(data, (list, tuple)):
132 for item in data:
133 check_data_utf8(item)
134 elif isinstance(data, type('')):
135 raise AssertionError('{} is str. Expected bytes.'.format(data))
136
137
138 @pytest.mark.parametrize('foo,bar', [ 111 @pytest.mark.parametrize('foo,bar', [
139 ('test_foo', 1), 112 ('test_foo', 1),
140 ({'foofoo': 'test', 'foobar': 2}, [1, 2, 3]), 113 ({'foofoo': 'test', 'foobar': 2}, [1, 2, 3]),
141 ((1,), [('a', True), ('b', False)]), 114 ((1,), [('a', True), ('b', False)]),
142 ]) 115 ])
143 def test_tuple2dict(foo, bar): 116 def test_tuple2dict(foo, bar):
144 """Test that dicts are produced correctly from a named tuple.""" 117 """Test that dicts are produced correctly from a named tuple."""
145 data = _SAMPLE_TUPLE(foo=foo, bar=bar) 118 data = _SAMPLE_TUPLE(foo=foo, bar=bar)
146 exp = {'foo': foo, 'bar': bar, 'type': 'tuple'} 119 exp = {'foo': foo, 'bar': bar, 'type': 'tuple'}
147 120
148 result = tuple2dict(data) 121 result = tuple2dict(data)
149 122
150 assert exp == result 123 assert exp == result
151 124
152 125
153 @pytest.mark.skipif(sys.version.startswith('3.'), reason='Redundant on py3+.')
154 @pytest.mark.parametrize('line_type', _TEST_EXAMPLES.keys())
155 def test_line2dict_encoding(line_type):
156 """Test that the resulting object has all strings encoded as utf-8.
157
158 These tests will only be run on Python2.*. On Python3.*, these test
159 cases are covered by test_line2dict() below.
160 """
161 data = line2dict(_TEST_EXAMPLES[line_type]['in'])
162 check_data_utf8(data)
163
164
165 @pytest.mark.parametrize('line_type', list(_TEST_EXAMPLES.keys())) 126 @pytest.mark.parametrize('line_type', list(_TEST_EXAMPLES.keys()))
166 def test_line2dict_format(line_type): 127 def test_line2dict_format(line_type):
167 """Test that the API result has the appropriate format. 128 """Test that the API result has the appropriate format.
168 129
169 Checks for both keys and datatypes. 130 Checks for both keys and datatypes.
170 """ 131 """
171 position = 'start' if line_type in {'header', 'metadata'} else 'body' 132 position = 'start' if line_type in {'header', 'metadata'} else 'body'
172 data = line2dict(_TEST_EXAMPLES[line_type]['in'], position) 133 data = line2dict(_TEST_EXAMPLES[line_type]['in'], position)
173 134
174 assert data == _TEST_EXAMPLES[line_type]['out'] 135 assert data == _TEST_EXAMPLES[line_type]['out']
(...skipping 10 matching lines...) Expand all
185 146
186 assert lines2dicts(ins, 'start') == outs 147 assert lines2dicts(ins, 'start') == outs
187 148
188 149
189 def test_lines2dicts_default(): 150 def test_lines2dicts_default():
190 """Test that the API returns the correct result in the appropriate format. 151 """Test that the API returns the correct result in the appropriate format.
191 152
192 By default, lines2dicts() does not correctly parse headers and metadata. 153 By default, lines2dicts() does not correctly parse headers and metadata.
193 """ 154 """
194 tests = [t for t in _TEST_EXAMPLES.values() 155 tests = [t for t in _TEST_EXAMPLES.values()
195 if t['out'][b'type'] not in {b'Header', b'Metadata'}] 156 if t['out']['type'] not in {'Header', 'Metadata'}]
196 ins = [ex['in'] for ex in tests] 157 ins = [ex['in'] for ex in tests]
197 outs = [ex['out'] for ex in tests] 158 outs = [ex['out'] for ex in tests]
198 159
199 assert lines2dicts(ins) == outs 160 assert lines2dicts(ins) == outs
OLDNEW
« no previous file with comments | « abp/filters/rpy.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld