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

# Built-in Fields Test Suite
# Tests all built-in field types: type, id, kind, name, location, fullName,
# tags, identity.type, and tag indexing patterns.

cases:
  # =========================================================================
  # Core built-in fields
  # =========================================================================

  - note: field_type
    policy_rule: |
      {
        "if": {
          "field": "type",
          "equals": "Microsoft.Compute/virtualMachines"
        },
        "then": { "effect": "deny" }
      }
    resource:
      type: "Microsoft.Compute/virtualMachines"
    want_effect: "deny"

  - note: field_id
    policy_rule: |
      {
        "if": {
          "field": "id",
          "contains": "/resourceGroups/myRg/"
        },
        "then": { "effect": "audit" }
      }
    resource:
      id: "/subscriptions/sub1/resourceGroups/myRg/providers/Microsoft.Compute/virtualMachines/vm1"
    want_effect: "audit"

  - note: field_kind
    policy_rule: |
      {
        "if": {
          "field": "kind",
          "equals": "StorageV2"
        },
        "then": { "effect": "audit" }
      }
    resource:
      kind: "StorageV2"
    want_effect: "audit"

  - note: field_name
    policy_rule: |
      {
        "if": {
          "field": "name",
          "contains": "prod"
        },
        "then": { "effect": "deny" }
      }
    resource:
      name: "my-prod-vm"
    want_effect: "deny"

  - note: field_location
    policy_rule: |
      {
        "if": {
          "field": "location",
          "equals": "eastus"
        },
        "then": { "effect": "deny" }
      }
    resource:
      location: "eastus"
    want_effect: "deny"

  - note: field_fullName
    policy_rule: |
      {
        "if": {
          "field": "fullName",
          "contains": "Microsoft.Compute"
        },
        "then": { "effect": "audit" }
      }
    resource:
      fullName: "Microsoft.Compute/virtualMachines/vm1"
    want_effect: "audit"

  - note: field_identity_type
    policy_rule: |
      {
        "if": {
          "field": "identity.type",
          "equals": "SystemAssigned"
        },
        "then": { "effect": "audit" }
      }
    resource:
      identity:
        type: "SystemAssigned"
    want_effect: "audit"

  # =========================================================================
  # Tags
  # =========================================================================

  - note: field_tags_object
    policy_rule: |
      {
        "if": {
          "field": "tags",
          "containsKey": "environment"
        },
        "then": { "effect": "audit" }
      }
    resource:
      tags:
        environment: "production"
    want_effect: "audit"

  - note: field_tags_dot_notation
    policy_rule: |
      {
        "if": {
          "field": "tags.environment",
          "equals": "production"
        },
        "then": { "effect": "audit" }
      }
    resource:
      tags:
        environment: "production"
    want_effect: "audit"

  - note: field_tags_bracket_notation
    policy_rule: |
      {
        "if": {
          "field": "tags['environment']",
          "equals": "production"
        },
        "then": { "effect": "deny" }
      }
    resource:
      tags:
        environment: "production"
    want_effect: "deny"

  - note: field_tags_dot_hyphen
    policy_rule: |
      {
        "if": {
          "field": "tags.cost-center",
          "equals": "engineering"
        },
        "then": { "effect": "audit" }
      }
    resource:
      tags:
        cost-center: "engineering"
    want_effect: "audit"

  - note: field_tags_bracket_space
    policy_rule: |
      {
        "if": {
          "field": "tags['Created By']",
          "exists": true
        },
        "then": { "effect": "audit" }
      }
    resource:
      tags:
        Created By: "admin"
    want_effect: "audit"

  - note: field_tags_missing
    policy_rule: |
      {
        "if": {
          "field": "tags.environment",
          "exists": false
        },
        "then": { "effect": "deny" }
      }
    resource:
      tags: {}
    want_effect: "deny"

  # =========================================================================
  # Nested property fields (aliases)
  # =========================================================================
  # Note: These test parsing of alias-like dotted paths in field position.
  # Actual alias resolution is out of scope; these confirm the parser
  # correctly handles them.

  - note: field_deep_property
    policy_rule: |
      {
        "if": {
          "field": "properties.securityProfile.uefiSettings.secureBootEnabled",
          "equals": true
        },
        "then": { "effect": "audit" }
      }
    resource:
      properties:
        securityProfile:
          uefiSettings:
            secureBootEnabled: true
    want_effect: "audit"

  - note: field_multiple_field_conditions
    policy_rule: |
      {
        "if": {
          "allOf": [
            { "field": "type", "equals": "Microsoft.Network/networkSecurityGroups/securityRules" },
            { "field": "name", "contains": "allow" },
            { "field": "location", "in": ["eastus", "westus", "centralus"] },
            { "field": "tags.team", "equals": "security" }
          ]
        },
        "then": { "effect": "audit" }
      }
    resource:
      type: "Microsoft.Network/networkSecurityGroups/securityRules"
      name: "allow-https"
      location: "eastus"
      tags:
        team: "security"
    want_effect: "audit"

  # =========================================================================
  # Bracket notation in field paths
  # =========================================================================

  - note: field_bracket_notation_string_key
    policy_rule: |
      {
        "if": {
          "field": "properties.networkAcls['default-action']",
          "equals": "Allow"
        },
        "then": { "effect": "deny" }
      }
    resource:
      properties:
        networkAcls:
          default-action: "Allow"
    want_effect: "deny"

  - note: field_bracket_notation_double_quote
    policy_rule: |
      {
        "if": {
          "field": "properties.settings['log-level']",
          "equals": "debug"
        },
        "then": { "effect": "deny" }
      }
    resource:
      properties:
        settings:
          log-level: "debug"
    want_effect: "deny"

  # =========================================================================
  # Array index access in field paths
  # =========================================================================

  - note: field_array_index_zero
    policy_rule: |
      {
        "if": {
          "field": "properties.ipConfigurations[0].name",
          "equals": "primary"
        },
        "then": { "effect": "deny" }
      }
    resource:
      properties:
        ipConfigurations:
          - name: "primary"
            properties:
              subnet: "default"
          - name: "secondary"
            properties:
              subnet: "dmz"
    want_effect: "deny"

  - note: field_array_index_one
    policy_rule: |
      {
        "if": {
          "field": "properties.ipConfigurations[1].name",
          "equals": "secondary"
        },
        "then": { "effect": "deny" }
      }
    resource:
      properties:
        ipConfigurations:
          - name: "primary"
          - name: "secondary"
    want_effect: "deny"

  - note: field_array_index_out_of_bounds
    policy_rule: |
      {
        "if": {
          "field": "properties.ipConfigurations[5].name",
          "exists": true
        },
        "then": { "effect": "deny" }
      }
    resource:
      properties:
        ipConfigurations:
          - name: "primary"
    want_undefined: true
