# 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()