From 439818b82463ef748b127e7f88455222e2208f70 Mon Sep 17 00:00:00 2001 From: Rodney Lab Date: Thu, 20 Feb 2025 17:28:20 +0000 Subject: [PATCH] =?UTF-8?q?test:=20=E2=98=91=EF=B8=8F=20add=20Python=20uni?= =?UTF-8?q?t=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../league-spartan-v11-latin-700.ttf | Bin 0 -> 26916 bytes subsetter_tool.py | 11 ++++- tests/test_subsetter_tool.py | 40 +++++++++++++++++- 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 fixtures/league-spartan-v11-latin/league-spartan-v11-latin-700.ttf diff --git a/fixtures/league-spartan-v11-latin/league-spartan-v11-latin-700.ttf b/fixtures/league-spartan-v11-latin/league-spartan-v11-latin-700.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4d9f4252d2a6520d3007568621f21c09bdf6095d GIT binary patch literal 26916 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 literal 0 HcmV?d00001 diff --git a/subsetter_tool.py b/subsetter_tool.py index e708c38..8f42fb4 100644 --- a/subsetter_tool.py +++ b/subsetter_tool.py @@ -48,8 +48,15 @@ def write_subset_font( fonttools_subsetter = subset.Subsetter(options) fonttools_subsetter.populate(text=text) fonttools_subsetter.subset(font) - subset.save_font(font, output_path, options) + try: + subset.save_font(font, output_path, options) + except PermissionError: + message = f"\n[ Error ] Unable to write font file `{output_path}`. Check the " + "path exists with write permissions." + eprint(message) + raise PermissionError(message) print("Wrote {} subset to {}".format(format, str(output_path))) + return str(output_path) @@ -63,6 +70,8 @@ def write_subset_font_file_for_format(font_file_path_str: str, text: str, hash: ) except FileNotFoundError: sys.exit(1) + except PermissionError: + sys.exit(1) return subset_file_path diff --git a/tests/test_subsetter_tool.py b/tests/test_subsetter_tool.py index 424bc7d..cf29054 100644 --- a/tests/test_subsetter_tool.py +++ b/tests/test_subsetter_tool.py @@ -1,4 +1,6 @@ from pathlib import Path +import os +import stat import unittest from subsetter_tool import get_subset_font_path, write_subset_font @@ -20,7 +22,7 @@ def test_get_subset_font_path_returns_expected_output_for_valid_input(self): expected = Path("league-spartan-v11-latin-600__subset_5fba6996.ttf") self.assertEqual(result, expected) - def test_write_subset_font_returns_expected_result(self): + def test_write_subset_font_returns_expected_result_for_woff2(self): # arrange input_path = Path( "./fixtures/league-spartan-v11-latin/league-spartan-v11-latin-600.woff2" @@ -36,17 +38,51 @@ def test_write_subset_font_returns_expected_result(self): expected = "league-spartan-v11-latin-600__subset_9e5cab01.woff2" self.assertEqual(result, expected) + def test_write_subset_font_returns_expected_result_for_ttf(self): + # arrange + input_path = Path( + "./fixtures/league-spartan-v11-latin/league-spartan-v11-latin-600.ttf" + ) + text = "Lorem ipsum dolor sit amet" + hash = "9e5cab01" + format = "ttf" + + # act + result = write_subset_font(input_path, text, hash, format) + + # assert + expected = "league-spartan-v11-latin-600__subset_9e5cab01.ttf" + self.assertEqual(result, expected) + def test_write_subset_font_returns_exception_when_input_path_does_not_exist(self): # arrange input_path = Path("./fixtures/does-not-exist.ttf") text = "Lorem ipsum dolor sit amet" hash = "9e5cab01" - format = "woff2" + format = "ttf" # act/assert with self.assertRaises(FileNotFoundError): write_subset_font(input_path, text, hash, format) + def test_write_subset_font_returns_exception_when_output_is_not_writable(self): + # arrange + input_path = Path( + "./fixtures/league-spartan-v11-latin/league-spartan-v11-latin-700.ttf" + ) + text = "Lorem ipsum dolor sit amet" + hash = "9e5cab01" + format = "ttf" + + output_path = Path("./league-spartan-v11-latin-700__subset_9e5cab01.ttf") + output_path.touch() + os.chmod(output_path, stat.S_IRUSR) + + # act/assert + with self.assertRaises(PermissionError): + write_subset_font(input_path, text, hash, format) + os.chmod(output_path, stat.S_IWUSR) + if __name__ == "__main__": unittest.main()