# Test correctness results.
# Does not include command monitoring expectations or outcome assertions to make tests more readable.

# Requires libmongocrypt 1.8.0.
runOn:
  - minServerVersion: "8.0.0"
    # Skip QEv2 (also referred to as FLE2v2) tests on Serverless. Unskip once Serverless enables the QEv2 protocol.
    # FLE 2 Encrypted collections are not supported on standalone.
    topology: [ "replicaset", "sharded", "load-balanced" ]
database_name: &database_name "default"
collection_name: &collection_name "default"
data: []
encrypted_fields: &encrypted_fields {'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDoublePrecision', 'bsonType': 'double', 'queries': {'queryType': 'range', 'contention': {'$numberLong': '0'}, 'trimFactor': {'$numberInt': '1'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberDouble': '0.0'}, 'max': {'$numberDouble': '200.0'}, 'precision': {'$numberInt': '2'}}}]}
key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
tests:
  - description: "Find with $gt"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments:
          document: &doc0 { _id: 0, encryptedDoublePrecision: { $numberDouble: "0.0" } }
      - name: insertOne
        arguments:
          document: &doc1 { _id: 1, encryptedDoublePrecision: { $numberDouble: "1.0" } }
      - name: find
        arguments:
          filter: { encryptedDoublePrecision: { $gt: { $numberDouble: "0.0" } }}
        result: [*doc1]

  - description: "Find with $gte"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: find
        arguments:
          filter: { encryptedDoublePrecision: { $gte: { $numberDouble: "0.0" } }}
          # sort so results from range queries are ordered.
          sort: { _id: 1 }
        result: [*doc0, *doc1]

  - description: "Find with $gt with no results"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: find
        arguments:
          filter: { encryptedDoublePrecision: { $gt: { $numberDouble: "1.0" } }}
        result: []

  - description: "Find with $lt"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: find
        arguments:
          filter: { encryptedDoublePrecision: { $lt: { $numberDouble: "1.0" } }}
        result: [*doc0]

  - description: "Find with $lte"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: find
        arguments:
          filter: { encryptedDoublePrecision: { $lte: { $numberDouble: "1.0" } }}
          # sort so results from range queries are ordered.
          sort: { _id: 1 }
        result: [*doc0, *doc1]

  - description: "Find with $lt below min"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: find
        arguments:
          filter: { encryptedDoublePrecision: { $lt: { $numberDouble: "0.0" } }}
        result:
          errorContains: must be greater than the range minimum

  - description: "Find with $gt above max"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: find
        arguments:
          filter: { encryptedDoublePrecision: { $gt: { $numberDouble: "200.0" } }}
        result:
          errorContains: must be less than the range max

  - description: "Find with $gt and $lt"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: find
        arguments:
          filter: { encryptedDoublePrecision: { $gt: { $numberDouble: "0.0" }, $lt: { $numberDouble: "2.0"} }}
        result: [*doc1]

  - description: "Find with equality"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: find
        arguments:
          filter: { encryptedDoublePrecision: { $numberDouble: "0.0" } }
        result: [*doc0]
      - name: find
        arguments:
          filter: { encryptedDoublePrecision: { $numberDouble: "1.0" } }
        result: [*doc1]

  - description: "Find with full range"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: find
        arguments:
          filter: { encryptedDoublePrecision: { $gte: {$numberDouble: "0.0"}, $lte: {$numberDouble: "200.0"} } }
          # sort so results from range queries are ordered.
          sort: { _id: 1 }
        result: [*doc0, *doc1]

  - description: "Find with $in"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: find
        arguments:
          filter: { encryptedDoublePrecision: { $in: [ {$numberDouble: "0.0"} ] } }
        result: [*doc0]

  - description: "Insert out of range"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments:
          document: { _id: 0, encryptedDoublePrecision: { $numberDouble: "-1" }}
        result:
          errorContains: value must be greater than or equal to the minimum value

  - description: "Insert min and max"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments:
          document: *doc0
      - name: insertOne
        arguments:
          document: &doc200 { _id: 200, encryptedDoublePrecision: { $numberDouble: "200.0" }}
      - name: find
        arguments:
          filter: {}
          # sort so results from range queries are ordered.
          sort: { _id: 1 }
        result: [*doc0, *doc200]

  - description: "Aggregate with $gte"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: aggregate
        arguments:
          pipeline:
          - { $match: { encryptedDoublePrecision: { $gte: { $numberDouble: "0.0" } }} }
          # sort so results from range queries are ordered.
          - { $sort: { _id: 1 }}
        result: [*doc0, *doc1]

  - description: "Aggregate with $gt with no results"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: aggregate
        arguments:
          pipeline:
          - { $match: { encryptedDoublePrecision: { $gt: { $numberDouble: "1.0" } }} }
        result: []

  - description: "Aggregate with $lt"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: aggregate
        arguments:
          pipeline:
          - { $match: { encryptedDoublePrecision: { $lt: { $numberDouble: "1.0" } }} }
        result: [*doc0]

  - description: "Aggregate with $lte"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: aggregate
        arguments:
          pipeline:
          - { $match: { encryptedDoublePrecision: { $lte: { $numberDouble: "1.0" } }} }
          # sort so results from range queries are ordered.
          - { $sort: { _id: 1 }}
        result: [*doc0, *doc1]

  - description: "Aggregate with $lt below min"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: aggregate
        arguments:
          pipeline:
          - { $match: { encryptedDoublePrecision: { $lt: { $numberDouble: "0.0" } }} }
        result:
          errorContains: must be greater than the range minimum

  - description: "Aggregate with $gt above max"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: aggregate
        arguments:
          pipeline:
          - { $match: { encryptedDoublePrecision: { $gt: { $numberDouble: "200.0" } }} }
        result:
          errorContains: must be less than the range max

  - description: "Aggregate with $gt and $lt"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: aggregate
        arguments:
          pipeline:
          - { $match: { encryptedDoublePrecision: { $gt: { $numberDouble: "0.0" }, $lt: { $numberDouble: "2.0"} }} }
        result: [*doc1]

  - description: "Aggregate with equality"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: aggregate
        arguments:
          pipeline:
          - { $match: { encryptedDoublePrecision: { $numberDouble: "0.0" } } }
        result: [*doc0]
      - name: aggregate
        arguments:
          pipeline:
          - { $match: { encryptedDoublePrecision: { $numberDouble: "1.0" } } }
        result: [*doc1]

  - description: "Aggregate with full range"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: aggregate
        arguments:
          pipeline:
          - { $match: { encryptedDoublePrecision: { $gte: {$numberDouble: "0.0"}, $lte: {$numberDouble: "200.0"} } } }
          # sort so results from range queries are ordered.
          - { $sort: { _id: 1 }}
        result: [*doc0, *doc1]

  - description: "Aggregate with $in"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: *doc0 }
      - name: insertOne
        arguments: { document: *doc1 }
      - name: aggregate
        arguments:
          pipeline:
          - { $match: { encryptedDoublePrecision: { $in: [ {$numberDouble: "0.0"} ] } } }
        result: [*doc0]

  - description: "Wrong type: Insert Int"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: insertOne
        arguments: { document: { _id: 0, encryptedDoublePrecision: { $numberInt: "0" }} }
        result:
          # Expect an error from mongocryptd.
          errorContains: "cannot encrypt element"

  - description: "Wrong type: Find Int"
    clientOptions:
      autoEncryptOpts:
        kmsProviders:
          local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
    operations:
      - name: find
        arguments:
          filter: { encryptedDoublePrecision: { $gte: { $numberInt: "0" } }}
          # sort so results from range queries are ordered.
          sort: { _id: 1 }
        result:
          # expect an error from libmongocrypt.
          errorContains: "field type is not supported"