import tempfile import typing import pytest from mypy_django_plugin.main import extract_django_settings_module TEMPLATE = """usage: (config) ... [mypy.plugins.django_stubs] django_settings_module: str (required) ... (django-stubs) mypy: error: 'django_settings_module' is not set: {} """ @pytest.mark.parametrize( 'config_file_contents,message_part', [ pytest.param( None, 'mypy config file is not specified or found', id='missing-file', ), pytest.param( ['[not-really-django-stubs]'], 'no section [mypy.plugins.django-stubs]', id='missing-section', ), pytest.param( ['[mypy.plugins.django-stubs]', '\tnot_django_not_settings_module = badbadmodule'], 'the setting is not provided', id='missing-settings-module', ), pytest.param( ['[mypy.plugins.django-stubs]'], 'the setting is not provided', id='no-settings-given', ), ], ) def test_misconfiguration_handling(capsys, config_file_contents, message_part): # type: (typing.Any, typing.List[str], str) -> None """Invalid configuration raises `SystemExit` with a precise error message.""" with tempfile.NamedTemporaryFile(mode='w+') as config_file: if not config_file_contents: config_file.close() else: config_file.write('\n'.join(config_file_contents).expandtabs(4)) config_file.seek(0) with pytest.raises(SystemExit, match='2'): extract_django_settings_module(config_file.name) error_message = TEMPLATE.format(message_part) assert error_message == capsys.readouterr().err def test_correct_configuration() -> None: """Django settings module gets extracted given valid configuration.""" config_file_contents = [ '[mypy.plugins.django-stubs]', '\tsome_other_setting = setting', '\tdjango_settings_module = my.module', ] with tempfile.NamedTemporaryFile(mode='w+') as config_file: config_file.write('\n'.join(config_file_contents).expandtabs(4)) config_file.seek(0) extracted = extract_django_settings_module(config_file.name) assert extracted == 'my.module'