-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathtest_scanner.py
More file actions
100 lines (78 loc) · 3.17 KB
/
test_scanner.py
File metadata and controls
100 lines (78 loc) · 3.17 KB
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
from __future__ import annotations
import json
import shutil
import subprocess
import sys
import tempfile
import unittest
from pathlib import Path
from codescan.report import render_report
from codescan.scanner import scan_project
FIXTURE = Path(__file__).parent / "fixtures" / "SampleApp"
class ScannerTests(unittest.TestCase):
def test_finds_unused_imageset_and_keeps_referenced_asset(self) -> None:
result = scan_project(FIXTURE)
asset_names = {asset.name for asset in result.assets}
unused_names = {asset.name for asset in result.unused_assets}
self.assertIn("UsedIcon", asset_names)
self.assertIn("UnusedIcon", asset_names)
self.assertNotIn("UsedIcon", unused_names)
self.assertIn("UnusedIcon", unused_names)
def test_protects_app_icons(self) -> None:
result = scan_project(FIXTURE)
protected_names = {asset.name for asset in result.protected_assets}
unused_names = {asset.name for asset in result.unused_assets}
self.assertIn("AppIcon", protected_names)
self.assertNotIn("AppIcon", unused_names)
def test_json_report_is_machine_readable(self) -> None:
result = scan_project(FIXTURE)
payload = json.loads(render_report(result, "json"))
self.assertEqual(payload["summary"]["probably_unused_assets"], 1)
self.assertEqual(payload["unused_assets"][0]["name"], "UnusedIcon")
def test_cli_reports_markdown(self) -> None:
process = subprocess.run(
[
sys.executable,
"-m",
"codescan",
str(FIXTURE),
"--format",
"markdown",
],
check=True,
capture_output=True,
text=True,
)
self.assertIn("UnusedIcon", process.stdout)
self.assertIn("Probably Unused Assets", process.stdout)
def test_delete_requires_confirmation(self) -> None:
process = subprocess.run(
[sys.executable, "-m", "codescan", str(FIXTURE), "--delete"],
capture_output=True,
text=True,
)
self.assertEqual(process.returncode, 2)
self.assertIn("--delete requires --confirm", process.stderr)
def test_confirmed_delete_removes_unused_asset_only(self) -> None:
with tempfile.TemporaryDirectory() as temp_dir:
project = Path(temp_dir) / "SampleApp"
shutil.copytree(FIXTURE, project)
process = subprocess.run(
[
sys.executable,
"-m",
"codescan",
str(project),
"--delete",
"--confirm",
],
check=True,
capture_output=True,
text=True,
)
self.assertIn("Deleted 1", process.stderr)
self.assertFalse((project / "Assets.xcassets" / "UnusedIcon.imageset").exists())
self.assertTrue((project / "Assets.xcassets" / "UsedIcon.imageset").exists())
self.assertTrue((project / "Assets.xcassets" / "AppIcon.appiconset").exists())
if __name__ == "__main__":
unittest.main()