main_test.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import logging
  4. from compose import container
  5. from compose.cli.errors import UserError
  6. from compose.cli.formatter import ConsoleWarningFormatter
  7. from compose.cli.log_printer import LogPrinter
  8. from compose.cli.main import attach_to_logs
  9. from compose.cli.main import build_log_printer
  10. from compose.cli.main import convergence_strategy_from_opts
  11. from compose.cli.main import setup_console_handler
  12. from compose.project import Project
  13. from compose.service import ConvergenceStrategy
  14. from tests import mock
  15. from tests import unittest
  16. def mock_container(service, number):
  17. return mock.create_autospec(
  18. container.Container,
  19. service=service,
  20. number=number,
  21. name_without_project='{0}_{1}'.format(service, number))
  22. class CLIMainTestCase(unittest.TestCase):
  23. def test_build_log_printer(self):
  24. containers = [
  25. mock_container('web', 1),
  26. mock_container('web', 2),
  27. mock_container('db', 1),
  28. mock_container('other', 1),
  29. mock_container('another', 1),
  30. ]
  31. service_names = ['web', 'db']
  32. log_printer = build_log_printer(containers, service_names, True)
  33. self.assertEqual(log_printer.containers, containers[:3])
  34. def test_build_log_printer_all_services(self):
  35. containers = [
  36. mock_container('web', 1),
  37. mock_container('db', 1),
  38. mock_container('other', 1),
  39. ]
  40. service_names = []
  41. log_printer = build_log_printer(containers, service_names, True)
  42. self.assertEqual(log_printer.containers, containers)
  43. def test_attach_to_logs(self):
  44. project = mock.create_autospec(Project)
  45. log_printer = mock.create_autospec(LogPrinter, containers=[])
  46. service_names = ['web', 'db']
  47. timeout = 12
  48. with mock.patch('compose.cli.main.signals.signal', autospec=True) as mock_signal:
  49. attach_to_logs(project, log_printer, service_names, timeout)
  50. assert mock_signal.signal.mock_calls == [
  51. mock.call(mock_signal.SIGINT, mock.ANY),
  52. mock.call(mock_signal.SIGTERM, mock.ANY),
  53. ]
  54. log_printer.run.assert_called_once_with()
  55. class SetupConsoleHandlerTestCase(unittest.TestCase):
  56. def setUp(self):
  57. self.stream = mock.Mock()
  58. self.stream.isatty.return_value = True
  59. self.handler = logging.StreamHandler(stream=self.stream)
  60. def test_with_tty_verbose(self):
  61. setup_console_handler(self.handler, True)
  62. assert type(self.handler.formatter) == ConsoleWarningFormatter
  63. assert '%(name)s' in self.handler.formatter._fmt
  64. assert '%(funcName)s' in self.handler.formatter._fmt
  65. def test_with_tty_not_verbose(self):
  66. setup_console_handler(self.handler, False)
  67. assert type(self.handler.formatter) == ConsoleWarningFormatter
  68. assert '%(name)s' not in self.handler.formatter._fmt
  69. assert '%(funcName)s' not in self.handler.formatter._fmt
  70. def test_with_not_a_tty(self):
  71. self.stream.isatty.return_value = False
  72. setup_console_handler(self.handler, False)
  73. assert type(self.handler.formatter) == logging.Formatter
  74. class ConvergeStrategyFromOptsTestCase(unittest.TestCase):
  75. def test_invalid_opts(self):
  76. options = {'--force-recreate': True, '--no-recreate': True}
  77. with self.assertRaises(UserError):
  78. convergence_strategy_from_opts(options)
  79. def test_always(self):
  80. options = {'--force-recreate': True, '--no-recreate': False}
  81. self.assertEqual(
  82. convergence_strategy_from_opts(options),
  83. ConvergenceStrategy.always
  84. )
  85. def test_never(self):
  86. options = {'--force-recreate': False, '--no-recreate': True}
  87. self.assertEqual(
  88. convergence_strategy_from_opts(options),
  89. ConvergenceStrategy.never
  90. )
  91. def test_changed(self):
  92. options = {'--force-recreate': False, '--no-recreate': False}
  93. self.assertEqual(
  94. convergence_strategy_from_opts(options),
  95. ConvergenceStrategy.changed
  96. )