summaryrefslogtreecommitdiffstats
path: root/tests/test_sources.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_sources.py')
-rw-r--r--tests/test_sources.py94
1 files changed, 94 insertions, 0 deletions
diff --git a/tests/test_sources.py b/tests/test_sources.py
new file mode 100644
index 0000000..a79cc24
--- /dev/null
+++ b/tests/test_sources.py
@@ -0,0 +1,94 @@
+import posixpath
+import zipfile
+
+import pytest
+
+from installer.records import parse_record_file
+from installer.sources import WheelFile, WheelSource
+
+
+class TestWheelSource:
+ def test_takes_two_arguments(self):
+ WheelSource("distribution", "version")
+ WheelSource(distribution="distribution", version="version")
+
+ def test_correctly_computes_properties(self):
+ source = WheelSource(distribution="distribution", version="version")
+
+ assert source.data_dir == "distribution-version.data"
+ assert source.dist_info_dir == "distribution-version.dist-info"
+
+ def test_raises_not_implemented_error(self):
+ source = WheelSource(distribution="distribution", version="version")
+
+ with pytest.raises(NotImplementedError):
+ source.dist_info_filenames
+
+ with pytest.raises(NotImplementedError):
+ source.read_dist_info("METADATA")
+
+ with pytest.raises(NotImplementedError):
+ source.get_contents()
+
+
+class TestWheelFile:
+ def test_rejects_not_okay_name(self, tmp_path):
+ # Create an empty zipfile
+ path = tmp_path / "not_a_valid_name.whl"
+ with zipfile.ZipFile(str(path), "w"):
+ pass
+
+ with pytest.raises(ValueError, match="Not a valid wheel filename: .+"):
+ with WheelFile.open(str(path)):
+ pass
+
+ def test_provides_correct_dist_info_filenames(self, fancy_wheel):
+ with WheelFile.open(fancy_wheel) as source:
+ assert sorted(source.dist_info_filenames) == [
+ "METADATA",
+ "RECORD",
+ "WHEEL",
+ "entry_points.txt",
+ "top_level.txt",
+ ]
+
+ def test_correctly_reads_from_dist_info_files(self, fancy_wheel):
+ files = {}
+ with zipfile.ZipFile(fancy_wheel) as archive:
+ for file in archive.namelist():
+ if ".dist-info" not in file:
+ continue
+ files[posixpath.basename(file)] = archive.read(file).decode("utf-8")
+
+ got_files = {}
+ with WheelFile.open(fancy_wheel) as source:
+ for file in files:
+ got_files[file] = source.read_dist_info(file)
+
+ assert got_files == files
+
+ def test_provides_correct_contents(self, fancy_wheel):
+ # Know the contents of the wheel
+ files = {}
+ with zipfile.ZipFile(fancy_wheel) as archive:
+ for file in archive.namelist():
+ if file[-1:] == "/":
+ continue
+ files[file] = archive.read(file)
+
+ expected_record_lines = (
+ files["fancy-1.0.0.dist-info/RECORD"].decode("utf-8").splitlines()
+ )
+ expected_records = list(parse_record_file(expected_record_lines))
+
+ # Check that the object's output is appropriate
+ got_records = []
+ got_files = {}
+ with WheelFile.open(fancy_wheel) as source:
+ for record_elements, stream, is_executable in source.get_contents():
+ got_records.append(record_elements)
+ got_files[record_elements[0]] = stream.read()
+ assert not is_executable
+
+ assert sorted(got_records) == sorted(expected_records)
+ assert got_files == files