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

# Default Rules Test Suite
# Tests default rule evaluation when complete rules have no successful definitions

cases:
  - note: default_rule_basic
    data: {}
    modules:
      - |
        package test
        default allow := false
        allow := true if {
          false  # This will always fail
        }
    query: data.test.allow
    want_result: false

  - note: default_rule_with_multiple_definitions_all_fail
    data: {}
    modules:
      - |
        package test
        default result := "default_value"
        result := "success1" if {
          false  # This will fail
        }
        result := "success2" if {
          input.nonexistent == "value"  # This will fail
        }
        result := "success3" if {
          1 == 2  # This will fail
        }
    query: data.test.result
    want_result: "default_value"

  - note: default_rule_not_used_when_definition_succeeds
    data: {}
    modules:
      - |
        package test
        default allow := false
        allow := true if {
          1 == 1  # This will succeed
        }
    query: data.test.allow
    want_result: true

  - note: default_rule_with_object_key
    skip: true  # TODO: Fix rule type classification for config["timeout"] - should be Complete, not PartialObject
    data: {}
    modules:
      - |
        package test
        default config["timeout"] := 30
        config["timeout"] := 60 if {
          false  # This will fail
        }
    query: data.test.config.timeout
    want_result: 30

  - note: default_rule_complex_value
    data: {}
    modules:
      - |
        package test
        default settings := {
          "enabled": false,
          "retries": 3,
          "timeout": 30
        }
        settings := {
          "enabled": true,
          "retries": 5,
          "timeout": 60
        } if {
          false  # This will fail
        }
    query: data.test.settings
    want_result: 
      enabled: false
      retries: 3
      timeout: 30

  - note: default_rule_with_array
    data: {}
    modules:
      - |
        package test
        default items := ["default1", "default2"]
        items := ["actual1", "actual2"] if {
          false  # This will fail
        }
    query: data.test.items
    want_result: ["default1", "default2"]

  - note: default_rule_with_input_dependency
    data: {}
    modules:
      - |
        package test
        default result := "no_user"
        result := "admin" if {
          input.user.role == "admin"
        }
        result := "user" if {
          input.user.role == "user"
        }
    query: data.test.result
    want_result: "no_user"

  - note: default_rule_with_input_dependency_success
    data: {}
    input:
      user:
        role: "admin"
    modules:
      - |
        package test
        default result := "no_user"
        result := "admin" if {
          input.user.role == "admin"
        }
        result := "user" if {
          input.user.role == "user"
        }
    query: data.test.result
    want_result: "admin"

  - note: default_rule_with_data_dependency
    data:
      config:
        mode: "production"
    modules:
      - |
        package test
        default debug_mode := false
        debug_mode := true if {
          data.config.mode == "development"
        }
    query: data.test.debug_mode
    want_result: false

  - note: default_rule_nested_package
    data: {}
    modules:
      - |
        package test.auth
        default allow := false
        allow := true if {
          false  # This will fail
        }
    query: data.test.auth.allow
    want_result: false

  - note: default_only_rule_bool
    data: {}
    modules:
      - |
        package test
        default deny := true
    query: data.test.deny
    want_result: true

  - note: default_only_rule_object
    data: {}
    modules:
      - |
        package test
        default deny := {"result": false, "reasons": []}
    query: data.test.deny
    want_result:
      result: false
      reasons: []

  - note: default_only_rule_with_entry_point
    data: {}
    modules:
      - |
        package graph.mypolicy
        default deny := {"result": false, "reasons": []}
    entry_points:
      - data.graph.mypolicy.deny
    query: data.graph.mypolicy.deny
    want_result:
      result: false
      reasons: []

  - note: multiple_default_rules_different_names
    skip: true
    data: {}
    modules:
      - |
        package test
        default allow := false
        default deny := true
        allow := true if {
          false  # This will fail
        }
        deny := false if {
          false  # This will fail
        }
    query: data.test
    want_result:
      allow: false
      deny: true

  - note: default_rule_with_computed_value
    skip: true
    data: {}
    modules:
      - |
        package test
        base_timeout := 10
        default timeout := base_timeout * 3
        timeout := base_timeout * 6 if {
          false  # This will fail
        }
    query: data.test.timeout
    want_result: 30

  - note: default_rule_undefined_vs_default
    skip: true
    data: {}
    modules:
      - |
        package test
        default has_default := "default"
        # no_default rule has no default and no successful definitions
        no_default := "success" if {
          false  # This will fail
        }
    query: data.test
    want_result:
      has_default: "default"

  - note: default_rule_with_function_call
    skip: true
    data: {}
    modules:
      - |
        package test
        helper_func := "helper_result"
        default result := helper_func
        result := "success" if {
          false  # This will fail
        }
    query: data.test.result
    want_result: "helper_result"

  - note: default_rule_consistency_check
    data: {}
    modules:
      - |
        package test
        default value := 42
        value := 42 if {
          true  # This succeeds with same value as default
        }
        value := 99 if {
          false  # This fails
        }
    query: data.test.value
    want_result: 42
