File: test_python.py

package info (click to toggle)
python-coverage 7.8.2%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,188 kB
  • sloc: python: 31,123; ansic: 1,184; javascript: 773; makefile: 304; sh: 107; xml: 48
file content (86 lines) | stat: -rw-r--r-- 2,863 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
# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt

"""Tests of coverage/python.py"""

from __future__ import annotations

import pathlib
import sys

import pytest

from coverage import env
from coverage.python import get_zip_bytes, source_for_file

from tests.coveragetest import CoverageTest
from tests.helpers import os_sep


class GetZipBytesTest(CoverageTest):
    """Tests of `get_zip_bytes`."""

    run_in_temp_dir = False

    @pytest.mark.parametrize(
        "encoding",
        ["utf-8", "gb2312", "hebrew", "shift_jis", "cp1252"],
    )
    def test_get_encoded_zip_files(self, encoding: str) -> None:
        # See igor.py, do_zipmods, for the text of these files.
        zip_file = "tests/zipmods.zip"
        sys.path.append(zip_file)       # So we can import the files.
        filename = zip_file + "/encoded_" + encoding + ".py"
        filename = os_sep(filename)
        zip_data = get_zip_bytes(filename)
        assert zip_data is not None
        zip_text = zip_data.decode(encoding)
        assert 'All OK' in zip_text
        # Run the code to see that we really got it encoded properly.
        mod = __import__("encoded_"+encoding)
        assert mod.encoding == encoding


def test_source_for_file(tmp_path: pathlib.Path) -> None:
    src = str(tmp_path / "a.py")
    assert source_for_file(src) == src
    assert source_for_file(src + 'c') == src
    assert source_for_file(src + 'o') == src
    unknown = src + 'FOO'
    assert source_for_file(unknown) == unknown


@pytest.mark.skipif(not env.WINDOWS, reason="not windows")
def test_source_for_file_windows(tmp_path: pathlib.Path) -> None:
    a_py = tmp_path / "a.py"
    src = str(a_py)

    # On windows if a pyw exists, it is an acceptable source
    path_windows = tmp_path / "a.pyw"
    path_windows.write_text("", encoding="utf-8")
    assert str(path_windows) == source_for_file(src + 'c')

    # If both pyw and py exist, py is preferred
    a_py.write_text("", encoding="utf-8")
    assert source_for_file(src + 'c') == src


class RunpyTest(CoverageTest):
    """Tests using runpy."""

    @pytest.mark.parametrize("convert_to", ["str", "Path"])
    def test_runpy_path(self, convert_to: str) -> None:
        # Ensure runpy.run_path(path) works when path is pathlib.Path or str.
        #
        # runpy.run_path(pathlib.Path(...)) causes __file__ to be a Path,
        # which may make source_for_file() stumble (#1819) with:
        #
        #    AttributeError: 'PosixPath' object has no attribute 'endswith'

        self.check_coverage(f"""\
            import runpy
            from pathlib import Path
            pyfile = Path('script.py')
            pyfile.write_text('', encoding='utf-8')
            runpy.run_path({convert_to}(pyfile))
        """)