Skip to content

Commit d546159

Browse files
committed
test: Add initial feature test
1 parent b981737 commit d546159

33 files changed

+2411
-0
lines changed

tests/__init__.py

Whitespace-only changes.

tests/conftest.py

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import os
2+
3+
import pytest
4+
5+
from src.csvdiff3.csvdiff import MatchingKeyInfo
6+
7+
8+
@pytest.fixture(scope='function')
9+
def args():
10+
return type("Arguments", (object,), {
11+
"lhs_file_name": "",
12+
"rhs_file_name": "",
13+
"encoding": "",
14+
"encoding_for_lhs": "utf8",
15+
"encoding_for_rhs": "utf8",
16+
"matching_keys": [MatchingKeyInfo('0')],
17+
"unique_key": False,
18+
"ignore_columns": [],
19+
"vertical_style": False,
20+
"show_count": False,
21+
"show_difference_only": False,
22+
"show_all_lines": False,
23+
"show_context_from_arguments": False,
24+
"sniffing_size": 4096,
25+
"force_individual_specs": False,
26+
"header": None,
27+
"column_separator": None,
28+
"line_separator": None,
29+
"quote_char": None,
30+
"no_skip_space_after_column_separator": "",
31+
"column_separator_for_lhs": "COMMA",
32+
"column_separator_for_rhs": "COMMA",
33+
"line_separator_for_lhs": "LF",
34+
"line_separator_for_rhs": "LF",
35+
"quote_char_for_lhs": '"',
36+
"quote_char_for_rhs": '"',
37+
"no_skip_space_after_column_separator_for_lhs": False,
38+
"no_skip_space_after_column_separator_for_rhs": False,
39+
})
40+
41+
@pytest.fixture(scope='function')
42+
def lhs(tmpdir):
43+
lhs = tmpdir.join("left.csv")
44+
return lhs
45+
46+
@pytest.fixture(scope='function')
47+
def rhs(tmpdir):
48+
rhs = tmpdir.join("right.csv")
49+
return rhs
50+
51+
@pytest.fixture(scope='function')
52+
def path_to_tests_dir():
53+
return './' if current_folder_name() == 'tests' else 'tests'
54+
55+
def current_folder_name():
56+
return os.path.basename(os.getcwd())
57+
58+
@pytest.fixture(scope='function')
59+
def lhs_dir(tmpdir):
60+
lhs = tmpdir.mkdir("left_dir")
61+
return lhs
62+
63+
@pytest.fixture(scope='function')
64+
def rhs_dir(tmpdir):
65+
rhs = tmpdir.mkdir("right_dir")
66+
return rhs
67+
68+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
"�����إå���1", "�����إå���2", "�����إå���3", "�����إå���4", "�����إå���5"
2+
"1", "�ͣ�-��", "��������", "���", "���ʡ����顦�ǥ����"
3+
"2", "�ͣ�-��", "��������", "���", "��Ĺ�٥��ѡ���"
4+
"3", "�ͣ�-��", "��������", "����", "��������Į�֥롼���Ǥ�Τä�"
5+
"4", "��i-��", "��������", "�̳�ƻ", "��������ϼ"
6+
"5", "�ͣ�-��", "��������", "����", "���Ÿ��˲��Ǧ��¼"
7+
"6", "�ͣ�-��", "��������", "����", "��ƽ��ê��"
8+
"7", "�ͣ�-��", "��������", "����", "�����ܵ��ԻԾ���躣�����̱�������������������������������Į"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
"�J�����w�b�_�[1", "�J�����w�b�_�[2", "�J�����w�b�_�[3", "�J�����w�b�_�[4", "�J�����w�b�_�[5"
2+
"1", "�l�P-�P", "�P�O�O�P", "����", "�E�i�E�Z���E�f�B����"
3+
"2", "�l�P-�Q", "�P�O�O�Q", "���", "�����x�A�p�[�g"
4+
"3", "�l�P-�R", "�P�O�O�R", "���l", "�ɐ����ؒ��u���[�X�ł��̂���"
5+
"4", "�li-�S", "�P�O�O�S", "�k�C��", "�r���R�̘["
6+
"5", "�l�P-�T", "�P�O�O�T", "�O�d", "�O�d���ɉ�s�E�ґ�"
7+
"6", "�l�P-�U", "�P�O�O�U", "�V��", "�����̒I�c"
8+
"7", "�l�P-�V", "�P�O�O�V", "���s", "���s�{���s�s�㋞�捡�o��ʉG�ۓ�������ؖړ������鑊������O��"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
"カラムヘッダー1", "カラムヘッダー2", "カラムヘッダー3", "カラムヘッダー4", "カラムヘッダー5"
2+
"1", "値1−1", "1001", "東京", "ウナ・セラ・ディ東京"
3+
"2", "値1−2", "1002", "大阪", "西長堀アパート"
4+
"3", "値1−3", "1003", "横浜", "伊勢佐木町ブルースでも歌って"
5+
"4", "値i−4", "1004", "北海道", "羊蹄山の麓🌱"
6+
"5", "値1−5", "1005", "三重", "三重県伊賀市忍者村"
7+
"6", "値1−6", "1006", "新潟", "星峠の棚田🌙"
8+
"7", "値1−7", "1007", "京都", "京都府京都市上京区今出川通烏丸東入上る二筋目東入下る相国寺門前町"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
"�����إå���1", "�����إå���2", "�����إå���3", "�����إå���4", "�����إå���5"
2+
"1", "�ͣ�-��", "��������", "���", "���ʡ����顦�ǥ����"
3+
"2", "�ͣ�-��", "��������", "���", "��Ĺ�٥��ѡ���"
4+
"3", "�ͣ�-��", "��������", "����", "��������Į�֥롼���Ǥ�Τä�"
5+
"4", "�ͣ�-��", "��������", "�̳�ƻ", "��������ϼ"
6+
"5", "�ͣ�-��", "�����", "���", "���Ÿ��˲��Ǧ��¼"
7+
"6", "�ͣ�-��", "��������", "����", "��ƽ��ê��"
8+
"7", "�ͣ�-��", "��������", "����", "�����ܵ��ԻԾ���躣�����̱�������������������������������Į"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
"�J�����w�b�_�[1", "�J�����w�b�_�[2", "�J�����w�b�_�[3", "�J�����w�b�_�[4", "�J�����w�b�_�[5"
2+
"1", "�l�P-�P", "�P�O�O�P", "����", "�E�i�E�Z���E�f�C����"
3+
"2", "�l�P-�Q", "�P�O�O�Q", "���", "�����x�A�p�[�g"
4+
"3", "�l�P-�R", "�P�O�O�R", "���l", "�ɐ����ؒ��u���[�Y�ł��̂���"
5+
"4", "�l�P-�S", "�P�O�O�S", "�k�C��", "�r���R�̘["
6+
"5", "�l�P-�T", "�P���O�T", "��d", "�O�d���ɉ�s�E�ґ�"
7+
"6", "�l�P-�U", "�P�O�O�U", "�V�G", "�����̒I�c"
8+
"7", "�l�P-�V", "�P�O�O�V", "���s", "���s�{���s�s�㋞�捡�o��ʉG�ۓ�������ؖړ������鑊������O��"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
"カラムヘッダー1", "カラムヘッダー2", "カラムヘッダー3", "カラムヘッダー4", "カラムヘッダー5"
2+
"1", "値1−1", "1001", "東京", "ウナ・セラ・デイ東京"
3+
"2", "値1−2", "1002", "大阪", "西長堀アパート"
4+
"3", "値1−3", "1003", "横浜", "伊勢佐木町ブルーズでも歌って"
5+
"4", "値1−4", "1004", "北海道", "羊蹄山の麓🌱"
6+
"5", "値1−5", "1o05", "二重", "三重県伊賀市忍者村"
7+
"6", "値1−6", "1006", "新烏", "星峠の棚田🌟"
8+
"7", "値1−7", "1007", "京都", "京都府京都市上京区今出川通烏丸東入上る二筋目東入下る相国寺門前町"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
"head1", "head2", "head3", "head4", "head5", "head6"
2+
"1", "value1-2", "key2-2", "1002", "20210921T035902", "value4-2"
3+
"1", "value1-3", "key2-3", "1003", "20210921T035904", "value4-3"
4+
"102", "value1-4", "key2-1", "1004", "20210924T180521", "value4-e"
5+
"1003", "value1-5", "key2-1", "1005", "20210924T180528", "value4-5"
6+
"1003", "value1-6", "key2-2", "1006", "20210923T143259", "value4-6"
7+
"1003", "value1-7", "key2-3", "1007", "20210923T143258", "value4-7"
8+
"1003", "value1-e", "key2-4", "1008", "20210923T143259", "value4-8"
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
"head1", "head2", "head3", "head4", "head5", "head6"
2+
"1", "value1-2", "key2-2", "1002", "20210921T035902", "value4-2"
3+
"1", "value1-3", "key2-3", "1003", "20210921T035904", "value4-3"
4+
"102", "value1-4", "key2-1", "1004", "20210924T180521", "value4-e"
5+
"1003", "value1-5", "key2-1", "1005", "20210924T180528", "value4-5"
6+
"1003", "value1-6", "key2-2", "1006", "20210923T143259", "value4-6"
7+
"1003", "value1-7", "key2-3", "1007", "20210923T143258", "value4-7"
8+
"1003", "value1-e", "key2-4", "1008", "20210923T143259", "value4-8"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
"head1", "head2", "head3", "head4", "head5", "head6"
2+
"1", "value1-1", "key2-1", "1001", "20210921T035901", "value4-1"
3+
"1", "value1-2", "key2-2", "1002", "20210921T035902", "value4-2"
4+
"1", "value1-3", "key2-3", "1003", "20210921T035903", "value4-3"
5+
"102", "value1-4e", "key2-1", "1044", "20210924T180529", "value4-4"
6+
"1003", "value1-6", "key2-2", "1006", "20210923T143259", "value4-6"
7+
"1003", "value1-8", "key2-4", "1008", "20210923T143257", "value4-e"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
"head1", "head2", "head3", "head4", "head5", "head6"
2+
"1", "value1-1", "key2-1", "1001", "20210921T035901", "value4-1"
3+
"1", "value1-2", "key2-2", "1002", "20210921T035902", "value4-2"
4+
"1", "value1-3", "key2-3", "1003", "20210921T035903", "value4-3"
5+
"102", "value1-4e", "key2-1", "1044", "20210924T180529", "value4-4"
6+
"1003", "value1-6", "key2-2", "1006", "20210923T143259", "value4-6"
7+
"1003", "value1-8", "key2-4", "1008", "20210923T143257", "value4-e"
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
"head1", "head2", "head3", "head4", "head5", "head6"
2+
"1", "value1 and
3+
value-2", "key2-2", "1,002", "20210921;035902", "value'4'tab 2"
4+
"1", "value1-3", "key2-3", "1003", "20210921
5+
T035904", "value""4""
6+
-3"
7+
"102", "value1-4", "key2-1", "1004", "20210924T180521", "value4-e"
8+
"1003", "value1-5", "key2-1", "1005", "20210924T180528", "value4-5"
9+
"1003", "value1 and
10+
value-6", "key2-2", "1,006", "20210923T143259", "value4tab 6"
11+
"1003", "value1-7", "key2-3", "1007", "20210923T143258", "value4-7"
12+
"1003", "value1-e", "key2-4", "1008", "20210923T143259", "value4-8"
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
"head1", "head2", "head3", "head4", "head5", "head6"
2+
"1", "value1-1", "key2-1", "1001", "20210921T035901", "value4-1"
3+
"1", "value1 and
4+
value-2", "key2-2", "1,002", "20210921;035902", "value'4'tab 2"
5+
"1", "value1-3", "key2-3", "1003", "20210921
6+
T035904", "value""4""-
7+
3"
8+
"102", "value1-4e", "key2-1", "1044", "20210924T180529", "value4-4"
9+
"1003", "value1 and
10+
value6", "key2-2", "1006", "20210923;143259", "value4 6"
11+
"1003", "value1-8", "key2-4", "1008", "20210923T143257", "value4-e"

tests/test__MatchingKeyCodec.py

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import pytest
2+
3+
from src.csvdiff3.csvdiff import MatchingKeyCodec, MatchingKeyInfo
4+
5+
6+
class EncodeExpected:
7+
8+
def __init__(self, managed_key, indices):
9+
self.managed_key = managed_key
10+
self.indices = indices
11+
12+
13+
@pytest.mark.parametrize(
14+
"matching_key_infos, row, expected",
15+
[
16+
pytest.param([MatchingKeyInfo('0')], ['key1', 'value1', 'value2'], EncodeExpected('..key1..', [0]), id='encode 1 alphabetical key'),
17+
pytest.param([MatchingKeyInfo('0'), MatchingKeyInfo('2')], ['key1', 'value1', 'key2'], EncodeExpected('..key1..key2..', [0, 2]), id='encode 2 alphabetical keys'),
18+
pytest.param([MatchingKeyInfo('0:10')], ['1', 'value1', 'value2'], EncodeExpected('..0000000001..', [0]), id='encode 1 number key without zero padding'),
19+
pytest.param([MatchingKeyInfo('0:10'), MatchingKeyInfo('2:4')], ['123456789', 'value1', '3'], EncodeExpected('..0123456789..0003..', [0, 2]), id='encode 2 number keys without zero padding'),
20+
pytest.param([MatchingKeyInfo('0:10'), MatchingKeyInfo('1'), MatchingKeyInfo('4:6')], ['123456789', 'key-2', 'value1', 'value2', '98'], EncodeExpected('..0123456789..key-2..000098..', [0, 1, 4]), id='encode 2 number keys and 1 alphabetical key'),
21+
],
22+
)
23+
def test_encode(matching_key_infos, row, expected):
24+
25+
sut = MatchingKeyCodec(matching_key_infos)
26+
assert sut.managed_key_for(row) == expected.managed_key
27+
assert sut.matching_key_indices == expected.indices
28+
29+
30+
31+
32+
class DecodeExpected:
33+
34+
def __init__(self, key_indices):
35+
self.key_indices = key_indices
36+
37+
38+
@pytest.mark.parametrize(
39+
"managed_key, expected",
40+
[
41+
pytest.param('..key1..', DecodeExpected(['key1']), id='decode 1 alphabetical key'),
42+
pytest.param('..key1..key2..', DecodeExpected(['key1', 'key2']), id='decode 2 alphabetical keys'),
43+
pytest.param('..0000000001..', DecodeExpected(['0000000001']), id='decode 1 number key (original is without zero padding)'),
44+
pytest.param('..0123456789..0003..', DecodeExpected(['0123456789', '0003']), id='decode 2 number keys (original is without zero padding)'),
45+
pytest.param('..0123456789..key-2..000098..', DecodeExpected(['0123456789', 'key-2', '000098']), id='decode 2 number keys and 1 alphabetical key'),
46+
],
47+
)
48+
def test_decode(managed_key, expected):
49+
50+
assert MatchingKeyCodec.decode_key(managed_key) == expected.key_indices
51+
52+
53+

tests/test__MatchingKeyInfo.py

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import pytest
2+
3+
from src.csvdiff3.csvdiff import MatchingKeyInfo
4+
5+
6+
class Expected:
7+
8+
def __init__(self, index, max_length):
9+
self.index = index
10+
self.max_length = max_length
11+
12+
class RowAndExpectedManagedKey:
13+
14+
def __init__(self, row, expected_managed_key):
15+
self.row = row
16+
self.expected_managed_key = expected_managed_key
17+
18+
19+
@pytest.mark.parametrize(
20+
"specified_matching_key, expected, row_and_expected_managed_key_pair",
21+
[
22+
pytest.param('0', Expected(index=0, max_length=0), RowAndExpectedManagedKey(['key1', 'value1'], expected_managed_key='key1'), id='index only case-1'),
23+
pytest.param('2', Expected(index=2, max_length=0), RowAndExpectedManagedKey(['key1', 'value1', 'key2'], expected_managed_key='key2'), id='index only case-2'),
24+
pytest.param('0:9', Expected(index=0, max_length=9), RowAndExpectedManagedKey(['1', 'value1'], expected_managed_key='000000001'), id='index and max length with 1 digit'),
25+
pytest.param('0:9', Expected(index=0, max_length=9), RowAndExpectedManagedKey(['123456789', 'value1'], expected_managed_key='123456789'), id='index and max length with full digits'),
26+
pytest.param('0:9', Expected(index=0, max_length=9), RowAndExpectedManagedKey(['12345678', 'value1'], expected_managed_key='012345678'), id='index and max length with full digits - 1'),
27+
pytest.param('0:9', Expected(index=0, max_length=9), RowAndExpectedManagedKey(['abc', 'value1'], expected_managed_key='000000abc'), id='index and max length with alphabet'),
28+
],
29+
)
30+
def test_matching_key_info(specified_matching_key, expected, row_and_expected_managed_key_pair):
31+
32+
sut = MatchingKeyInfo(specified_matching_key)
33+
34+
assert sut.index == expected.index
35+
assert sut.max_length == expected.max_length
36+
assert sut.key_for(row_and_expected_managed_key_pair.row) == row_and_expected_managed_key_pair.expected_managed_key
37+
38+
39+
+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import pytest
2+
3+
from src.csvdiff3.csvdiff import ValueDifferenceDetector
4+
5+
6+
class Condition:
7+
8+
def __init__(self, cols, keys, ignores, lhs, rhs):
9+
self.cols = cols
10+
self.keys = keys
11+
self.ignores = ignores
12+
self.lhs = lhs
13+
self.rhs = rhs
14+
15+
class Expected:
16+
17+
def __init__(self, has_difference, different_column_indices):
18+
self.has_difference = has_difference
19+
self.different_column_indices = different_column_indices
20+
21+
22+
@pytest.mark.parametrize(
23+
"condition, expected",
24+
[
25+
pytest.param(Condition(cols=5, keys=[0], ignores=[],
26+
lhs=['1', 'value-1', 'value-2', 'value-3', 'value-4'],
27+
rhs=['1', 'value-1', 'value-2', 'value-3', 'value-4']), Expected(has_difference=False, different_column_indices=[]), id='no difference : 1 numerical key'),
28+
pytest.param(Condition(cols=5, keys=[4], ignores=[],
29+
lhs=['value-1', 'value-2', 'value-3', 'value-4', 'key-1'],
30+
rhs=['value-1', 'value-2', 'value-3', 'value-4', 'key-1']), Expected(has_difference=False, different_column_indices=[]), id='no difference : 1 alphabetical key'),
31+
pytest.param(Condition(cols=5, keys=[0, 3], ignores=[],
32+
lhs=['key-1', 'value-1', 'value-2', '7', 'value-3'],
33+
rhs=['key-1', 'value-1', 'value-2', '7', 'value-3']), Expected(has_difference=False, different_column_indices=[]), id='no difference : multiple keys'),
34+
pytest.param(Condition(cols=5, keys=[4, 0], ignores=[],
35+
lhs=['key-1', 'value-1', 'value-2', 'value-3', '7'],
36+
rhs=['key-1', 'value-1', 'value-2', 'value-3', '7']), Expected(has_difference=False, different_column_indices=[]), id='no difference : multiple keys in reverse order'),
37+
pytest.param(Condition(cols=5, keys=[1], ignores=[],
38+
lhs=['value-1', '1', 'value-2', 'value-3', 'value-4'],
39+
rhs=['value-2', '1', 'value-2', 'value-3', 'value-4']), Expected(has_difference=True, different_column_indices=[0]), id='1 difference : at first'),
40+
pytest.param(Condition(cols=5, keys=[1], ignores=[],
41+
lhs=['value-1', '1', 'value-2', 'value-3', 'value-5'],
42+
rhs=['value-1', '1', 'value-2', 'value-3', 'value-4']), Expected(has_difference=True, different_column_indices=[4]), id='1 difference : at last'),
43+
pytest.param(Condition(cols=5, keys=[1], ignores=[],
44+
lhs=['value-1', '1', 'value-2', 'value-3', 'value-5'],
45+
rhs=['value-0', '1', 'value-3', 'value-2', 'value-4']), Expected(has_difference=True, different_column_indices=[0, 2, 3, 4]), id='multi differences : all columns'),
46+
pytest.param(Condition(cols=5, keys=[1], ignores=[0],
47+
lhs=['value-1', '1', 'value-2', 'value-3', 'value-5'],
48+
rhs=['value-0', '1', 'value-3', 'value-2', 'value-4']), Expected(has_difference=True, different_column_indices=[2, 3, 4]), id='multi differences : with first column ignored'),
49+
pytest.param(Condition(cols=5, keys=[1], ignores=[4],
50+
lhs=['value-1', '1', 'value-2', 'value-3', 'value-5'],
51+
rhs=['value-0', '1', 'value-3', 'value-2', 'value-4']), Expected(has_difference=True, different_column_indices=[0, 2, 3]), id='multi differences : with last column ignored'),
52+
pytest.param(Condition(cols=5, keys=[1], ignores=[2, 4],
53+
lhs=['value-1', '1', 'value-2', 'value-3', 'value-5'],
54+
rhs=['value-0', '1', 'value-3', 'value-2', 'value-4']), Expected(has_difference=True, different_column_indices=[0, 3]), id='multi differences : with multi columns ignored'),
55+
],
56+
)
57+
def test_value_difference_detector(condition, expected):
58+
59+
sut = ValueDifferenceDetector(number_of_columns=condition.cols , matching_key_indices=condition.keys, ignore_column_indices=condition.ignores)
60+
61+
actual = sut.detect_difference_between(condition.lhs, condition.rhs)
62+
63+
assert actual.has_difference == expected.has_difference
64+
assert actual.different_column_indices == expected.different_column_indices
65+
66+
67+

0 commit comments

Comments
 (0)