main_test.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. from __future__ import absolute_import
  2. from compose import container
  3. from compose.cli.errors import UserError
  4. from compose.cli.log_printer import LogPrinter
  5. from compose.cli.main import attach_to_logs
  6. from compose.cli.main import build_log_printer
  7. from compose.cli.main import convergence_strategy_from_opts
  8. from compose.project import Project
  9. from compose.service import ConvergenceStrategy
  10. from tests import mock
  11. from tests import unittest
  12. def mock_container(service, number):
  13. return mock.create_autospec(
  14. container.Container,
  15. service=service,
  16. number=number,
  17. name_without_project='{0}_{1}'.format(service, number))
  18. class CLIMainTestCase(unittest.TestCase):
  19. def test_build_log_printer(self):
  20. containers = [
  21. mock_container('web', 1),
  22. mock_container('web', 2),
  23. mock_container('db', 1),
  24. mock_container('other', 1),
  25. mock_container('another', 1),
  26. ]
  27. service_names = ['web', 'db']
  28. log_printer = build_log_printer(containers, service_names, True)
  29. self.assertEqual(log_printer.containers, containers[:3])
  30. def test_build_log_printer_all_services(self):
  31. containers = [
  32. mock_container('web', 1),
  33. mock_container('db', 1),
  34. mock_container('other', 1),
  35. ]
  36. service_names = []
  37. log_printer = build_log_printer(containers, service_names, True)
  38. self.assertEqual(log_printer.containers, containers)
  39. def test_attach_to_logs(self):
  40. project = mock.create_autospec(Project)
  41. log_printer = mock.create_autospec(LogPrinter, containers=[])
  42. service_names = ['web', 'db']
  43. timeout = 12
  44. with mock.patch('compose.cli.main.signal', autospec=True) as mock_signal:
  45. attach_to_logs(project, log_printer, service_names, timeout)
  46. mock_signal.signal.assert_called_once_with(mock_signal.SIGINT, mock.ANY)
  47. log_printer.run.assert_called_once_with()
  48. project.stop.assert_called_once_with(
  49. service_names=service_names,
  50. timeout=timeout)
  51. class ConvergeStrategyFromOptsTestCase(unittest.TestCase):
  52. def test_invalid_opts(self):
  53. options = {'--force-recreate': True, '--no-recreate': True}
  54. with self.assertRaises(UserError):
  55. convergence_strategy_from_opts(options)
  56. def test_always(self):
  57. options = {'--force-recreate': True, '--no-recreate': False}
  58. self.assertEqual(
  59. convergence_strategy_from_opts(options),
  60. ConvergenceStrategy.always
  61. )
  62. def test_never(self):
  63. options = {'--force-recreate': False, '--no-recreate': True}
  64. self.assertEqual(
  65. convergence_strategy_from_opts(options),
  66. ConvergenceStrategy.never
  67. )
  68. def test_changed(self):
  69. options = {'--force-recreate': False, '--no-recreate': False}
  70. self.assertEqual(
  71. convergence_strategy_from_opts(options),
  72. ConvergenceStrategy.changed
  73. )