test_arguments.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import collections
  2. import pytest
  3. from flexmock import flexmock
  4. from borgmatic.commands import arguments as module
  5. def test_parse_subparser_arguments_consumes_subparser_arguments_before_subparser_name():
  6. action_namespace = flexmock(foo=True)
  7. subparsers = {
  8. 'action': flexmock(parse_known_args=lambda arguments: (action_namespace, ['action'])),
  9. 'other': flexmock(),
  10. }
  11. arguments, remaining_arguments = module.parse_subparser_arguments(
  12. ('--foo', 'true', 'action'), subparsers
  13. )
  14. assert arguments == {'action': action_namespace}
  15. assert remaining_arguments == []
  16. def test_parse_subparser_arguments_consumes_subparser_arguments_after_subparser_name():
  17. action_namespace = flexmock(foo=True)
  18. subparsers = {
  19. 'action': flexmock(parse_known_args=lambda arguments: (action_namespace, ['action'])),
  20. 'other': flexmock(),
  21. }
  22. arguments, remaining_arguments = module.parse_subparser_arguments(
  23. ('action', '--foo', 'true'), subparsers
  24. )
  25. assert arguments == {'action': action_namespace}
  26. assert remaining_arguments == []
  27. def test_parse_subparser_arguments_consumes_subparser_arguments_with_alias():
  28. action_namespace = flexmock(foo=True)
  29. action_subparser = flexmock(parse_known_args=lambda arguments: (action_namespace, ['action']))
  30. subparsers = {
  31. 'action': action_subparser,
  32. '-a': action_subparser,
  33. 'other': flexmock(),
  34. '-o': flexmock(),
  35. }
  36. flexmock(module).SUBPARSER_ALIASES = {'action': ['-a'], 'other': ['-o']}
  37. arguments, remaining_arguments = module.parse_subparser_arguments(
  38. ('-a', '--foo', 'true'), subparsers
  39. )
  40. assert arguments == {'action': action_namespace}
  41. assert remaining_arguments == []
  42. def test_parse_subparser_arguments_consumes_multiple_subparser_arguments():
  43. action_namespace = flexmock(foo=True)
  44. other_namespace = flexmock(bar=3)
  45. subparsers = {
  46. 'action': flexmock(
  47. parse_known_args=lambda arguments: (action_namespace, ['action', '--bar', '3'])
  48. ),
  49. 'other': flexmock(parse_known_args=lambda arguments: (other_namespace, [])),
  50. }
  51. arguments, remaining_arguments = module.parse_subparser_arguments(
  52. ('action', '--foo', 'true', 'other', '--bar', '3'), subparsers
  53. )
  54. assert arguments == {'action': action_namespace, 'other': other_namespace}
  55. assert remaining_arguments == []
  56. def test_parse_subparser_arguments_respects_command_line_action_ordering():
  57. other_namespace = flexmock()
  58. action_namespace = flexmock(foo=True)
  59. subparsers = {
  60. 'action': flexmock(
  61. parse_known_args=lambda arguments: (action_namespace, ['action', '--foo', 'true'])
  62. ),
  63. 'other': flexmock(parse_known_args=lambda arguments: (other_namespace, ['other'])),
  64. }
  65. arguments, remaining_arguments = module.parse_subparser_arguments(
  66. ('other', '--foo', 'true', 'action'), subparsers
  67. )
  68. assert arguments == collections.OrderedDict(
  69. [('other', other_namespace), ('action', action_namespace)]
  70. )
  71. assert remaining_arguments == []
  72. def test_parse_subparser_arguments_applies_default_subparsers():
  73. prune_namespace = flexmock()
  74. compact_namespace = flexmock()
  75. create_namespace = flexmock(progress=True)
  76. check_namespace = flexmock()
  77. subparsers = {
  78. 'prune': flexmock(
  79. parse_known_args=lambda arguments: (prune_namespace, ['prune', '--progress'])
  80. ),
  81. 'compact': flexmock(parse_known_args=lambda arguments: (compact_namespace, [])),
  82. 'create': flexmock(parse_known_args=lambda arguments: (create_namespace, [])),
  83. 'check': flexmock(parse_known_args=lambda arguments: (check_namespace, [])),
  84. 'other': flexmock(),
  85. }
  86. arguments, remaining_arguments = module.parse_subparser_arguments(('--progress'), subparsers)
  87. assert arguments == {
  88. 'prune': prune_namespace,
  89. 'compact': compact_namespace,
  90. 'create': create_namespace,
  91. 'check': check_namespace,
  92. }
  93. assert remaining_arguments == []
  94. def test_parse_subparser_arguments_passes_through_unknown_arguments_before_subparser_name():
  95. action_namespace = flexmock()
  96. subparsers = {
  97. 'action': flexmock(
  98. parse_known_args=lambda arguments: (action_namespace, ['action', '--verbosity', 'lots'])
  99. ),
  100. 'other': flexmock(),
  101. }
  102. arguments, remaining_arguments = module.parse_subparser_arguments(
  103. ('--verbosity', 'lots', 'action'), subparsers
  104. )
  105. assert arguments == {'action': action_namespace}
  106. assert remaining_arguments == ['--verbosity', 'lots']
  107. def test_parse_subparser_arguments_passes_through_unknown_arguments_after_subparser_name():
  108. action_namespace = flexmock()
  109. subparsers = {
  110. 'action': flexmock(
  111. parse_known_args=lambda arguments: (action_namespace, ['action', '--verbosity', 'lots'])
  112. ),
  113. 'other': flexmock(),
  114. }
  115. arguments, remaining_arguments = module.parse_subparser_arguments(
  116. ('action', '--verbosity', 'lots'), subparsers
  117. )
  118. assert arguments == {'action': action_namespace}
  119. assert remaining_arguments == ['--verbosity', 'lots']
  120. def test_parse_subparser_arguments_parses_borg_options_and_skips_other_subparsers():
  121. action_namespace = flexmock(options=[])
  122. subparsers = {
  123. 'borg': flexmock(parse_known_args=lambda arguments: (action_namespace, ['borg', 'list'])),
  124. 'list': flexmock(),
  125. }
  126. arguments, remaining_arguments = module.parse_subparser_arguments(('borg', 'list'), subparsers)
  127. assert arguments == {'borg': action_namespace}
  128. assert arguments['borg'].options == ['list']
  129. assert remaining_arguments == []
  130. def test_parse_subparser_arguments_raises_error_when_no_subparser_is_specified():
  131. action_namespace = flexmock(options=[])
  132. subparsers = {
  133. 'config': flexmock(parse_known_args=lambda arguments: (action_namespace, ['config'])),
  134. }
  135. with pytest.raises(ValueError):
  136. module.parse_subparser_arguments(('config',), subparsers)