Merge pull request #2 from alexwlchan/more-tests
- ID
74fa294- date
2024-05-16 21:02:17+00:00- author
Alex Chan <alex@alexwlchan.net>- parents
be6fa4a,d9ca78a- message
Merge pull request #2 from alexwlchan/more-tests Add more test cases- changed files
6 files, 117 additions, 20 deletions
Changed files
.github/workflows/test.yml (496) → .github/workflows/test.yml (501)
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index d798fd7..4b4384d 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -27,4 +27,4 @@ jobs:
run: pip install -r dev_requirements.txt
- name: Run tests
- run: python3 -m pytest tests
+ run: python3 -m pytest -n 5 tests
dev_requirements.in (7) → dev_requirements.in (20)
diff --git a/dev_requirements.in b/dev_requirements.in
index e079f8a..9cda381 100644
--- a/dev_requirements.in
+++ b/dev_requirements.in
@@ -1 +1,2 @@
pytest
+pytest-xdist
dev_requirements.txt (277) → dev_requirements.txt (397)
diff --git a/dev_requirements.txt b/dev_requirements.txt
index 13d0142..8d6f16c 100644
--- a/dev_requirements.txt
+++ b/dev_requirements.txt
@@ -4,6 +4,8 @@
#
# pip-compile dev_requirements.in
#
+execnet==2.1.1
+ # via pytest-xdist
iniconfig==2.0.0
# via pytest
packaging==24.0
@@ -11,4 +13,8 @@ packaging==24.0
pluggy==1.5.0
# via pytest
pytest==8.2.0
+ # via
+ # -r dev_requirements.in
+ # pytest-xdist
+pytest-xdist==3.6.1
# via -r dev_requirements.in
save_safari_webarchive.swift (3400) → save_safari_webarchive.swift (3406)
diff --git a/save_safari_webarchive.swift b/save_safari_webarchive.swift
index 4e60955..704f91b 100755
--- a/save_safari_webarchive.swift
+++ b/save_safari_webarchive.swift
@@ -39,7 +39,7 @@ class ExitOnFailureDelegate: NSObject, WKNavigationDelegate {
didFailProvisionalNavigation: WKNavigation!,
withError error: Error
) {
- fputs("Failed to load \(self.urlString) (2): \(error.localizedDescription)\n", stderr)
+ fputs("Failed to load \(self.urlString): \(error.localizedDescription)\n", stderr)
exit(1)
}
@@ -111,7 +111,7 @@ extension WKWebView {
}
guard CommandLine.arguments.count == 3 else {
- print("Usage: \(CommandLine.arguments[0]) <URL> <OUTPUT_PATH>")
+ fputs("Usage: \(CommandLine.arguments[0]) <URL> <OUTPUT_PATH>\n", stderr)
exit(1)
}
tests/test_save_safari_webarchive.py (1129) → tests/test_save_safari_webarchive.py (3416)
diff --git a/tests/test_save_safari_webarchive.py b/tests/test_save_safari_webarchive.py
index 7d29f6e..c472a18 100755
--- a/tests/test_save_safari_webarchive.py
+++ b/tests/test_save_safari_webarchive.py
@@ -1,15 +1,25 @@
#!/usr/bin/env python3
+import os
import pathlib
+import pytest
+
from utils import save_safari_webarchive
-def test_creates_a_single_archive(tmp_path: pathlib.Path) -> None:
- out_path = tmp_path / "example.webarchive"
- assert not out_path.exists()
+@pytest.fixture
+def out_path(tmp_path: pathlib.Path) -> None:
+ """
+ Returns a temporary path where we can write a webarchive.
+
+ Any files written to this path will be cleaned up at the end of the test.
+ """
+ return tmp_path / "example.webarchive"
- result = save_safari_webarchive(["https://example.com", str(out_path)])
+
+def test_creates_a_single_archive(out_path: pathlib.Path) -> None:
+ result = save_safari_webarchive(["https://example.com", out_path])
assert result["returncode"] == 0
assert result["stdout"] is not None
@@ -17,19 +27,93 @@ def test_creates_a_single_archive(tmp_path: pathlib.Path) -> None:
assert out_path.exists()
-def test_does_not_overwrite_existing_archive(tmp_path: pathlib.Path) -> None:
- out_path = tmp_path / "example.webarchive"
+def test_does_not_overwrite_existing_archive(out_path: pathlib.Path) -> None:
out_path.write_text("This should still be here later")
- result = save_safari_webarchive(["https://example.com", str(out_path)])
+ result = save_safari_webarchive(["https://example.com", out_path])
- assert result["returncode"] == 1
- assert result["stdout"] is None
- assert result["stderr"] == (
- "Unable to save webarchive file: "
- "The file “example.webarchive” couldn’t be saved in the folder "
- "“test_does_not_overwrite_existi0” because a file with "
- "the same name already exists.\n"
- )
+ assert result == {
+ "returncode": 1,
+ "stdout": None,
+ "stderr": (
+ "Unable to save webarchive file: "
+ "The file “example.webarchive” couldn’t be saved in the folder "
+ "“test_does_not_overwrite_existi0” because a file with "
+ "the same name already exists.\n"
+ ),
+ }
assert out_path.read_text() == "This should still be here later"
+
+
+@pytest.mark.parametrize(
+ "argv",
+ [
+ pytest.param([], id="no_arguments"),
+ pytest.param(["https://example.com"], id="not_enough_arguments"),
+ pytest.param(
+ ["https://example.com", "example.webarchive", "--debug"],
+ id="too_many_arguments",
+ ),
+ ],
+)
+def test_it_fails_if_you_supply_the_wrong_arguments(argv: list[str]) -> None:
+ result = save_safari_webarchive(argv)
+
+ assert result == {
+ "returncode": 1,
+ "stdout": None,
+ "stderr": "Usage: save_safari_webarchive.swift <URL> <OUTPUT_PATH>\n",
+ }
+
+
+@pytest.mark.parametrize("status_code", ["403", "404", "410", "500"])
+def test_it_fails_if_non_200_status_code(
+ status_code: str, out_path: pathlib.Path
+) -> None:
+ url = f"https://httpstat.us/{status_code}"
+
+ result = save_safari_webarchive([url, out_path])
+
+ assert result == {
+ "returncode": 1,
+ "stdout": None,
+ "stderr": f"Failed to load {url}: got status code {status_code}\n",
+ }
+
+ assert not out_path.exists()
+
+
+def test_it_fails_if_cannot_load_domain(out_path: pathlib.Path) -> None:
+ result = save_safari_webarchive(["https://doesnotexist.tk/", out_path])
+
+ assert result == {
+ "returncode": 1,
+ "stdout": None,
+ "stderr": "Failed to load https://doesnotexist.tk/: A server with the specified hostname could not be found.\n",
+ }
+
+ assert not out_path.exists()
+
+
+# If I run this test in GitHub Actions, I get a warning to stderr but
+# the archive is saved correctly:
+#
+# CFURLCopyResourcePropertyForKey failed because it was passed a URL which
+# has no scheme
+#
+# This test passes locally; leave it for now -- I can come back to this.
+@pytest.mark.skipif(
+ os.getenv("CI") == "true",
+ reason="This test doesn’t work correctly in GitHub Actions",
+)
+def test_it_fails_if_url_is_invalid(out_path: pathlib.Path) -> None:
+ result = save_safari_webarchive([">", out_path])
+
+ assert result == {
+ "returncode": 1,
+ "stdout": None,
+ "stderr": "Unable to use > as a URL\n",
+ }
+
+ assert not out_path.exists()
tests/utils.py (665) → tests/utils.py (821)
diff --git a/tests/utils.py b/tests/utils.py
index f74ec36..b99c690 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -1,3 +1,4 @@
+import pathlib
import subprocess
import typing
@@ -8,9 +9,14 @@ class CommandOutput(typing.TypedDict):
stderr: str | None
-def save_safari_webarchive(args: list[str]) -> CommandOutput:
+def save_safari_webarchive(argv: list[str | pathlib.Path]) -> CommandOutput:
+ """
+ Run the ``save_safari_webarchive.swift`` script and return the result.
+ """
+ cmd = ["swift", "save_safari_webarchive.swift"] + [str(av) for av in argv]
+
proc = subprocess.Popen(
- ["swift", "save_safari_webarchive.swift"] + args,
+ cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)