main_test.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import logging
  4. import pytest
  5. from compose import container
  6. from compose.cli.errors import UserError
  7. from compose.cli.formatter import ConsoleWarningFormatter
  8. from compose.cli.main import convergence_strategy_from_opts
  9. from compose.cli.main import filter_containers_to_service_names
  10. from compose.cli.main import setup_console_handler
  11. from compose.service import ConvergenceStrategy
  12. from tests import mock
  13. def mock_container(service, number):
  14. return mock.create_autospec(
  15. container.Container,
  16. service=service,
  17. number=number,
  18. name_without_project='{0}_{1}'.format(service, number))
  19. @pytest.fixture
  20. def logging_handler():
  21. stream = mock.Mock()
  22. stream.isatty.return_value = True
  23. return logging.StreamHandler(stream=stream)
  24. class TestCLIMainTestCase(object):
  25. def test_filter_containers_to_service_names(self):
  26. containers = [
  27. mock_container('web', 1),
  28. mock_container('web', 2),
  29. mock_container('db', 1),
  30. mock_container('other', 1),
  31. mock_container('another', 1),
  32. ]
  33. service_names = ['web', 'db']
  34. actual = filter_containers_to_service_names(containers, service_names)
  35. assert actual == containers[:3]
  36. def test_filter_containers_to_service_names_all(self):
  37. containers = [
  38. mock_container('web', 1),
  39. mock_container('db', 1),
  40. mock_container('other', 1),
  41. ]
  42. service_names = []
  43. actual = filter_containers_to_service_names(containers, service_names)
  44. assert actual == containers
  45. class TestSetupConsoleHandlerTestCase(object):
  46. def test_with_tty_verbose(self, logging_handler):
  47. setup_console_handler(logging_handler, True)
  48. assert type(logging_handler.formatter) == ConsoleWarningFormatter
  49. assert '%(name)s' in logging_handler.formatter._fmt
  50. assert '%(funcName)s' in logging_handler.formatter._fmt
  51. def test_with_tty_not_verbose(self, logging_handler):
  52. setup_console_handler(logging_handler, False)
  53. assert type(logging_handler.formatter) == ConsoleWarningFormatter
  54. assert '%(name)s' not in logging_handler.formatter._fmt
  55. assert '%(funcName)s' not in logging_handler.formatter._fmt
  56. def test_with_not_a_tty(self, logging_handler):
  57. logging_handler.stream.isatty.return_value = False
  58. setup_console_handler(logging_handler, False)
  59. assert type(logging_handler.formatter) == logging.Formatter
  60. class TestConvergeStrategyFromOptsTestCase(object):
  61. def test_invalid_opts(self):
  62. options = {'--force-recreate': True, '--no-recreate': True}
  63. with pytest.raises(UserError):
  64. convergence_strategy_from_opts(options)
  65. def test_always(self):
  66. options = {'--force-recreate': True, '--no-recreate': False}
  67. assert (
  68. convergence_strategy_from_opts(options) ==
  69. ConvergenceStrategy.always
  70. )
  71. def test_never(self):
  72. options = {'--force-recreate': False, '--no-recreate': True}
  73. assert (
  74. convergence_strategy_from_opts(options) ==
  75. ConvergenceStrategy.never
  76. )
  77. def test_changed(self):
  78. options = {'--force-recreate': False, '--no-recreate': False}
  79. assert (
  80. convergence_strategy_from_opts(options) ==
  81. ConvergenceStrategy.changed
  82. )