You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.5 KiB

3 years ago
  1. import unittest
  2. from argparse import ArgumentParser
  3. from typing import Dict
  4. from unittest.mock import MagicMock
  5. from python_bindings.dynamics import patch_argument, monkey_patch_for_form_validation
  6. class TestDynamicUpdates(unittest.TestCase):
  7. def tearDown(self):
  8. """
  9. Undoes the monkey patching after every tests
  10. """
  11. if hasattr(ArgumentParser, 'original_parse_args'):
  12. ArgumentParser.parse_args = ArgumentParser.original_parse_args
  13. def test_patch_argument(self):
  14. """
  15. Asserting that regardless of parser complexity, we attach our
  16. new argument at every level.
  17. """
  18. parser = ArgumentParser()
  19. subparsers = parser.add_subparsers()
  20. # multiple subparsers
  21. a = subparsers.add_parser('a')
  22. b = subparsers.add_parser('b')
  23. a.add_argument('--level-1')
  24. b.add_argument('--level-1')
  25. # deeply nested subparsers
  26. a_subparsers = a.add_subparsers()
  27. b_subparsers = b.add_subparsers()
  28. # nested args:
  29. a__nested = a_subparsers.add_parser('a1')
  30. b__nested = b_subparsers.add_parser('b1')
  31. a__nested.add_argument('--level-2')
  32. b__nested.add_argument('--level-2')
  33. # sanity check / showing the parser behavior
  34. # we've got two levels of parser nesting, each level
  35. # has some options available.
  36. mock = MagicMock()
  37. ArgumentParser.error = mock
  38. assert parser.parse_args('a --level-1 some-value'.split())
  39. assert parser.parse_args('b --level-1 some-value'.split())
  40. assert parser.parse_args('a a1 --level-2 some-value'.split())
  41. assert parser.parse_args('b b1 --level-2 some-value'.split())
  42. assert not mock.called
  43. # if we try passing an arbitrary unknown flag we explode
  44. # patching over the `error` method which usually sys.exit's
  45. # for any errors.
  46. parser.parse_args('a --level-1 some-value --some-flag'.split())
  47. assert mock.called
  48. patch_argument(parser, '--some-flag', action='store_true')
  49. mock.reset_mock()
  50. # now ever call combination accepts the flag we added
  51. assert parser.parse_args('--some-flag'.split())
  52. assert parser.parse_args('a --level-1 some-value --some-flag'.split())
  53. assert parser.parse_args('b --level-1 some-value --some-flag'.split())
  54. assert parser.parse_args('a a1 --level-2 some-value --some-flag'.split())
  55. assert parser.parse_args('b b1 --level-2 some-value --some-flag'.split())
  56. assert not mock.called