| Index: tests/test_rpy.py |
| diff --git a/tests/test_rpy.py b/tests/test_rpy.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..6169c8fa50221b111e66fe5ca6f10c4809039f47 |
| --- /dev/null |
| +++ b/tests/test_rpy.py |
| @@ -0,0 +1,163 @@ |
| +# This file is part of Adblock Plus <https://adblockplus.org/>, |
| +# Copyright (C) 2006-present eyeo GmbH |
| +# |
| +# Adblock Plus is free software: you can redistribute it and/or modify |
| +# it under the terms of the GNU General Public License version 3 as |
| +# published by the Free Software Foundation. |
| +# |
| +# Adblock Plus is distributed in the hope that it will be useful, |
| +# but WITHOUT ANY WARRANTY; without even the implied warranty of |
| +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| +# GNU General Public License for more details. |
| +# |
| +# You should have received a copy of the GNU General Public License |
| +# along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| + |
| +"""Functional tests for testing rPython integration.""" |
| +from __future__ import unicode_literals |
| + |
| +from collections import namedtuple |
| +import pytest |
| + |
| +from abp.filters.rpy import ( |
| + tuple2dict, line2dict, |
| +) |
| + |
| +_SAMPLE_TUPLE = namedtuple('tuple', 'foo,bar') |
| + |
| +_ENCODED_STR_TYPE = type(''.encode('utf-8')) |
| + |
| +_EXPECTED_TYPES = { |
| + 'header': { |
| + 'type': _ENCODED_STR_TYPE, |
| + 'version': _ENCODED_STR_TYPE, |
| + }, |
| + 'metadata': { |
| + 'type': _ENCODED_STR_TYPE, |
| + 'key': _ENCODED_STR_TYPE, |
| + 'value': _ENCODED_STR_TYPE, |
| + }, |
| + 'empty': { |
| + 'type': _ENCODED_STR_TYPE, |
| + }, |
| + 'comment': { |
| + 'type': _ENCODED_STR_TYPE, |
| + 'text': _ENCODED_STR_TYPE, |
| + }, |
| + 'include': { |
| + 'type': _ENCODED_STR_TYPE, |
| + 'target': _ENCODED_STR_TYPE, |
| + }, |
| + 'filter': { |
| + 'type': _ENCODED_STR_TYPE, |
| + 'text': _ENCODED_STR_TYPE, |
| + 'selector': dict, |
| + 'action': _ENCODED_STR_TYPE, |
| + 'options': list, |
| + }, |
| +} |
| + |
| + |
| +def check_correct_datatypes(data, expected_types): |
|
Vasily Kuznetsov
2018/08/08 14:32:50
What do you think about checking generated dicts a
Tudor Avram
2018/08/09 12:55:02
Done.
|
| + """Check if the resulting data has the correct keys and datatypes. |
| + |
| + Parameters |
| + ---------- |
| + data: dict |
| + The dictonary produced by the API |
| + |
| + expected_types: dict |
| + The expected keys and datatypes associated with them. |
| + |
| + Raises |
| + ------- |
| + AssertionError |
| + If any of the types/ keys don't correspond |
| + |
| + """ |
| + def encode_fn(x): |
| + return x.encode('utf-8') |
| + |
| + data_keys = sorted(list(data.keys())) |
| + expected_keys = sorted(list(map(encode_fn, expected_types.keys()))) |
| + |
| + if data_keys != expected_keys: |
| + raise AssertionError('Invalid dict format. Got keys {0}, ' |
| + 'expected {1}'.format(data_keys, expected_keys)) |
| + |
| + for key in data: |
| + if not isinstance(data[key], expected_types[key.decode('utf-8')]): |
| + raise AssertionError( |
| + 'Invalid dict format. {0} should be {1}. Got {2}'.format( |
| + key, |
| + expected_types[key.decode('utf-8')], |
| + type(data[key]), |
| + ), |
| + ) |
| + |
| + |
| +def check_data_utf8(data): |
| + """Check if all the strings in a dict are encoded as unicode. |
| + |
| + Parameters |
| + ---------- |
| + data: dict |
| + The dictionary to be checked |
| + |
| + Raises |
| + ------- |
| + AssertionError |
| + If any of the strings encountered are not unicode |
| + |
| + """ |
| + if isinstance(data, dict): |
| + for key, value in data.items(): |
| + check_data_utf8(key) |
| + check_data_utf8(value) |
| + elif isinstance(data, (list, tuple)): |
| + for item in data: |
| + check_data_utf8(item) |
| + elif isinstance(data, type('')): |
| + raise AssertionError('{} is str. Expected bytes.'.format(data)) |
| + |
| + |
| +@pytest.mark.parametrize('foo,bar', [ |
| + ('test_foo', 1), |
| + ({'foofoo': 'test', 'foobar': 2}, [1, 2, 3]), |
| + ((1,), [('a', True), ('b', False)]), |
| +]) |
| +def test_tuple2dict(foo, bar): |
| + """Test that dicts are produced correctly from a named tuple.""" |
| + data = _SAMPLE_TUPLE(foo=foo, bar=bar) |
| + exp = {'foo': foo, 'bar': bar, 'type': 'tuple'} |
| + |
| + result = tuple2dict(data) |
| + |
| + assert exp == result |
| + |
| + |
| +@pytest.mark.parametrize('filter_text', [ |
| + 'abc$image', |
| + '\u0432\u0435\u0431\u0441\u0430\u0439.\u0440\u0444$domain=\xfcber.de', |
| +]) |
| +def test_line2dict_encoding(filter_text): |
| + """Test that the resulting object has all strings encoded as utf-8.""" |
| + data = line2dict(filter_text.encode('utf-8')) |
| + check_data_utf8(data) |
| + |
| + |
| +@pytest.mark.parametrize('line,expected', [ |
| + ('[Adblock Plus 2.0]', _EXPECTED_TYPES['header']), |
| + ('! Title: Example list', _EXPECTED_TYPES['metadata']), |
| + ('! Comment', _EXPECTED_TYPES['comment']), |
| + ('abc.com,cdf.com##div#ad1', _EXPECTED_TYPES['filter']), |
| + ('%include www.test.py/filtelist.txt%', _EXPECTED_TYPES['include']), |
| + ('', _EXPECTED_TYPES['empty']), |
| +]) |
| +def test_line2dict_format(line, expected): |
| + """Test that the API result has the appropriate format. |
| + |
| + Checks for both keys and datatypes. |
| + """ |
| + data = line2dict(line) |
| + check_correct_datatypes(data, expected) |