summaryrefslogtreecommitdiff
path: root/tests/unit
diff options
context:
space:
mode:
authorIan Cordasco <graffatcolmingov@gmail.com>2016-06-01 16:56:17 -0500
committerIan Cordasco <graffatcolmingov@gmail.com>2016-06-01 16:56:17 -0500
commitba2d94888c2989da70fe025aad50eaee1206dc6f (patch)
tree4736c8dd64f2fb1909eb9497a8bcf37b934f8478 /tests/unit
parent15043a4ab7a7d3eab7f3906e40f744c40ba83d17 (diff)
downloadflake8-ba2d94888c2989da70fe025aad50eaee1206dc6f.tar.gz
Add tests for BaseFormatter
Diffstat (limited to 'tests/unit')
-rw-r--r--tests/unit/test_base_formatter.py103
1 files changed, 103 insertions, 0 deletions
diff --git a/tests/unit/test_base_formatter.py b/tests/unit/test_base_formatter.py
new file mode 100644
index 0000000..625e4c1
--- /dev/null
+++ b/tests/unit/test_base_formatter.py
@@ -0,0 +1,103 @@
+"""Tests for the BaseFormatter object."""
+import optparse
+
+import mock
+import pytest
+
+from flake8.formatting import base
+from flake8 import style_guide
+
+
+def options(**kwargs):
+ """Create an optparse.Values instance."""
+ kwargs.setdefault('output_file', None)
+ return optparse.Values(kwargs)
+
+
+@pytest.mark.parametrize('filename', [None, 'out.txt'])
+def test_start(filename):
+ """Verify we open a new file in the start method."""
+ mock_open = mock.mock_open()
+ formatter = base.BaseFormatter(options(output_file=filename))
+ with mock.patch('flake8.formatting.base.open', mock_open):
+ formatter.start()
+
+ if filename is None:
+ assert mock_open.called is False
+ else:
+ mock_open.assert_called_once_with(filename, 'w')
+
+
+def test_stop():
+ """Verify we close open file objects."""
+ filemock = mock.Mock()
+ formatter = base.BaseFormatter(options())
+ formatter.output_fd = filemock
+ formatter.stop()
+
+ filemock.close.assert_called_once_with()
+ assert formatter.output_fd is None
+
+
+def test_format_needs_to_be_implemented():
+ """Ensure BaseFormatter#format raises a NotImplementedError."""
+ formatter = base.BaseFormatter(options())
+ with pytest.raises(NotImplementedError):
+ formatter.format('foo')
+
+
+def test_show_source_returns_nothing_when_not_showing_source():
+ """Ensure we return nothing when users want nothing."""
+ formatter = base.BaseFormatter(options(show_source=False))
+ assert formatter.show_source(
+ style_guide.Error('A000', 'file.py', 1, 1, 'error text', 'line')
+ ) is None
+
+
+@pytest.mark.parametrize('line, column', [
+ ('x=1\n', 2),
+ (' x=(1\n +2)\n', 5),
+ # TODO(sigmavirus24): Add more examples
+])
+def test_show_source_updates_physical_line_appropriately(line, column):
+ """Ensure the error column is appropriately indicated."""
+ formatter = base.BaseFormatter(options(show_source=True))
+ error = style_guide.Error('A000', 'file.py', 1, column, 'error', line)
+ output = formatter.show_source(error)
+ _, pointer = output.rsplit('\n', 1)
+ assert pointer.count(' ') == column
+
+
+def test_write_uses_an_output_file():
+ """Verify that we use the output file when it's present."""
+ line = 'Something to write'
+ source = 'source'
+ filemock = mock.Mock()
+
+ formatter = base.BaseFormatter(options())
+ formatter.output_fd = filemock
+ formatter.write(line, source)
+
+ assert filemock.write.called is True
+ assert filemock.write.call_count == 2
+ assert filemock.write.mock_calls == [
+ mock.call(line + formatter.newline),
+ mock.call(source + formatter.newline),
+ ]
+
+
+@mock.patch('flake8.formatting.base.print')
+def test_write_uses_print(print_function):
+ """Verify that we use the print function without an output file."""
+ line = 'Something to write'
+ source = 'source'
+
+ formatter = base.BaseFormatter(options())
+ formatter.write(line, source)
+
+ assert print_function.called is True
+ assert print_function.call_count == 2
+ assert print_function.mock_calls == [
+ mock.call(line),
+ mock.call(source),
+ ]