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