|  | 
| 1 | 1 | import sys | 
| 2 | 2 | from collections import namedtuple | 
| 3 | 3 | from unittest import TestCase, mock | 
|  | 4 | +from unittest.mock import patch | 
| 4 | 5 | 
 | 
| 5 | 6 | import pytest | 
|  | 7 | +from parameterized import parameterized | 
| 6 | 8 | 
 | 
| 7 | 9 | from aws_lambda_builders.architecture import ARM64, X86_64 | 
| 8 | 10 | from aws_lambda_builders.workflows.python_pip.utils import OSUtils | 
| 9 | 11 | from aws_lambda_builders.workflows.python_pip.compat import pip_no_compile_c_env_vars | 
| 10 | 12 | from aws_lambda_builders.workflows.python_pip.compat import pip_no_compile_c_shim | 
| 11 |  | -from aws_lambda_builders.workflows.python_pip.packager import DependencyBuilder | 
|  | 13 | +from aws_lambda_builders.workflows.python_pip.packager import DependencyBuilder, SDistMetadataFetcher | 
| 12 | 14 | from aws_lambda_builders.workflows.python_pip.packager import PythonPipDependencyBuilder | 
| 13 | 15 | from aws_lambda_builders.workflows.python_pip.packager import Package | 
| 14 | 16 | from aws_lambda_builders.workflows.python_pip.packager import PipRunner | 
| @@ -343,3 +345,115 @@ def test_check_pip_runner_string_pip(self): | 
| 343 | 345 | 
 | 
| 344 | 346 |         pip_runner_string = fake_osutils.popens[0][0][0][2].split(";")[-1:][0] | 
| 345 | 347 |         self.assertIn("main", pip_runner_string) | 
|  | 348 | + | 
|  | 349 | + | 
|  | 350 | +class TestSDistMetadataFetcher(TestCase): | 
|  | 351 | +    @parameterized.expand( | 
|  | 352 | +        [ | 
|  | 353 | +            (False,), | 
|  | 354 | +            (True,), | 
|  | 355 | +        ] | 
|  | 356 | +    ) | 
|  | 357 | +    @patch("aws_lambda_builders.workflows.python_pip.packager.SDistMetadataFetcher._unpack_sdist_into_dir") | 
|  | 358 | +    @patch("aws_lambda_builders.workflows.python_pip.packager.SDistMetadataFetcher._get_pkg_info_filepath") | 
|  | 359 | +    @patch("aws_lambda_builders.workflows.python_pip.packager.SDistMetadataFetcher._get_name_version") | 
|  | 360 | +    @patch("aws_lambda_builders.workflows.python_pip.packager.SDistMetadataFetcher._get_fallback_pkg_info_filepath") | 
|  | 361 | +    @patch("aws_lambda_builders.workflows.python_pip.packager.SDistMetadataFetcher._is_default_setuptools_values") | 
|  | 362 | +    @patch("aws_lambda_builders.workflows.python_pip.utils.OSUtils.file_exists") | 
|  | 363 | +    @patch("aws_lambda_builders.workflows.python_pip.utils.OSUtils.tempdir") | 
|  | 364 | +    def test_get_package_name_version_fails_fallback( | 
|  | 365 | +        self, | 
|  | 366 | +        fallback_file_exists, | 
|  | 367 | +        tempdir_mock, | 
|  | 368 | +        file_exists_mock, | 
|  | 369 | +        is_default_values_mock, | 
|  | 370 | +        get_fallback_mock, | 
|  | 371 | +        get_name_ver_mock, | 
|  | 372 | +        get_pkg_mock, | 
|  | 373 | +        unpack_mock, | 
|  | 374 | +    ): | 
|  | 375 | +        """ | 
|  | 376 | +        Tests if both our generated PKG-INFO and PKG-INFO are missing/invalid | 
|  | 377 | +        """ | 
|  | 378 | +        file_exists_mock.return_value = fallback_file_exists | 
|  | 379 | +        is_default_values_mock.return_value = True | 
|  | 380 | + | 
|  | 381 | +        original_name = "UNKNOWN" | 
|  | 382 | +        original_version = "5.5.0" | 
|  | 383 | + | 
|  | 384 | +        get_name_ver_mock.side_effect = [(original_name, original_version), ("UNKNOWN", "0.0.0")] | 
|  | 385 | + | 
|  | 386 | +        sdist = SDistMetadataFetcher(OSUtils) | 
|  | 387 | +        name, version = sdist.get_package_name_and_version(mock.Mock()) | 
|  | 388 | + | 
|  | 389 | +        self.assertEqual(name, original_name) | 
|  | 390 | +        self.assertEqual(version, original_version) | 
|  | 391 | + | 
|  | 392 | +    @parameterized.expand( | 
|  | 393 | +        [ | 
|  | 394 | +            (("UNKNOWN", "1.2.3"),), | 
|  | 395 | +            (("unknown", "1.2.3"),), | 
|  | 396 | +            (("foobar", "0.0.0"),), | 
|  | 397 | +        ] | 
|  | 398 | +    ) | 
|  | 399 | +    @patch("aws_lambda_builders.workflows.python_pip.packager.SDistMetadataFetcher._unpack_sdist_into_dir") | 
|  | 400 | +    @patch("aws_lambda_builders.workflows.python_pip.packager.SDistMetadataFetcher._get_pkg_info_filepath") | 
|  | 401 | +    @patch("aws_lambda_builders.workflows.python_pip.packager.SDistMetadataFetcher._get_name_version") | 
|  | 402 | +    @patch("aws_lambda_builders.workflows.python_pip.packager.SDistMetadataFetcher._get_fallback_pkg_info_filepath") | 
|  | 403 | +    @patch("aws_lambda_builders.workflows.python_pip.utils.OSUtils.file_exists") | 
|  | 404 | +    @patch("aws_lambda_builders.workflows.python_pip.utils.OSUtils.tempdir") | 
|  | 405 | +    def test_get_package_name_version_fallback( | 
|  | 406 | +        self, | 
|  | 407 | +        name_version, | 
|  | 408 | +        tempdir_mock, | 
|  | 409 | +        file_exists_mock, | 
|  | 410 | +        get_fallback_mock, | 
|  | 411 | +        get_name_ver_mock, | 
|  | 412 | +        get_pkg_mock, | 
|  | 413 | +        unpack_mock, | 
|  | 414 | +    ): | 
|  | 415 | +        """ | 
|  | 416 | +        Tests if we have UNKNOWN and if we use the fall back values | 
|  | 417 | +        """ | 
|  | 418 | +        fallback_name = "fallback" | 
|  | 419 | +        fallback_version = "1.0.0" | 
|  | 420 | + | 
|  | 421 | +        get_name_ver_mock.side_effect = [name_version, (fallback_name, fallback_version)] | 
|  | 422 | + | 
|  | 423 | +        sdist = SDistMetadataFetcher(OSUtils) | 
|  | 424 | +        name, version = sdist.get_package_name_and_version(mock.Mock()) | 
|  | 425 | + | 
|  | 426 | +        self.assertEqual(name, fallback_name) | 
|  | 427 | +        self.assertEqual(version, fallback_version) | 
|  | 428 | + | 
|  | 429 | +    @patch("aws_lambda_builders.workflows.python_pip.packager.SDistMetadataFetcher._unpack_sdist_into_dir") | 
|  | 430 | +    @patch("aws_lambda_builders.workflows.python_pip.packager.SDistMetadataFetcher._get_pkg_info_filepath") | 
|  | 431 | +    @patch("aws_lambda_builders.workflows.python_pip.packager.SDistMetadataFetcher._get_name_version") | 
|  | 432 | +    @patch("aws_lambda_builders.workflows.python_pip.packager.SDistMetadataFetcher._get_fallback_pkg_info_filepath") | 
|  | 433 | +    @patch("aws_lambda_builders.workflows.python_pip.utils.OSUtils.file_exists") | 
|  | 434 | +    @patch("aws_lambda_builders.workflows.python_pip.utils.OSUtils.tempdir") | 
|  | 435 | +    def test_get_package_name_version( | 
|  | 436 | +        self, | 
|  | 437 | +        tempdir_mock, | 
|  | 438 | +        file_exists_mock, | 
|  | 439 | +        get_fallback_mock, | 
|  | 440 | +        get_name_ver_mock, | 
|  | 441 | +        get_pkg_mock, | 
|  | 442 | +        unpack_mock, | 
|  | 443 | +    ): | 
|  | 444 | +        """ | 
|  | 445 | +        Tests return original results | 
|  | 446 | +        """ | 
|  | 447 | +        not_default_name = "real" | 
|  | 448 | +        not_default_version = "1.2.3" | 
|  | 449 | + | 
|  | 450 | +        fallback_name = "fallback" | 
|  | 451 | +        fallback_version = "1.0.0" | 
|  | 452 | + | 
|  | 453 | +        get_name_ver_mock.side_effect = [(not_default_name, not_default_version), (fallback_name, fallback_version)] | 
|  | 454 | + | 
|  | 455 | +        sdist = SDistMetadataFetcher(OSUtils) | 
|  | 456 | +        name, version = sdist.get_package_name_and_version(mock.Mock()) | 
|  | 457 | + | 
|  | 458 | +        self.assertEqual(name, not_default_name) | 
|  | 459 | +        self.assertEqual(version, not_default_version) | 
0 commit comments