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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
|
import os
import platform
import subprocess
from contextlib import suppress
from pathlib import Path
import pytest
from briefcase.exceptions import BriefcaseCommandError
from .conftest import DummyCommand
@pytest.mark.skipif(platform.system() != "Windows", reason="Windows specific tests")
def test_path_is_realpath(tmp_path):
"""Briefcase's data path matches its realpath.
For the Windows Store Python, filesystem interaction with `%LOCALAPPDATA%` can be
redirected to a sandboxed location. However, `os.path.realpath()` will reveal such a
redirection. This test ensures that Briefcase bypasses the sandboxing.
"""
data_path = Path(os.environ["LOCALAPPDATA"]) / "realpathbase"
try:
command = DummyCommand(data_path=data_path)
assert command.data_path == Path(os.path.realpath(data_path))
finally:
with suppress(FileNotFoundError):
os.rmdir(data_path)
def test_data_path_creation_failure(tmp_path, monkeypatch):
"""An error is raised if the data path cannot be created."""
def raise_calledprpcesserror(*a, **kw):
raise subprocess.CalledProcessError(returncode=1, cmd=["mkdir", str(data_path)])
# On Linux and macOS, use /etc/ to raise an OSError
data_path = Path("/etc/mydatadir")
# Patch run() since it's apparently quite difficult to find a
# location in Windows that is guaranteed to throw an error...
monkeypatch.setattr(subprocess, "run", raise_calledprpcesserror)
with pytest.raises(
BriefcaseCommandError,
match=r"Failed to create the Briefcase directory to store tools and support files:",
):
DummyCommand(data_path=data_path)
def test_space_in_path(tmp_path):
"""The briefcase data path cannot contain spaces."""
with pytest.raises(
BriefcaseCommandError,
match=r"contains spaces. This will cause problems with some tools",
):
DummyCommand(base_path=tmp_path / "base", data_path=tmp_path / "somewhere bad")
def test_empty_custom_path(monkeypatch, tmp_path):
"""If the environment-specified BRIEFCASE_HOME is defined, but empty, an error is
raised."""
monkeypatch.setenv("BRIEFCASE_HOME", "")
with pytest.raises(
BriefcaseCommandError,
match=r"The path specified by BRIEFCASE_HOME does not exist.",
):
DummyCommand(base_path=tmp_path / "base")
def test_custom_path_does_not_exist(monkeypatch, tmp_path):
"""If the environment-specified BRIEFCASE_HOME doesn't exist, an error is raised."""
monkeypatch.setenv("BRIEFCASE_HOME", str(tmp_path / "custom"))
with pytest.raises(
BriefcaseCommandError,
match=r"The path specified by BRIEFCASE_HOME does not exist.",
):
DummyCommand(base_path=tmp_path / "base")
def templated_path_test(
monkeypatch,
tmp_path,
data_path,
environ_path,
expected_data_path,
):
if environ_path:
monkeypatch.setenv("BRIEFCASE_HOME", environ_path.format(tmp_path=tmp_path))
Path(environ_path.format(tmp_path=tmp_path)).mkdir(parents=True)
else:
monkeypatch.delenv("BRIEFCASE_HOME", raising=False)
command = DummyCommand(
base_path=tmp_path / "base",
data_path=data_path.format(tmp_path=tmp_path) if data_path else None,
)
assert command.base_path == tmp_path / "base"
assert command.data_path.exists()
assert command.data_path == Path(
os.path.expanduser(expected_data_path.format(tmp_path=tmp_path))
)
@pytest.mark.skipif(platform.system() != "Darwin", reason="macOS specific tests")
@pytest.mark.parametrize(
"data_path, environ_path, expected_data_path",
[
( # All default values
None,
None,
"~/Library/Caches/org.beeware.briefcase",
),
( # Environment variable for the data home
None,
"{tmp_path}custom/briefcase/path",
"{tmp_path}custom/briefcase/path",
),
( # Explicit paths
"{tmp_path}path/to/data",
None,
"{tmp_path}path/to/data",
),
( # Explicit paths and an environment variable present
"{tmp_path}path/to/data",
"{tmp_path}custom/briefcase/path",
"{tmp_path}path/to/data",
),
],
)
def test_macOS_paths(
monkeypatch,
tmp_path,
data_path,
environ_path,
expected_data_path,
):
templated_path_test(
monkeypatch,
tmp_path,
data_path,
environ_path,
expected_data_path,
)
@pytest.mark.skipif(platform.system() != "Windows", reason="Windows specific tests")
@pytest.mark.parametrize(
"data_path, environ_path, expected_data_path",
[
( # All default values
None,
None,
"~/AppData/Local/BeeWare/briefcase/Cache",
),
( # Environment variable for the data home
None,
"{tmp_path}custom\\briefcase\\path",
"{tmp_path}custom\\briefcase\\path",
),
( # Explicit paths
"{tmp_path}path\\to\\data",
None,
"{tmp_path}path\\to\\data",
),
( # Explicit paths and an environment variable present
"{tmp_path}path\\to\\data",
"{tmp_path}\\briefcase\\path",
"{tmp_path}path\\to\\data",
),
],
)
def test_windows_paths(
monkeypatch,
tmp_path,
data_path,
environ_path,
expected_data_path,
):
templated_path_test(
monkeypatch,
tmp_path,
data_path,
environ_path,
expected_data_path,
)
@pytest.mark.skipif(platform.system() != "Linux", reason="Linux specific tests")
@pytest.mark.parametrize(
"data_path, environ_path, expected_data_path",
[
( # All default values
None,
None,
"~/.cache/briefcase",
),
( # Environment variable for the data home
None,
"{tmp_path}custom/briefcase/path",
"{tmp_path}custom/briefcase/path",
),
( # Explicit paths
"{tmp_path}path/to/data",
None,
"{tmp_path}path/to/data",
),
( # Explicit paths and an environment variable present
"{tmp_path}path/to/data",
"{tmp_path}custom/briefcase/path",
"{tmp_path}path/to/data",
),
],
)
def test_linux_paths(
monkeypatch,
tmp_path,
data_path,
environ_path,
expected_data_path,
):
templated_path_test(
monkeypatch,
tmp_path,
data_path,
environ_path,
expected_data_path,
)
|