test_arguments.py 4.9 KB

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