test_arguments.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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. global_namespace = flexmock()
  5. action_namespace = flexmock(foo=True)
  6. top_level_parser = flexmock(parse_args=lambda arguments: global_namespace)
  7. subparsers = flexmock(
  8. choices={
  9. 'action': flexmock(parse_known_args=lambda arguments: (action_namespace, [])),
  10. 'other': flexmock(),
  11. }
  12. )
  13. arguments = module.parse_subparser_arguments(
  14. ('--foo', 'true', 'action'), top_level_parser, subparsers
  15. )
  16. assert arguments == {'action': action_namespace, 'global': global_namespace}
  17. def test_parse_subparser_arguments_consumes_subparser_arguments_after_subparser_name():
  18. global_namespace = flexmock()
  19. action_namespace = flexmock(foo=True)
  20. top_level_parser = flexmock(parse_args=lambda arguments: global_namespace)
  21. subparsers = flexmock(
  22. choices={
  23. 'action': flexmock(parse_known_args=lambda arguments: (action_namespace, [])),
  24. 'other': flexmock(),
  25. }
  26. )
  27. arguments = module.parse_subparser_arguments(
  28. ('action', '--foo', 'true'), top_level_parser, subparsers
  29. )
  30. assert arguments == {'action': action_namespace, 'global': global_namespace}
  31. def test_parse_subparser_arguments_consumes_global_arguments_before_subparser_name():
  32. global_namespace = flexmock(verbosity='lots')
  33. action_namespace = flexmock()
  34. top_level_parser = flexmock(parse_args=lambda arguments: global_namespace)
  35. subparsers = flexmock(
  36. choices={
  37. 'action': flexmock(
  38. parse_known_args=lambda arguments: (action_namespace, ['--verbosity', 'lots'])
  39. ),
  40. 'other': flexmock(),
  41. }
  42. )
  43. arguments = module.parse_subparser_arguments(
  44. ('--verbosity', 'lots', 'action'), top_level_parser, subparsers
  45. )
  46. assert arguments == {'action': action_namespace, 'global': global_namespace}
  47. def test_parse_subparser_arguments_consumes_global_arguments_after_subparser_name():
  48. global_namespace = flexmock(verbosity='lots')
  49. action_namespace = flexmock()
  50. top_level_parser = flexmock(parse_args=lambda arguments: global_namespace)
  51. subparsers = flexmock(
  52. choices={
  53. 'action': flexmock(
  54. parse_known_args=lambda arguments: (action_namespace, ['--verbosity', 'lots'])
  55. ),
  56. 'other': flexmock(),
  57. }
  58. )
  59. arguments = module.parse_subparser_arguments(
  60. ('action', '--verbosity', 'lots'), top_level_parser, subparsers
  61. )
  62. assert arguments == {'action': action_namespace, 'global': global_namespace}
  63. def test_parse_subparser_arguments_consumes_subparser_arguments_with_alias():
  64. global_namespace = flexmock()
  65. action_namespace = flexmock(foo=True)
  66. top_level_parser = flexmock(parse_args=lambda arguments: global_namespace)
  67. action_subparser = flexmock(parse_known_args=lambda arguments: (action_namespace, []))
  68. subparsers = flexmock(
  69. choices={
  70. 'action': action_subparser,
  71. '-a': action_subparser,
  72. 'other': flexmock(),
  73. '-o': flexmock(),
  74. }
  75. )
  76. flexmock(module).SUBPARSER_ALIASES = {'action': ['-a'], 'other': ['-o']}
  77. arguments = module.parse_subparser_arguments(
  78. ('-a', '--foo', 'true'), top_level_parser, subparsers
  79. )
  80. assert arguments == {'action': action_namespace, 'global': global_namespace}
  81. def test_parse_subparser_arguments_consumes_multiple_subparser_arguments():
  82. global_namespace = flexmock()
  83. action_namespace = flexmock(foo=True)
  84. other_namespace = flexmock(bar=3)
  85. top_level_parser = flexmock(parse_args=lambda arguments: global_namespace)
  86. subparsers = flexmock(
  87. choices={
  88. 'action': flexmock(
  89. parse_known_args=lambda arguments: (action_namespace, ['--bar', '3'])
  90. ),
  91. 'other': flexmock(parse_known_args=lambda arguments: (other_namespace, [])),
  92. }
  93. )
  94. arguments = module.parse_subparser_arguments(
  95. ('action', '--foo', 'true', 'other', '--bar', '3'), top_level_parser, subparsers
  96. )
  97. assert arguments == {
  98. 'action': action_namespace,
  99. 'other': other_namespace,
  100. 'global': global_namespace,
  101. }
  102. def test_parse_subparser_arguments_applies_default_subparsers():
  103. global_namespace = flexmock()
  104. prune_namespace = flexmock()
  105. create_namespace = flexmock(progress=True)
  106. check_namespace = flexmock()
  107. top_level_parser = flexmock(parse_args=lambda arguments: global_namespace)
  108. subparsers = flexmock(
  109. choices={
  110. 'prune': flexmock(parse_known_args=lambda arguments: (prune_namespace, ['--progress'])),
  111. 'create': flexmock(parse_known_args=lambda arguments: (create_namespace, [])),
  112. 'check': flexmock(parse_known_args=lambda arguments: (check_namespace, [])),
  113. 'other': flexmock(),
  114. }
  115. )
  116. arguments = module.parse_subparser_arguments(('--progress'), top_level_parser, subparsers)
  117. assert arguments == {
  118. 'prune': prune_namespace,
  119. 'create': create_namespace,
  120. 'check': check_namespace,
  121. 'global': global_namespace,
  122. }
  123. def test_parse_subparser_arguments_with_help_does_not_apply_default_subparsers():
  124. global_namespace = flexmock(verbosity='lots')
  125. action_namespace = flexmock()
  126. top_level_parser = flexmock(parse_args=lambda arguments: global_namespace)
  127. subparsers = flexmock(
  128. choices={
  129. 'action': flexmock(
  130. parse_known_args=lambda arguments: (action_namespace, ['--verbosity', 'lots'])
  131. ),
  132. 'other': flexmock(),
  133. }
  134. )
  135. arguments = module.parse_subparser_arguments(
  136. ('--verbosity', 'lots', '--help'), top_level_parser, subparsers
  137. )
  138. assert arguments == {'global': global_namespace}