1# test_encoding.py - test endoding argument for openers, readers, and writers
2
3from __future__ import unicode_literals
4
5import pytest
6
7import csv23._dispatch
8from csv23.openers import open_reader, open_writer
9from csv23.readers import reader
10from csv23.writers import writer
11
12
13@pytest.fixture
14def stream(mocker):
15    return mocker.sentinel.stream
16
17
18@pytest.mark.parametrize('func, cls_key, mode', [
19    (open_reader, ('reader', 'list', 'text'), 'r'),
20    (open_writer, ('writer', 'list', 'text'), 'w'),
21])
22def test_open_func_encoding_none(mocker, mock_open, stream,
23                                 func, cls_key, mode, nonclean_none_encoding):
24    mock_cls = mocker.create_autospec(csv23._dispatch.REGISTRY[cls_key])
25    mocker.patch.dict('csv23._dispatch.REGISTRY', {cls_key: mock_cls})
26    with func(stream, encoding=None) as f:
27        assert f is mock_cls.return_value
28        mock_cls.assert_called_once_with(mock_open.return_value, dialect='excel')
29    mock_open.assert_called_once_with(stream, encoding=nonclean_none_encoding,
30                                      mode=mode, newline='')
31
32
33@pytest.mark.parametrize('func, cls_path', [
34    (reader, 'csv23.readers.UnicodeBytesReader'),
35    (writer, 'csv23.writers.UnicodeBytesWriter'),
36])
37def test_func_encoding_none(mocker, stream, func, cls_path, none_encoding):
38    mock_cls = mocker.patch(cls_path, autospec=True)
39    assert func(stream, encoding=None) is mock_cls.return_value
40    mock_cls.assert_called_once_with(stream, 'excel', none_encoding)
41
42
43@pytest.mark.parametrize('func', [reader, writer])
44def test_reader_encoding_nonclean(stream, func, nonclean_encoding):
45    with pytest.raises(NotImplementedError):
46        func(stream, encoding=nonclean_encoding)
47