description: "createSearchIndexes"
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:
  - minServerVersion: "7.0.0"
    topologies: [ replicaset, load-balanced, sharded ]
    serverless: forbid

tests:
  - description: "empty index definition array"
    operations:
      - name: createSearchIndexes
        object: *collection0
        arguments: 
          models: []
        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: []
                $db: *database0


  - description: "no name provided for an index definition"
    operations:
      - name: createSearchIndexes
        object: *collection0
        arguments:
          models: [ { 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: createSearchIndexes
        object: *collection0
        arguments: 
          models: [ { 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: createSearchIndexes
        object: *collection0
        arguments:
          models: [ { 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
