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
|
from pathlib import Path
from unittest.mock import MagicMock
import pytest
from syrupy.constants import PYTEST_NODE_SEP
from syrupy.location import PyTestLocation
def mock_pytest_item(node_id: str, method_name: str) -> "pytest.Item":
mock_node = MagicMock(spec=pytest.Item)
mock_node.nodeid = node_id
[filepath, *_, nodename] = node_id.split(PYTEST_NODE_SEP)
mock_node.name = nodename
mock_node.path = Path(filepath)
mock_node.obj = MagicMock()
mock_node.obj.__module__ = Path(filepath).stem
mock_node.obj.__name__ = method_name
return mock_node
@pytest.mark.parametrize(
"node_id, method_name, expected_filename, expected_classname, expected_snapshotname",
(
(
"/tests/module/test_file.py::TestClass::method_name",
"method_name",
"test_file",
"TestClass",
"TestClass.method_name",
),
(
"/tests/module/test_file.py::TestClass::method_name[1]",
"method_name",
"test_file",
"TestClass",
"TestClass.method_name[1]",
),
(
"/tests/module/nest/test_file.py::TestClass::TestSubClass::method_name",
"method_name",
"test_file",
"TestClass.TestSubClass",
"TestClass.TestSubClass.method_name",
),
),
)
def test_location_properties(
node_id,
method_name,
expected_filename,
expected_classname,
expected_snapshotname,
):
location = PyTestLocation(mock_pytest_item(node_id, method_name))
assert location.classname == expected_classname
assert location.basename == expected_filename
assert location.snapshot_name == expected_snapshotname
@pytest.mark.parametrize(
"node_id, method_name,"
"expected_location_matches, expected_location_misses,"
"expected_snapshot_matches, expected_snapshot_misses",
(
(
"/tests/module/test_file.py::TestClass::method_name",
"method_name",
("test_file.snap", "__snapshots__/test_file", "test_file/1.snap"),
(
"test.snap",
"__others__/test/file.snap",
"test_file_extra.snap",
"__snapshots__/test_file_extra",
"test_file_extra/1.snap",
"test_file/extra/1.snap",
"__snapshots__/test_file/extra/even/more/1.snap",
),
(
"TestClass.method_name",
"TestClass.method_name[1]",
"TestClass.method_name.1",
),
("method_name", "TestClass.method_names"),
),
(
"/tests/module/test_file.py::TestClass::method_name[1]",
"method_name",
(
"test_file.snap",
"__snapshots__/test_file",
"test_file/TestClass.method_name[1].snap",
"test_file/TestClass.method_name[1].1.snap",
"test_file/TestClass.method_name[1][1].snap",
),
(
"test.snap",
"__others__/test/file.snap",
"test_file_extra.snap",
"__snapshots__/test_file_extra",
"test_file_extra/1.snap",
"test_file/extra/1.snap",
"__snapshots__/test_file/extra/even/more/1.snap",
"test_file/TestClass.method_name[1]xyz.snap",
"test_file/TestClass.method_name[2].snap",
),
(
"TestClass.method_name",
"TestClass.method_name[1]",
"TestClass.method_name.1",
"TestClass.method_name[1][1]",
"TestClass.method_name[1].1",
),
("method_name", "TestClass.method_names"),
),
),
)
def test_location_matching(
node_id,
method_name,
expected_location_matches,
expected_location_misses,
expected_snapshot_matches,
expected_snapshot_misses,
):
location = PyTestLocation(mock_pytest_item(node_id, method_name))
for location_match in expected_location_matches:
assert location.matches_snapshot_location(location_match)
for location_miss in expected_location_misses:
assert not location.matches_snapshot_location(location_miss)
for snapshot_match in expected_snapshot_matches:
assert location.matches_snapshot_name(snapshot_match)
for snapshot_miss in expected_snapshot_misses:
assert not location.matches_snapshot_name(snapshot_miss)
|