# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. import unittest from io import StringIO from unittest.mock import patch import catalog import mozunit DIST_XML_DIRECT_TITLE = b""" Command Line Tools for Xcode """ DIST_XML_LOCALIZED_TITLE = b""" "TOOL_TITLE" = "Localized SDK Title"; TOOL_TITLE """ PRODUCT_INFO_XML = b""" CLTools_Executables.pkg CLTools_SDK.pkg """ class TestShowProducts(unittest.TestCase): SERVER_METADATA = { "localization": {"English": {"title": "Command Line Tools"}}, "CFBundleShortVersionString": "14.2", } def _make_product_with_server_metadata(self, metadata_url_fragment="MOS_SDK"): return { "001-11111": { "ServerMetadataURL": "http://example.com/meta.plist", "Packages": [ { "MetadataURL": f"http://example.com/{metadata_url_fragment}/meta.plist" } ], } } def test_server_metadata_url_prints_key_title_version(self): products = self._make_product_with_server_metadata() with patch("catalog.get_plist_at", return_value=self.SERVER_METADATA): with patch("sys.stdout", new_callable=StringIO) as mock_out: catalog.show_products(products) self.assertEqual( mock_out.getvalue().strip(), "001-11111 Command Line Tools 14.2" ) def test_filter_matches_package_metadata_url(self): products = self._make_product_with_server_metadata("MOS_SDK") with patch("catalog.get_plist_at", return_value=self.SERVER_METADATA): with patch("sys.stdout", new_callable=StringIO) as mock_out: catalog.show_products(products, filter="MOS_SDK") self.assertEqual( mock_out.getvalue().strip(), "001-11111 Command Line Tools 14.2" ) def test_filter_excludes_non_matching_products(self): products = self._make_product_with_server_metadata("OTHER") with patch("catalog.get_plist_at", return_value=self.SERVER_METADATA): with patch("sys.stdout", new_callable=StringIO) as mock_out: catalog.show_products(products, filter="MOS_SDK") self.assertEqual(mock_out.getvalue(), "") def test_filter_excludes_product_with_no_packages(self): products = { "001-22222": { "ServerMetadataURL": "http://example.com/meta.plist", "Packages": [], } } with patch("catalog.get_plist_at", return_value=self.SERVER_METADATA): with patch("sys.stdout", new_callable=StringIO) as mock_out: catalog.show_products(products, filter="MOS_SDK") self.assertEqual(mock_out.getvalue(), "") def test_distributions_direct_title(self): products = { "002-33333": { "Distributions": {"English": "http://example.com/dist.xml"}, "Packages": [], } } with patch("catalog.get_content_at", return_value=DIST_XML_DIRECT_TITLE): with patch("sys.stdout", new_callable=StringIO) as mock_out: catalog.show_products(products) self.assertEqual( mock_out.getvalue().strip(), "002-33333 Command Line Tools for Xcode" ) def test_distributions_localized_title(self): products = { "002-44444": { "Distributions": {"English": "http://example.com/dist.xml"}, "Packages": [], } } with patch("catalog.get_content_at", return_value=DIST_XML_LOCALIZED_TITLE): with patch("sys.stdout", new_callable=StringIO) as mock_out: catalog.show_products(products) self.assertEqual(mock_out.getvalue().strip(), "002-44444 Localized SDK Title") def test_no_metadata_produces_no_output(self): products = {"003-55555": {"Packages": []}} with patch("sys.stdout", new_callable=StringIO) as mock_out: catalog.show_products(products) self.assertEqual(mock_out.getvalue(), "") class TestShowProductInfo(unittest.TestCase): PRODUCT = { "Distributions": {"English": "http://example.com/dist.xml"}, "Packages": [ { "URL": "http://example.com/CLTools_Executables.pkg", "Digest": "abc123", "Size": 1024, }, { "URL": "http://example.com/CLTools_SDK.pkg", "Digest": "def456", "Size": 2048, }, ], } def test_lists_all_package_ids_and_urls(self): with patch("catalog.get_content_at", return_value=PRODUCT_INFO_XML): with patch("sys.stdout", new_callable=StringIO) as mock_out: catalog.show_product_info(self.PRODUCT) lines = mock_out.getvalue().splitlines() self.assertIn( "com.apple.pkg.CLTools_Executables http://example.com/CLTools_Executables.pkg", lines, ) self.assertIn( "com.apple.pkg.CLTools_SDK http://example.com/CLTools_SDK.pkg", lines, ) def test_package_id_filter_calls_show_package_content(self): with patch("catalog.get_content_at", return_value=PRODUCT_INFO_XML): with patch("catalog.show_package_content") as mock_show: catalog.show_product_info(self.PRODUCT, "com.apple.pkg.CLTools_SDK") mock_show.assert_called_once_with( "http://example.com/CLTools_SDK.pkg", "def456", 2048 ) def test_package_id_filter_excludes_other_packages(self): with patch("catalog.get_content_at", return_value=PRODUCT_INFO_XML): with patch("catalog.show_package_content") as mock_show: catalog.show_product_info( self.PRODUCT, "com.apple.pkg.CLTools_Executables" ) mock_show.assert_called_once_with( "http://example.com/CLTools_Executables.pkg", "abc123", 1024 ) if __name__ == "__main__": mozunit.main()