# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.

# Modifiable Check Test Suite
# When an alias catalog is loaded, the compiler validates that aliases used
# in Modify operations have `defaultMetadata.attributes = "Modifiable"`.
#
# Non-modifiable aliases should cause a compile-time error.
# Modifiable aliases, tag paths, and built-in fields should compile fine.

aliases: test_aliases.json

cases:
  # =========================================================================
  # Modifiable alias in Modify — should compile and evaluate
  # =========================================================================

  - note: modify_modifiable_alias_ok
    policy_rule: |
      {
        "if": {
          "field": "type",
          "equals": "Microsoft.Storage/storageAccounts"
        },
        "then": {
          "effect": "modify",
          "details": {
            "roleDefinitionIds": [
              "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
            ],
            "operations": [
              {
                "operation": "addOrReplace",
                "field": "Microsoft.Storage/storageAccounts/supportsHttpsTrafficOnly",
                "value": true
              }
            ]
          }
        }
      }
    resource:
      type: "Microsoft.Storage/storageAccounts"
      properties:
        supportsHttpsTrafficOnly: false
    want_effect: "modify"
    want_details:
      roleDefinitionIds:
        - "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
      operations:
        - operation: "addOrReplace"
          field: "Microsoft.Storage/storageAccounts/supportsHttpsTrafficOnly"
          value: true

  # =========================================================================
  # Non-modifiable alias in Modify — should fail compilation
  # =========================================================================

  - note: modify_non_modifiable_alias_error
    policy_rule: |
      {
        "if": {
          "field": "type",
          "equals": "Microsoft.Storage/storageAccounts"
        },
        "then": {
          "effect": "modify",
          "details": {
            "roleDefinitionIds": [
              "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
            ],
            "operations": [
              {
                "operation": "addOrReplace",
                "field": "Microsoft.Storage/storageAccounts/primaryEndpoints.blob",
                "value": "https://example.blob.core.windows.net"
              }
            ]
          }
        }
      }
    resource:
      type: "Microsoft.Storage/storageAccounts"
    want_compile_error: true

  # =========================================================================
  # Tag field in Modify — always allowed (no alias check needed)
  # =========================================================================

  - note: modify_tag_field_ok
    policy_rule: |
      {
        "if": {
          "field": "type",
          "equals": "Microsoft.Compute/virtualMachines"
        },
        "then": {
          "effect": "modify",
          "details": {
            "roleDefinitionIds": [
              "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
            ],
            "operations": [
              {
                "operation": "addOrReplace",
                "field": "tags['environment']",
                "value": "production"
              }
            ]
          }
        }
      }
    resource:
      type: "Microsoft.Compute/virtualMachines"
    want_effect: "modify"

  # =========================================================================
  # Properties path in Modify — no alias match, allowed
  # =========================================================================

  - note: modify_properties_path_ok
    policy_rule: |
      {
        "if": {
          "field": "type",
          "equals": "Microsoft.Compute/virtualMachines"
        },
        "then": {
          "effect": "modify",
          "details": {
            "roleDefinitionIds": [
              "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
            ],
            "operations": [
              {
                "operation": "addOrReplace",
                "field": "properties.someCustomField",
                "value": "custom-value"
              }
            ]
          }
        }
      }
    resource:
      type: "Microsoft.Compute/virtualMachines"
    want_effect: "modify"

  # =========================================================================
  # Multiple operations — one non-modifiable should fail entire compilation
  # =========================================================================

  - note: modify_mixed_modifiable_non_modifiable_error
    policy_rule: |
      {
        "if": {
          "field": "type",
          "equals": "Microsoft.Storage/storageAccounts"
        },
        "then": {
          "effect": "modify",
          "details": {
            "roleDefinitionIds": [
              "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
            ],
            "operations": [
              {
                "operation": "addOrReplace",
                "field": "Microsoft.Storage/storageAccounts/supportsHttpsTrafficOnly",
                "value": true
              },
              {
                "operation": "addOrReplace",
                "field": "Microsoft.Storage/storageAccounts/primaryEndpoints.blob",
                "value": "https://override.blob.core.windows.net"
              }
            ]
          }
        }
      }
    resource:
      type: "Microsoft.Storage/storageAccounts"
    want_compile_error: true

  # =========================================================================
  # Modify with modifiable alias — details include resolved short name
  # =========================================================================

  - note: modify_modifiable_alias_details_check
    policy_rule: |
      {
        "if": {
          "field": "type",
          "equals": "Microsoft.Storage/storageAccounts"
        },
        "then": {
          "effect": "modify",
          "details": {
            "roleDefinitionIds": [
              "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
            ],
            "operations": [
              {
                "operation": "addOrReplace",
                "field": "Microsoft.Storage/storageAccounts/minimumTlsVersion",
                "value": "TLS1_2"
              }
            ]
          }
        }
      }
    resource:
      type: "Microsoft.Storage/storageAccounts"
      properties:
        minimumTlsVersion: "TLS1_0"
    want_effect: "modify"
    want_details:
      roleDefinitionIds:
        - "/providers/Microsoft.Authorization/roleDefinitions/b24988ac-6180-42a0-ab88-20f7382dd24c"
      operations:
        - operation: "addOrReplace"
          field: "Microsoft.Storage/storageAccounts/minimumTlsVersion"
          value: "TLS1_2"
