test_arguments.py 5.6 KB

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