Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion doc/commands/ddl.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ change with the server before applying it. If validation returns warnings, the
user is prompted for confirmation unless `--force` is specified.

```bash
sapcli ddl apistate set CONTRACT NAME [--state STATE] [--comment COMMENT] [--cloud-dev YES|NO] [--key-user-apps YES|NO] [--corrnr TRANSPORT] [--force]
sapcli ddl apistate set CONTRACT NAME [--state STATE] [--comment COMMENT] [--cloud-dev YES|NO] [--key-user-apps YES|NO] [--auth-values YES|NO] [--corrnr TRANSPORT] [--force]
```

- **CONTRACT** - contract level: c0, c1, c2, c3, c4
Expand All @@ -79,5 +79,6 @@ sapcli ddl apistate set CONTRACT NAME [--state STATE] [--comment COMMENT] [--clo
- **--comment** - free-text comment
- **--cloud-dev** - use in Cloud Development: Yes or No
- **--key-user-apps** - use in Key User Apps: Yes or No
- **--auth-values** - authorization Default Value: Yes or No
- **--corrnr** - transport request number
- **--force** - skip confirmation on validation warnings
1 change: 1 addition & 0 deletions sap/adt/apirelease.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ def copy_contract(self, contract_key: ContractKey) -> Contract:
target.use_in_key_user_apps = existing.use_in_key_user_apps
target.use_in_sap_cloud_platform = existing.use_in_sap_cloud_platform
target.comment = existing.comment
target.create_auth_values = existing.create_auth_values
if existing.status is not None:
target.status = ContractStatus()
target.status.state = existing.status.state
Expand Down
12 changes: 10 additions & 2 deletions sap/cli/apirelease.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,9 @@ def _validate_set_args(args) -> ContractKey:

contract_key = _parse_contract_key(args.contract)

if not any([args.state, args.comment is not None, args.cloud_dev, args.key_user_apps]):
if not any([args.state, args.comment is not None, args.cloud_dev, args.key_user_apps, args.auth_values]):
raise InvalidCommandLineError(
'at least one of --state, --comment, --cloud-dev, --key-user-apps is required'
'at least one of --state, --comment, --cloud-dev, --key-user-apps, --auth-values is required'
)

return contract_key
Expand All @@ -141,6 +141,9 @@ def _check_behaviour(api_release, contract_key, args):
if args.cloud_dev and contract_behaviour.use_in_sap_cloud_platform_read_only == 'true':
raise SAPCliError('Use in Cloud Development is read-only for this contract')

if args.auth_values and contract_behaviour.auth_values_enabled != 'true':
raise SAPCliError('Authorization Default Value is not enabled for this contract')


def _apply_args_to_contract(target, args):
"""Apply user-provided options to the target contract"""
Expand All @@ -160,6 +163,9 @@ def _apply_args_to_contract(target, args):
if args.key_user_apps:
target.use_in_key_user_apps = _normalize_yes_no(args.key_user_apps, '--key-user-apps')

if args.auth_values:
target.create_auth_values = _normalize_yes_no(args.auth_values, '--auth-values')


def _build_payload(api_release, contract_key, args):
"""Build the ApiRelease payload for validate/update"""
Expand Down Expand Up @@ -278,6 +284,8 @@ def enhanced_install_parser(arg_parser):
help='Use in Cloud Development: Yes or No')
set_parser.add_argument('--key-user-apps', default=None, dest='key_user_apps',
help='Use in Key User Apps: Yes or No')
set_parser.add_argument('--auth-values', default=None, dest='auth_values',
help='Authorization Default Value: Yes or No')
set_parser.add_argument('--corrnr', default=None, help='Transport request number')
set_parser.add_argument('--force', action='store_true', default=False,
help='Skip confirmation on validation warnings')
Expand Down
2 changes: 2 additions & 0 deletions test/unit/test_sap_adt_apirelease.py
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,7 @@ def test_set_api_release_response_deserialization(self):
self.assertEqual(result.behaviour.create, 'true')
self.assertEqual(result.c1_release.use_in_key_user_apps, 'true')
self.assertEqual(result.c1_release.use_in_sap_cloud_platform, 'true')
self.assertEqual(result.c1_release.create_auth_values, 'true')
self.assertEqual(result.c1_release.use_concept_as_successor, 'false')
self.assertEqual(result.api_catalog_data.is_any_contract_released, 'true')

Expand Down Expand Up @@ -381,6 +382,7 @@ def test_copy_contract_existing(self):
self.assertEqual(copy.use_in_key_user_apps, 'true')
self.assertEqual(copy.use_in_sap_cloud_platform, 'false')
self.assertEqual(copy.comment, '')
self.assertEqual(copy.create_auth_values, 'false')
self.assertEqual(copy.status.state, 'RELEASED')
self.assertEqual(copy.status.state_description, 'Released')

Expand Down
25 changes: 20 additions & 5 deletions test/unit/test_sap_cli_apirelease.py
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ def test_set_no_flags_error(self):

with self.assertRaises(sap.cli.core.InvalidCommandLineError) as cm:
args.execute(Mock(), args)
self.assertIn('at least one of --state, --comment, --cloud-dev, --key-user-apps is required',
self.assertIn('at least one of --state, --comment, --cloud-dev, --key-user-apps, --auth-values is required',
str(cm.exception))

def test_set_contract_not_supported(self):
Expand Down Expand Up @@ -341,7 +341,8 @@ def test_set_new_contract(self):
group = _make_group()
console = BufferConsole()
args = _parse(group, 'apistate', 'set', 'c1', 'I_STATISTICALKEYFIGURECAT',
'--state', 'Released', '--cloud-dev', 'No', '--key-user-apps', 'Yes')
'--state', 'Released', '--cloud-dev', 'No', '--key-user-apps', 'Yes',
'--auth-values', 'No')
args.console_factory = Mock(return_value=console)

result = args.execute(conn, args)
Expand Down Expand Up @@ -407,6 +408,18 @@ def test_set_no_behaviour(self):
args.execute(conn, args)
self.assertIn('does not support API release management', str(cm.exception))

def test_set_auth_values_disabled(self):
"""Test error when auth_values is not enabled for the contract"""
conn = Connection([_resp(API_RELEASE_READONLY_XML)])
group = _make_group()
args = _parse(group, 'apistate', 'set', 'c0', 'I_STATISTICALKEYFIGURECAT',
'--auth-values', 'Yes')
args.console_factory = Mock(return_value=BufferConsole())

with self.assertRaises(sap.errors.SAPCliError) as cm:
args.execute(conn, args)
self.assertIn('Authorization Default Value is not enabled', str(cm.exception))


class TestEnhanceCommandGroup(unittest.TestCase):

Expand Down Expand Up @@ -518,7 +531,7 @@ def test_apply_args_state_with_no_existing_status(self):
target = sap.adt.apirelease.Contract()
target.contract = 'C1'
# status is None - no existing status
args = Mock(state='Released', comment=None, cloud_dev=None, key_user_apps=None)
args = Mock(state='Released', comment=None, cloud_dev=None, key_user_apps=None, auth_values=None)
sap.cli.apirelease._apply_args_to_contract(target, args)
self.assertEqual(target.status.state, 'RELEASED')

Expand All @@ -544,6 +557,8 @@ def test_normalize_yes_no_valid(self):
self.assertEqual(sap.cli.apirelease._normalize_yes_no('Yes', '--cloud-dev'), 'true')
self.assertEqual(sap.cli.apirelease._normalize_yes_no('no', '--cloud-dev'), 'false')
self.assertEqual(sap.cli.apirelease._normalize_yes_no('YES', '--key-user-apps'), 'true')
self.assertEqual(sap.cli.apirelease._normalize_yes_no('No', '--auth-values'), 'false')
self.assertEqual(sap.cli.apirelease._normalize_yes_no('yes', '--auth-values'), 'true')

def test_normalize_yes_no_invalid(self):
from sap.errors import SAPCliError
Expand All @@ -555,7 +570,7 @@ def test_apply_args_invalid_cloud_dev(self):
from sap.errors import SAPCliError
target = sap.adt.apirelease.Contract()
target.contract = 'C1'
args = Mock(state=None, comment=None, cloud_dev='invalid', key_user_apps=None)
args = Mock(state=None, comment=None, cloud_dev='invalid', key_user_apps=None, auth_values=None)
with self.assertRaises(SAPCliError):
sap.cli.apirelease._apply_args_to_contract(target, args)

Expand All @@ -566,7 +581,7 @@ def test_build_payload_existing_contract_no_status(self):
# Force status to None on the existing contract
api_release.c1_release.status = None

args = Mock(state='Released', comment=None, cloud_dev=None, key_user_apps=None)
args = Mock(state='Released', comment=None, cloud_dev=None, key_user_apps=None, auth_values=None)
payload = sap.cli.apirelease._build_payload(api_release, ContractKey.C1, args)

contract = payload.get_contract(ContractKey.C1)
Expand Down
Loading