main_test.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import logging
  4. import docker
  5. import pytest
  6. from compose import container
  7. from compose.cli.errors import UserError
  8. from compose.cli.formatter import ConsoleWarningFormatter
  9. from compose.cli.main import convergence_strategy_from_opts
  10. from compose.cli.main import filter_containers_to_service_names
  11. from compose.cli.main import setup_console_handler
  12. from compose.cli.main import warn_for_swarm_mode
  13. from compose.service import ConvergenceStrategy
  14. from tests import mock
  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. @pytest.fixture
  22. def logging_handler():
  23. stream = mock.Mock()
  24. stream.isatty.return_value = True
  25. return logging.StreamHandler(stream=stream)
  26. class TestCLIMainTestCase(object):
  27. def test_filter_containers_to_service_names(self):
  28. containers = [
  29. mock_container('web', 1),
  30. mock_container('web', 2),
  31. mock_container('db', 1),
  32. mock_container('other', 1),
  33. mock_container('another', 1),
  34. ]
  35. service_names = ['web', 'db']
  36. actual = filter_containers_to_service_names(containers, service_names)
  37. assert actual == containers[:3]
  38. def test_filter_containers_to_service_names_all(self):
  39. containers = [
  40. mock_container('web', 1),
  41. mock_container('db', 1),
  42. mock_container('other', 1),
  43. ]
  44. service_names = []
  45. actual = filter_containers_to_service_names(containers, service_names)
  46. assert actual == containers
  47. def test_warning_in_swarm_mode(self):
  48. mock_client = mock.create_autospec(docker.APIClient)
  49. mock_client.info.return_value = {'Swarm': {'LocalNodeState': 'active'}}
  50. with mock.patch('compose.cli.main.log') as fake_log:
  51. warn_for_swarm_mode(mock_client)
  52. assert fake_log.warn.call_count == 1
  53. class TestSetupConsoleHandlerTestCase(object):
  54. def test_with_tty_verbose(self, logging_handler):
  55. setup_console_handler(logging_handler, True)
  56. assert type(logging_handler.formatter) == ConsoleWarningFormatter
  57. assert '%(name)s' in logging_handler.formatter._fmt
  58. assert '%(funcName)s' in logging_handler.formatter._fmt
  59. def test_with_tty_not_verbose(self, logging_handler):
  60. setup_console_handler(logging_handler, False)
  61. assert type(logging_handler.formatter) == ConsoleWarningFormatter
  62. assert '%(name)s' not in logging_handler.formatter._fmt
  63. assert '%(funcName)s' not in logging_handler.formatter._fmt
  64. def test_with_not_a_tty(self, logging_handler):
  65. logging_handler.stream.isatty.return_value = False
  66. setup_console_handler(logging_handler, False)
  67. assert type(logging_handler.formatter) == logging.Formatter
  68. class TestConvergeStrategyFromOptsTestCase(object):
  69. def test_invalid_opts(self):
  70. options = {'--force-recreate': True, '--no-recreate': True}
  71. with pytest.raises(UserError):
  72. convergence_strategy_from_opts(options)
  73. def test_always(self):
  74. options = {'--force-recreate': True, '--no-recreate': False}
  75. assert (
  76. convergence_strategy_from_opts(options) ==
  77. ConvergenceStrategy.always
  78. )
  79. def test_never(self):
  80. options = {'--force-recreate': False, '--no-recreate': True}
  81. assert (
  82. convergence_strategy_from_opts(options) ==
  83. ConvergenceStrategy.never
  84. )
  85. def test_changed(self):
  86. options = {'--force-recreate': False, '--no-recreate': False}
  87. assert (
  88. convergence_strategy_from_opts(options) ==
  89. ConvergenceStrategy.changed
  90. )