description: "createSearchIndex"
schemaVersion: "1.4"
createEntities:
  - client:
      id: &client0 client0
      useMultipleMongoses: false
      observeEvents:
        - commandStartedEvent
  - database:
      id: &database0 database0
      client: *client0
      databaseName: *database0
  - collection:
      id: &collection0 collection0
      database: *database0
      collectionName: *collection0

runOnRequirements:
  # Skip server versions without fix of SERVER-83107 to avoid error message "BSON field 'createSearchIndexes.indexes.type' is an unknown field."
  # SERVER-83107 was not backported to 7.1.
  - minServerVersion: "7.0.5"
    maxServerVersion: "7.0.99"
    topologies: [ replicaset, load-balanced, sharded ]
    serverless: forbid
  - minServerVersion: "7.2.0"
    topologies: [ replicaset, load-balanced, sharded ]
    serverless: forbid

tests:
  - description: "no name provided for an index definition"
    operations:
      - name: createSearchIndex
        object: *collection0
        arguments:
          model: { definition: &definition { mappings: { dynamic: true } } , type: 'search' }
        expectError:
          # This test always errors in a non-Atlas environment.  The test functions as a unit test  by asserting
          # that the driver constructs and sends the correct command.
          # The expected error message was changed in SERVER-83003. Check for the substring "Atlas" shared by both error messages.
          isError: true
          errorContains: Atlas
    expectEvents:
      - client: *client0
        events:
          - commandStartedEvent:
              command:
                createSearchIndexes: *collection0
                indexes: [ { definition: *definition, type: 'search'} ]
                $db: *database0

  - description: "name provided for an index definition"
    operations:
      - name: createSearchIndex
        object: *collection0
        arguments: 
          model: { definition: &definition { mappings: { dynamic: true } } , name: 'test index', type: 'search' }
        expectError:
          # This test always errors in a non-Atlas environment.  The test functions as a unit test  by asserting
          # that the driver constructs and sends the correct command.
          # The expected error message was changed in SERVER-83003. Check for the substring "Atlas" shared by both error messages.
          isError: true
          errorContains: Atlas
    expectEvents:
      - client: *client0
        events:
          - commandStartedEvent:
              command:
                createSearchIndexes: *collection0
                indexes: [ { definition: *definition, name: 'test index', type: 'search' } ]
                $db: *database0

  - description: "create a vector search index"
    operations:
      - name: createSearchIndex
        object: *collection0
        arguments:
          model: { definition: &definition { fields: [ {"type": "vector", "path": "plot_embedding", "numDimensions": 1536, "similarity": "euclidean"} ] }
            , name: 'test index', type: 'vectorSearch' }
        expectError:
          # This test always errors in a non-Atlas environment.  The test functions as a unit test  by asserting
          # that the driver constructs and sends the correct command.
          # The expected error message was changed in SERVER-83003. Check for the substring "Atlas" shared by both error messages.
          isError: true
          errorContains: Atlas
    expectEvents:
      - client: *client0
        events:
          - commandStartedEvent:
              command:
                createSearchIndexes: *collection0
                indexes: [ { definition: *definition, name: 'test index', type: 'vectorSearch' } ]
                $db: *database0
