import os import django import pytest from ..config import DJANGO_SETTINGS_DIR from ..program import Program from .generic import DjangoDeployTestCase class AbstractProgramTestCase(DjangoDeployTestCase): @pytest.fixture(autouse=True) def capsys(self, capsys): # pylint: disable=method-hidden self.capsys = capsys def setUp(self): self._program = Program() self._tmp_dir = str(self.tmpdir) class ProgramCreateTestCase(AbstractProgramTestCase): def test_create(self): project_dir = os.path.join(self._tmp_dir, 'new') exitval = self._program(argv=['--create', project_dir]) self.assertEqual(os.EX_OK, exitval) self.assert_django_project(project_dir) self.assert_django_deploy_hooks(project_dir) def test_create_in_empty_dir(self): project_dir = self._tmp_dir exitval = self._program(argv=['-c', project_dir]) self.assertEqual(os.EX_OK, exitval) self.assert_django_project(project_dir) self.assert_django_deploy_hooks(project_dir) def test_create_in_project_dir(self): project_dir = self._tmp_dir self._program(argv=['-c', project_dir]) exitval = self._program(argv=['-c', project_dir]) self.assertNotEqual(os.EX_OK, exitval) def test_create_without_hooks(self): project_dir = self._tmp_dir exitval = self._program(argv=['-c', '--no-install-hooks', project_dir]) self.assertEqual(os.EX_OK, exitval) self.assert_django_project(project_dir) self.assert_no_django_deploy_hooks(project_dir) def test_install_hooks_without_project_dir(self): project_dir = os.path.join(self._tmp_dir, 'new') exitval = self._program(argv=['--install-hooks', project_dir]) self.assertNotEqual(os.EX_OK, exitval) project_dir = os.path.join(self._tmp_dir) exitval = self._program(argv=['--install-hooks', project_dir]) self.assertNotEqual(os.EX_OK, exitval) def test_install_hooks_in_pure_django(self): project_dir = self._tmp_dir cmd = 'django-admin startproject {name} {path}'.format(name=DJANGO_SETTINGS_DIR, path=project_dir) os.system(cmd) exitval = self._program(argv=['--install-hooks', project_dir]) self.assertEqual(os.EX_OK, exitval) self.assert_django_project(project_dir) self.assert_django_deploy_hooks(project_dir) def test_install_hooks_twice(self): project_dir = self._tmp_dir self._program(argv=['-c', project_dir]) exitval = self._program(argv=['--install-hooks', project_dir]) self.assertEqual(os.EX_SOFTWARE, exitval) class ProgramInstallTestCase(AbstractProgramTestCase): def test_install_apps(self): project_dir = self._tmp_dir argv = [ '--install-app', 'django_deploy.tests.fake_app1', '--install-app', 'django_deploy.tests.fake_app1', '-a', 'django_deploy.tests.fake_app2', project_dir ] exitval = self._program(argv=argv) self.assertEqual(os.EX_OK, exitval) # Similar code from test_api.test_install_apps installed_apps = [ 'django_deploy.tests.fake_app1', 'django_deploy.tests.fake_app2', ] self.assert_installed_apps(project_dir, installed_apps) self.assert_urlpatterns(project_dir, []) def test_install_with_explicit_create(self): project_dir = self._tmp_dir argv = [ '-c', '--install-app', 'django_deploy.tests.fake_app1', project_dir ] exitval = self._program(argv=argv) self.assertEqual(os.EX_OK, exitval) def test_install_apps_with_error(self): project_dir = self._tmp_dir argv = [ '-a', 'django_deploy.tests.fake_app1', '-a', 'django_deploy.tests.fake_app0', '-a', 'django_deploy.tests.fake_app2', project_dir ] exitval = self._program(argv=argv) self.assertNotEqual(os.EX_OK, exitval) installed_apps = [ 'django_deploy.tests.fake_app1', 'django_deploy.tests.fake_app2', ] self.assert_installed_apps(project_dir, installed_apps) class ProgramMountTestCase(AbstractProgramTestCase): def test_mount_apps(self): project_dir = self._tmp_dir argv = [ '--mount-app', 'django_deploy.tests.fake_app1', 'app1', '--mount-app', 'django_deploy.tests.fake_app1', 'app1', '-m', 'django_deploy.tests.fake_app2', 'app2/', project_dir ] exitval = self._program(argv=argv) self.assertEqual(os.EX_OK, exitval) # Similar code from test_api.test_mount_apps expected_urlpatterns = [ ('URLResolver', '^app1/', 'django_deploy.tests.fake_app1.urls'), ('URLResolver', '^app2/', 'django_deploy.tests.fake_app2.urls'), ] self.assert_urlpatterns(project_dir, expected_urlpatterns) # Similar code from test_api.test_mount_apps installed_apps = [ 'django_deploy.tests.fake_app1', 'django_deploy.tests.fake_app2', ] self.assert_installed_apps(project_dir, installed_apps) def test_mount_apps_with_errors(self): project_dir = self._tmp_dir argv = [ '-m', 'django_deploy.tests.fake_app1', '/', '-m', 'django_deploy.tests.fake_app0', 'app0', '-m', 'django_deploy.tests.fake_app2', 'app2', project_dir ] exitval = self._program(argv=argv) self.assertNotEqual(os.EX_OK, exitval) # Similar code from test_api.test_mount_apps expected_urlpatterns = [ ('URLResolver', '^', 'django_deploy.tests.fake_app1.urls'), ('URLResolver', '^app2/', 'django_deploy.tests.fake_app2.urls'), ] self.assert_urlpatterns(project_dir, expected_urlpatterns) class ProgramMigrateTestCase(AbstractProgramTestCase): def test_migrate_all(self): project_dir = self._tmp_dir argv = [ '--install-app', 'django_deploy.tests.fake_app1', '--install-app', 'django_deploy.tests.fake_app2', '--migrate', project_dir ] exitval = self._program(argv=argv) self.assertEqual(os.EX_OK, exitval) self.assert_django_database_migration(project_dir) def test_migrate_app_by_app_name(self): project_dir = self._tmp_dir argv = [ '--install-app', 'django_deploy.tests.fake_app1', '--migrate-app', 'django_deploy.tests.fake_app1', project_dir ] exitval = self._program(argv=argv) self.assertEqual(os.EX_OK, exitval) self.assert_django_database_migration(project_dir, 'fake_app1') def test_migrate_app_by_app_label(self): project_dir = self._tmp_dir argv = [ '--install-app', 'django_deploy.tests.fake_app1', '--migrate-app', 'fake_app1', project_dir ] exitval = self._program(argv=argv) self.assertEqual(os.EX_OK, exitval) self.assert_django_database_migration(project_dir, 'fake_app1') def test_migrate_app_not_installed(self): project_dir = self._tmp_dir argv = [ '-c', '--migrate-app', 'django_deploy.tests.fake_app1', project_dir ] exitval = self._program(argv=argv) self.assertNotEqual(os.EX_OK, exitval) captured = self.capsys.readouterr() if django.VERSION[0] < 2: # pragma: no cover expected_msg = "CommandError: App 'fake_app1' does not have migrations.\n" else: # pragma: no cover expected_msg = "CommandError: No installed app with label 'fake_app1'.\n" self.assertEqual(expected_msg, captured.err) def test_migrate_app_without_create(self): project_dir = self._tmp_dir argv = [ '--migrate-app', 'django_deploy.tests.fake_app1', project_dir ] exitval = self._program(argv=argv) self.assertNotEqual(os.EX_OK, exitval) captured = self.capsys.readouterr() self.assertTrue(captured.err.endswith('Have you created the django project?\n')) def test_migrate_app_without_migrations(self): project_dir = self._tmp_dir argv = [ '--install-app', 'django_deploy.tests.fake_app1', '--install-app', 'django_deploy.tests.fake_app2', '--migrate-app', 'fake_app2', '--migrate-app', 'fake_app1', project_dir ] exitval = self._program(argv=argv) self.assertNotEqual(os.EX_OK, exitval) captured = self.capsys.readouterr() self.assertEqual("CommandError: App 'fake_app2' does not have migrations.\n", captured.err) def test_migrate_app_stop_on_first_error(self): project_dir = self._tmp_dir argv = [ '--install-app', 'django_deploy.tests.fake_app1', '--install-app', 'django_deploy.tests.fake_app2', '--migrate-app', 'fake_app2', '--migrate-app', 'fake_app1', '--migrate-app', 'django_deploy', project_dir ] exitval = self._program(argv=argv) self.assertNotEqual(os.EX_OK, exitval) captured = self.capsys.readouterr() self.assertEqual("CommandError: App 'fake_app2' does not have migrations.\n", captured.err) try: self.assert_django_database_migration(project_dir, 'fake_app1') except AssertionError: pass else: # pragma: no cover self.fail('Unexcepted migrations done')