File: b64_test.py

package info (click to toggle)
python-josepy 2.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 484 kB
  • sloc: python: 2,534; makefile: 27
file content (85 lines) | stat: -rw-r--r-- 2,559 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
"""Tests for josepy.b64."""

import sys
from typing import Union

import pytest

# https://en.wikipedia.org/wiki/Base64#Examples
B64_PADDING_EXAMPLES = {
    b"any carnal pleasure.": (b"YW55IGNhcm5hbCBwbGVhc3VyZS4", b"="),
    b"any carnal pleasure": (b"YW55IGNhcm5hbCBwbGVhc3VyZQ", b"=="),
    b"any carnal pleasur": (b"YW55IGNhcm5hbCBwbGVhc3Vy", b""),
    b"any carnal pleasu": (b"YW55IGNhcm5hbCBwbGVhc3U", b"="),
    b"any carnal pleas": (b"YW55IGNhcm5hbCBwbGVhcw", b"=="),
}


B64_URL_UNSAFE_EXAMPLES = {
    bytes((251, 239)): b"--8",
    bytes((255,)) * 2: b"__8",
}


class B64EncodeTest:
    """Tests for josepy.b64.b64encode."""

    @classmethod
    def _call(cls, data: bytes) -> bytes:
        from josepy.b64 import b64encode

        return b64encode(data)

    def test_empty(self) -> None:
        assert self._call(b"") == b""

    def test_unsafe_url(self) -> None:
        for text, b64 in B64_URL_UNSAFE_EXAMPLES.items():
            assert self._call(text) == b64

    def test_different_paddings(self) -> None:
        for text, (b64, _) in B64_PADDING_EXAMPLES.items():
            assert self._call(text) == b64

    def test_unicode_fails_with_type_error(self) -> None:
        with pytest.raises(TypeError):
            # We're purposefully testing with the incorrect type here.
            self._call("some unicode")  # type: ignore


class B64DecodeTest:
    """Tests for josepy.b64.b64decode."""

    @classmethod
    def _call(cls, data: Union[bytes, str]) -> bytes:
        from josepy.b64 import b64decode

        return b64decode(data)

    def test_unsafe_url(self) -> None:
        for text, b64 in B64_URL_UNSAFE_EXAMPLES.items():
            assert self._call(b64) == text

    def test_input_without_padding(self) -> None:
        for text, (b64, _) in B64_PADDING_EXAMPLES.items():
            assert self._call(b64) == text

    def test_input_with_padding(self) -> None:
        for text, (b64, pad) in B64_PADDING_EXAMPLES.items():
            assert self._call(b64 + pad) == text

    def test_unicode_with_ascii(self) -> None:
        assert self._call("YQ") == b"a"

    def test_non_ascii_unicode_fails(self) -> None:
        with pytest.raises(ValueError):
            self._call("\u0105")

    def test_type_error_no_unicode_or_bytes(self) -> None:
        with pytest.raises(TypeError):
            # We're purposefully testing with the incorrect type here.
            self._call(object())  # type: ignore


if __name__ == "__main__":
    sys.exit(pytest.main(sys.argv[1:] + [__file__]))  # pragma: no cover