File: test_arg_parser.py

package info (click to toggle)
backblaze-b2 3.19.1-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,372 kB
  • sloc: python: 12,571; makefile: 21; sh: 12
file content (90 lines) | stat: -rw-r--r-- 3,203 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
######################################################################
#
# File: test/unit/test_arg_parser.py
#
# Copyright 2020 Backblaze Inc. All Rights Reserved.
#
# License https://www.backblaze.com/using_b2_code.html
#
######################################################################

import argparse
import sys

from b2._internal._cli.arg_parser_types import (
    parse_comma_separated_list,
    parse_millis_from_float_timestamp,
    parse_range,
)
from b2._internal.arg_parser import B2ArgumentParser
from b2._internal.console_tool import B2

from .test_base import TestBase


class TestCustomArgTypes(TestBase):
    def test_parse_comma_separated_list(self):
        self.assertEqual([''], parse_comma_separated_list(''))
        self.assertEqual(['1', '2', '3'], parse_comma_separated_list('1,2,3'))

    def test_parse_millis_from_float_timestamp(self):
        self.assertEqual(1367900664000, parse_millis_from_float_timestamp('1367900664'))
        self.assertEqual(1367900664152, parse_millis_from_float_timestamp('1367900664.152'))
        with self.assertRaises(ValueError):
            parse_millis_from_float_timestamp('!$@$%@!@$')

    def test_parse_range(self):
        self.assertEqual((1, 2), parse_range('1,2'))
        with self.assertRaises(argparse.ArgumentTypeError):
            parse_range('1')
        with self.assertRaises(argparse.ArgumentTypeError):
            parse_range('1,2,3')
        with self.assertRaises(ValueError):
            parse_range('!@#,%^&')


class TestNonUTF8TerminalSupport(TestBase):
    class ASCIIEncodedStream:
        def __init__(self, original_stream):
            self.original_stream = original_stream
            self.encoding = 'ascii'

        def write(self, data):
            if isinstance(data, str):
                data = data.encode(self.encoding, 'strict')
            self.original_stream.buffer.write(data)

        def flush(self):
            self.original_stream.flush()

    def check_help_string(self, command_class, command_name):
        help_string = command_class.__doc__

        # create a parser with a help message that is based on the command_class.__doc__ string
        parser = B2ArgumentParser(description=help_string)

        try:
            old_stdout = sys.stdout
            old_stderr = sys.stderr
            sys.stdout = TestNonUTF8TerminalSupport.ASCIIEncodedStream(sys.stdout)
            sys.stderr = TestNonUTF8TerminalSupport.ASCIIEncodedStream(sys.stderr)

            parser.print_help()

        except UnicodeEncodeError as e:
            self.fail(
                f'Failed to encode help message for command "{command_name}" on a non-UTF-8 terminal: {e}'
            )

        finally:
            # Restore original stdout and stderr
            sys.stdout = old_stdout
            sys.stderr = old_stderr

    def test_help_in_non_utf8_terminal(self):
        command_classes = dict(B2.subcommands_registry.items())
        command_classes['b2'] = B2

        for command_name, command_class in command_classes.items():
            with self.subTest(command_class=command_class, command_name=command_name):
                self.check_help_string(command_class, command_name)