blob: 221d5f13e0fd2df8568900e04daa9d4c7ae85ad3 [file]
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
import unittest
from typing import cast
from unittest.mock import patch, MagicMock
from cli_test_utils import CLITestBase
from apache_polaris.cli.options.parser import Parser
from apache_polaris.cli.command import Command
from apache_polaris.cli.command.policies import PoliciesCommand
class TestPoliciesCommand(CLITestBase):
def test_policy_attach_paremeters(self) -> None:
options = Parser.parse(
[
"policies",
"attach",
"policy-name",
"--catalog",
"cat",
"--attachment-type",
"catalog",
"--parameters",
"key=value",
]
)
command = Command.from_options(options)
command = cast(PoliciesCommand, command)
self.assertIsInstance(command.parameters, dict)
self.assertEqual({"key": "value"}, command.parameters)
@patch("apache_polaris.cli.command.policies.PolicyAPI")
def test_policy_list(self, mock_policy_api_class: MagicMock) -> None:
mock_client = self.build_mock_client()
mock_policy_api = mock_policy_api_class.return_value
mock_policy_api.list_policies.return_value.to_json.return_value = "{}"
self.mock_execute(
mock_client,
["policies", "list", "--catalog", "my-catalog", "--namespace", "ns1"],
)
mock_policy_api.list_policies.assert_called_once_with(
prefix="my-catalog", namespace="ns1", policy_type=None
)
mock_policy_api.get_applicable_policies.return_value.applicable_policies = []
self.mock_execute(
mock_client,
[
"policies",
"list",
"--catalog",
"my-catalog",
"--namespace",
"ns1",
"--applicable",
],
)
mock_policy_api.get_applicable_policies.assert_called_once_with(
prefix="my-catalog", namespace="ns1", policy_type=None
)
@patch("apache_polaris.cli.command.policies.PolicyAPI")
def test_policy_attach(self, mock_policy_api_class: MagicMock) -> None:
mock_client = self.build_mock_client()
mock_policy_api = mock_policy_api_class.return_value
self.mock_execute(
mock_client,
[
"policies",
"attach",
"my-policy",
"--catalog",
"my-catalog",
"--attachment-type",
"catalog",
],
)
mock_policy_api.attach_policy.assert_called_once()
_, kwargs = mock_policy_api.attach_policy.call_args
self.assertEqual(kwargs["prefix"], "my-catalog")
self.assertEqual(kwargs["policy_name"], "my-policy")
@patch("apache_polaris.cli.command.policies.PolicyAPI")
def test_policy_detach(self, mock_policy_api_class: MagicMock) -> None:
mock_client = self.build_mock_client()
mock_policy_api = mock_policy_api_class.return_value
self.mock_execute(
mock_client,
[
"policies",
"detach",
"my-policy",
"--catalog",
"my-catalog",
"--attachment-type",
"catalog",
],
)
mock_policy_api.detach_policy.assert_called_once()
_, kwargs = mock_policy_api.detach_policy.call_args
self.assertEqual(kwargs["prefix"], "my-catalog")
self.assertEqual(kwargs["policy_name"], "my-policy")
@patch("apache_polaris.cli.command.policies.PolicyAPI")
def test_policy_update(self, mock_policy_api_class: MagicMock) -> None:
mock_client = self.build_mock_client()
mock_policy_api = mock_policy_api_class.return_value
mock_policy_api.load_policy.return_value.policy.version = 1
with patch(
"builtins.open",
unittest.mock.mock_open(
read_data='{"version": "2025-02-03", "enable": true, "config": {"target_file_size_bytes": 134217728, "compaction_strategy": "bin-pack", "max-concurrent-file-group-rewrites": 5, "key1": "value1"}}'
),
):
self.mock_execute(
mock_client,
[
"policies",
"update",
"my-policy",
"--catalog",
"my-catalog",
"--policy-file",
"dummy.json",
"--policy-description",
"dummy policy",
],
)
mock_policy_api.update_policy.assert_called_once()
_, kwargs = mock_policy_api.update_policy.call_args
self.assertEqual(kwargs["prefix"], "my-catalog")
self.assertEqual(kwargs["policy_name"], "my-policy")
self.assertEqual(
kwargs["update_policy_request"].description, "dummy policy"
)
self.assertEqual(kwargs["update_policy_request"].current_policy_version, 1)
@patch("apache_polaris.cli.command.policies.PolicyAPI")
def test_policy_create(self, mock_policy_api_class: MagicMock) -> None:
mock_client = self.build_mock_client()
mock_policy_api = mock_policy_api_class.return_value
with patch(
"builtins.open",
unittest.mock.mock_open(
read_data='{"version": "2025-02-03", "enable": true}'
),
):
self.mock_execute(
mock_client,
[
"policies",
"create",
"my-policy",
"--catalog",
"my-catalog",
"--namespace",
"ns1",
"--policy-file",
"dummy.json",
"--policy-type",
"system.data-compaction",
"--policy-description",
"my policy description",
],
)
mock_policy_api.create_policy.assert_called_once()
_, kwargs = mock_policy_api.create_policy.call_args
self.assertEqual(kwargs["prefix"], "my-catalog")
self.assertEqual(kwargs["namespace"], "ns1")
self.assertEqual(kwargs["create_policy_request"].name, "my-policy")
self.assertEqual(
kwargs["create_policy_request"].type, "system.data-compaction"
)
self.assertEqual(
kwargs["create_policy_request"].description, "my policy description"
)
@patch("apache_polaris.cli.command.policies.PolicyAPI")
def test_policy_delete(self, mock_policy_api_class: MagicMock) -> None:
mock_client = self.build_mock_client()
mock_policy_api = mock_policy_api_class.return_value
self.mock_execute(
mock_client,
[
"policies",
"delete",
"my-policy",
"--catalog",
"my-catalog",
"--namespace",
"ns1",
],
)
mock_policy_api.drop_policy.assert_called_once()
_, kwargs = mock_policy_api.drop_policy.call_args
self.assertEqual(kwargs["prefix"], "my-catalog")
self.assertEqual(kwargs["namespace"], "ns1")
self.assertEqual(kwargs["policy_name"], "my-policy")
@patch("apache_polaris.cli.command.policies.PolicyAPI")
def test_policy_get(self, mock_policy_api_class: MagicMock) -> None:
mock_client = self.build_mock_client()
mock_policy_api = mock_policy_api_class.return_value
mock_policy_api.load_policy.return_value.to_json.return_value = "{}"
self.mock_execute(
mock_client,
[
"policies",
"get",
"my-policy",
"--catalog",
"my-catalog",
"--namespace",
"ns1",
],
)
mock_policy_api.load_policy.assert_called_once()
_, kwargs = mock_policy_api.load_policy.call_args
self.assertEqual(kwargs["prefix"], "my-catalog")
self.assertEqual(kwargs["namespace"], "ns1")
self.assertEqual(kwargs["policy_name"], "my-policy")