test_arguments.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. create_namespace = flexmock(progress=True)
  57. check_namespace = flexmock()
  58. subparsers = {
  59. 'prune': flexmock(
  60. parse_known_args=lambda arguments: (prune_namespace, ['prune', '--progress'])
  61. ),
  62. 'create': flexmock(parse_known_args=lambda arguments: (create_namespace, [])),
  63. 'check': flexmock(parse_known_args=lambda arguments: (check_namespace, [])),
  64. 'other': flexmock(),
  65. }
  66. arguments, remaining_arguments = module.parse_subparser_arguments(('--progress'), subparsers)
  67. assert arguments == {
  68. 'prune': prune_namespace,
  69. 'create': create_namespace,
  70. 'check': check_namespace,
  71. }
  72. assert remaining_arguments == []
  73. def test_parse_subparser_arguments_passes_through_unknown_arguments_before_subparser_name():
  74. action_namespace = flexmock()
  75. subparsers = {
  76. 'action': flexmock(
  77. parse_known_args=lambda arguments: (action_namespace, ['action', '--verbosity', 'lots'])
  78. ),
  79. 'other': flexmock(),
  80. }
  81. arguments, remaining_arguments = module.parse_subparser_arguments(
  82. ('--verbosity', 'lots', 'action'), subparsers
  83. )
  84. assert arguments == {'action': action_namespace}
  85. assert remaining_arguments == ['--verbosity', 'lots']
  86. def test_parse_subparser_arguments_passes_through_unknown_arguments_after_subparser_name():
  87. action_namespace = flexmock()
  88. subparsers = {
  89. 'action': flexmock(
  90. parse_known_args=lambda arguments: (action_namespace, ['action', '--verbosity', 'lots'])
  91. ),
  92. 'other': flexmock(),
  93. }
  94. arguments, remaining_arguments = module.parse_subparser_arguments(
  95. ('action', '--verbosity', 'lots'), subparsers
  96. )
  97. assert arguments == {'action': action_namespace}
  98. assert remaining_arguments == ['--verbosity', 'lots']
  99. def test_parse_subparser_arguments_parses_borg_options_and_skips_other_subparsers():
  100. action_namespace = flexmock(options=[])
  101. subparsers = {
  102. 'borg': flexmock(parse_known_args=lambda arguments: (action_namespace, ['borg', 'list'])),
  103. 'list': flexmock(),
  104. }
  105. arguments, remaining_arguments = module.parse_subparser_arguments(('borg', 'list'), subparsers)
  106. assert arguments == {'borg': action_namespace}
  107. assert arguments['borg'].options == ['list']
  108. assert remaining_arguments == []