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

# Rule-Data Conflict Detection Test Suite
# Tests that the RVM properly detects conflicts between rule definitions and data documents

cases:
  - note: no_conflict_different_packages
    data:
      users:
        alice:
          role: "guest"
          level: 1
    modules:
      - |
        package test
        result := data.users.alice.role
    query: data.test.result
    want_result: "guest"

  - note: no_conflict_different_paths
    data:
      config:
        database:
          host: "localhost"
          port: 5432
    modules:
      - |
        package test
        users := {
          "alice": {
            "role": "admin"
          }
        }
    query: data.test.users
    want_result: 
      alice:
        role: "admin"

  - note: conflict_same_path_rule_vs_data
    data:
      test:
        users:
          alice:
            role: "guest"
    modules:
      - |
        package test.users
        alice := {
          "role": "admin",
          "level": 5
        }
    query: data.test.users.alice
    want_error: "Conflict: rule defines path 'test.users.alice' but data also provides this path"
    # RVM detects this conflict, but interpreter may not - that's acceptable
    allow_interpreter_success: true
    
  - note: conflict_rule_parent_data_child
    data:
      test:
        config:
          database:
            host: "localhost"
            port: 5432
    modules:
      - |
        package test
        config := {
          "app_name": "myapp",
          "version": "1.0"
        }
    query: data.test.config
    want_error: "Conflict: rule defines path 'test.config' but data also provides this path"
    # RVM detects this conflict, but interpreter may not - that's acceptable
    allow_interpreter_success: true

  - note: conflict_data_parent_rule_child
    data:
      test:
        users: "not an object"
    modules:
      - |
        package test.users
        alice := {"role": "admin"}
    query: data.test.users.alice
    want_error: "Conflict: rule defines subpaths under 'test.users' but data provides a non-object value at this path"
    # RVM detects this conflict, but interpreter may not - that's acceptable
    allow_interpreter_success: true

  - note: no_conflict_nested_coexistence
    data:
      static_config:
        database:
          host: "localhost"
          port: 5432
      user_data:
        preferences:
          theme: "dark"
    modules:
      - |
        package dynamic
        users := {
          "alice": {
            "role": "admin"
          }
        }
        computed_stats := {
          "total_users": 42
        }
    query: data.dynamic.users
    want_result: 
      alice:
        role: "admin"

  - note: no_conflict_multiple_rule_levels
    data:
      test:
        api:
          v1:
            endpoints: ["users", "posts"]
    modules:
      - |
        package test.api.v1
        auth := {
          "required": true,
          "methods": ["jwt", "oauth"]
        }
    query: data.test.api.v1.auth
    want_result: 
      required: true
      methods: ["jwt", "oauth"]

  - note: no_conflict_rule_extends_data_object
    data:
      test:
        config:
          database:
            host: "localhost"
    modules:
      - |
        package test.config
        app_name := "myapp"
        version := "1.0"
    query: data.test.config.app_name
    want_result: "myapp"
