def namespace_kwargs():
    ns_kwargs = {
        AppStoreConnectArgument.CERTIFICATES_DIRECTORY.key:
            AppStoreConnectArgument.CERTIFICATES_DIRECTORY.get_default(),
        AppStoreConnectArgument.PROFILES_DIRECTORY.key: AppStoreConnectArgument.PROFILES_DIRECTORY.get_default(),
        AppStoreConnectArgument.LOG_REQUESTS.key: True,
        AppStoreConnectArgument.JSON_OUTPUT.key: False,
        AppStoreConnectArgument.ISSUER_ID.key: Types.IssuerIdArgument('issuer-id'),
        AppStoreConnectArgument.KEY_IDENTIFIER.key: Types.KeyIdentifierArgument('key-identifier'),
        AppStoreConnectArgument.PRIVATE_KEY.key: Types.PrivateKeyArgument('-----BEGIN PRIVATE KEY-----'),
    }
    for arg in AppStoreConnect.CLASS_ARGUMENTS:
        if not hasattr(arg.type, 'environment_variable_key'):
            continue
        os.environ.pop(arg.type.environment_variable_key, None)
    return ns_kwargs
def test_publish_action_with_username_and_password(_mock_altool,
                                                   namespace_kwargs):
    namespace_kwargs.update({
        AppStoreConnectArgument.ISSUER_ID.key: None,
        AppStoreConnectArgument.KEY_IDENTIFIER.key: None,
        AppStoreConnectArgument.PRIVATE_KEY.key: None,
        'action': 'publish',
    })

    cli_args = argparse.Namespace(**namespace_kwargs)
    with mock.patch.object(AppStoreConnect, 'find_paths') as mock_find_paths, \
         mock.patch.object(AppStoreConnect, '_get_publishing_application_packages') as mock_get_packages:
        mock_get_packages.return_value = []
        mock_find_paths.return_value = []

        patterns = [pathlib.Path('path.pattern')]
        AppStoreConnect.from_cli_args(cli_args).publish(
            application_package_path_patterns=patterns,
            apple_id='*****@*****.**',
            app_specific_password=Types.AppSpecificPassword(
                'xxxx-yyyy-zzzz-wwww'),
        )
        mock_get_packages.assert_called_with(patterns)
def test_read_private_key(mock_appstore_api_client, namespace_kwargs):
    pk = '-----BEGIN PRIVATE KEY-----\n...'
    namespace_kwargs[
        AppStoreConnectArgument.PRIVATE_KEY.key] = Types.PrivateKeyArgument(pk)
    _do_private_key_assertions(pk, mock_appstore_api_client, namespace_kwargs)
@mock.patch('codemagic.tools.app_store_connect.AppStoreConnectApiClient')
def test_read_private_key(mock_appstore_api_client, namespace_kwargs):
    pk = '-----BEGIN PRIVATE KEY-----\n...'
    namespace_kwargs[
        AppStoreConnectArgument.PRIVATE_KEY.key] = Types.PrivateKeyArgument(pk)
    _do_private_key_assertions(pk, mock_appstore_api_client, namespace_kwargs)


@pytest.mark.parametrize('configure_variable', [
    lambda filename, ns_kwargs: os.environ.update({
        AppStoreConnectArgument.PRIVATE_KEY.type.environment_variable_key:
        f'@file:{filename}'
    }),
    lambda filename, ns_kwargs: ns_kwargs.update({
        AppStoreConnectArgument.PRIVATE_KEY.key:
        Types.PrivateKeyArgument(f'@file:{filename}')
    }),
])
@mock.patch('codemagic.tools.app_store_connect.AppStoreConnectApiClient')
def test_private_key_path_arg(mock_appstore_api_client, configure_variable,
                              namespace_kwargs):
    pk = '-----BEGIN PRIVATE KEY-----\n...'
    with NamedTemporaryFile(mode='w') as tf:
        tf.write(pk)
        tf.flush()
        namespace_kwargs[AppStoreConnectArgument.PRIVATE_KEY.key] = None
        configure_variable(tf.name, namespace_kwargs)
        _do_private_key_assertions(pk, mock_appstore_api_client,
                                   namespace_kwargs)

        AppStoreConnect.from_cli_args(cli_args)
    assert 'this-is-not-a-file' in str(exception_info.value)


@mock.patch('codemagic.tools.app_store_connect.AppStoreConnectApiClient')
def test_read_private_key(mock_appstore_api_client, namespace_kwargs):
    pk = '-----BEGIN PRIVATE KEY-----\n...'
    namespace_kwargs[AppStoreConnectArgument.PRIVATE_KEY.key] = Types.PrivateKeyArgument(pk)
    _do_private_key_assertions(pk, mock_appstore_api_client, namespace_kwargs)


@pytest.mark.parametrize('configure_variable', [
    lambda filename, ns_kwargs: os.environ.update(
        {AppStoreConnectArgument.PRIVATE_KEY.type.environment_variable_key: f'@file:{filename}'}),
    lambda filename, ns_kwargs: ns_kwargs.update(
        {AppStoreConnectArgument.PRIVATE_KEY.key: Types.PrivateKeyArgument(f'@file:{filename}')}),
])
@mock.patch('codemagic.tools.app_store_connect.AppStoreConnectApiClient')
def test_private_key_path_arg(mock_appstore_api_client, configure_variable, namespace_kwargs):
    pk = '-----BEGIN PRIVATE KEY-----\n...'
    with NamedTemporaryFile(mode='w') as tf:
        tf.write(pk)
        tf.flush()
        namespace_kwargs[AppStoreConnectArgument.PRIVATE_KEY.key] = None
        configure_variable(tf.name, namespace_kwargs)
        _do_private_key_assertions(pk, mock_appstore_api_client, namespace_kwargs)


@pytest.mark.parametrize('configure_variable', [
    lambda ns_kwargs: os.environ.update(
        {AppStoreConnectArgument.PRIVATE_KEY.type.environment_variable_key: '@env:PK_VALUE'}),