main_test.py 4.1 KB

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