description: "gridfs-delete"

schemaVersion: "1.0"

createEntities:
  - client:
      id: &client0 client0
  - database:
      id: &database0 database0
      client: *client0
      databaseName: &database0Name gridfs-tests
  - bucket:
      id: &bucket0 bucket0
      database: *database0
  - collection:
      id: &bucket0_files_collection bucket0_files_collection
      database: *database0
      collectionName: &bucket0_files_collectionName fs.files
  - collection:
      id: &bucket0_chunks_collection bucket0_chunks_collection
      database: *database0
      collectionName: &bucket0_chunks_collectionName fs.chunks

initialData:
  - collectionName: *bucket0_files_collectionName
    databaseName: *database0Name
    documents:
      - &file1
        _id: { "$oid": "000000000000000000000001" }
        length: 0
        chunkSize: 4
        uploadDate: { "$date": "1970-01-01T00:00:00.000Z" }
        md5: "d41d8cd98f00b204e9800998ecf8427e"
        filename: "length-0"
        contentType: "application/octet-stream"
        aliases: []
        metadata: {}
      - &file2
        _id: { "$oid": "000000000000000000000002" }
        length: 0
        chunkSize: 4
        uploadDate: { "$date": "1970-01-01T00:00:00.000Z" }
        md5: "d41d8cd98f00b204e9800998ecf8427e"
        filename: "length-0-with-empty-chunk"
        contentType: "application/octet-stream"
        aliases: []
        metadata: {}
      - &file3
        _id: { "$oid": "000000000000000000000003" }
        length: 2
        chunkSize: 4
        uploadDate: { "$date": "1970-01-01T00:00:00.000Z" }
        md5: "c700ed4fdb1d27055aa3faa2c2432283"
        filename: "length-2"
        contentType: "application/octet-stream"
        aliases: []
        metadata: {}
      - &file4
        _id: { "$oid": "000000000000000000000004" }
        length: 8
        chunkSize: 4
        uploadDate: { "$date": "1970-01-01T00:00:00.000Z" }
        md5: "dd254cdc958e53abaa67da9f797125f5"
        filename: "length-8"
        contentType: "application/octet-stream"
        aliases: []
        metadata: {}
  - collectionName: *bucket0_chunks_collectionName
    databaseName: *database0Name
    documents:
      - &file2_chunk0
        _id: { "$oid": "000000000000000000000001" }
        files_id: { "$oid": "000000000000000000000002" }
        n: 0
        data: { "$binary": { "base64": "", "subType": "00" } }
      - &file3_chunk0
        _id: { "$oid": "000000000000000000000002" }
        files_id: { "$oid": "000000000000000000000003" }
        n: 0
        data: { "$binary": { "base64": "ESI=", "subType": "00" } } # hex: 1122
      - &file4_chunk0
        _id: { "$oid": "000000000000000000000003" }
        files_id: { "$oid": "000000000000000000000004" }
        n: 0
        data: { "$binary": { "base64": "ESIzRA==", "subType": "00" } }  # hex: 11223344
      - &file4_chunk1
        _id: { "$oid": "000000000000000000000004" }
        files_id: { "$oid": "000000000000000000000004" }
        n: 1
        data: { "$binary": { "base64": "VWZ3iA==", "subType": "00" } } # hex: 55667788

tests:
  - description: "delete when length is 0"
    operations:
      - name: delete
        object: *bucket0
        arguments:
          id: { $oid: "000000000000000000000001" }
    outcome:
      - collectionName: *bucket0_files_collectionName
        databaseName: *database0Name
        documents:
          - *file2
          - *file3
          - *file4
      - collectionName: *bucket0_chunks_collectionName
        databaseName: *database0Name
        documents:
          - *file2_chunk0
          - *file3_chunk0
          - *file4_chunk0
          - *file4_chunk1
  - description: "delete when length is 0 and there is one extra empty chunk"
    operations:
      - name: delete
        object: *bucket0
        arguments:
          id: { $oid: "000000000000000000000002" }
    outcome:
      - collectionName: *bucket0_files_collectionName
        databaseName: *database0Name
        documents:
          - *file1
          - *file3
          - *file4
      - collectionName: *bucket0_chunks_collectionName
        databaseName: *database0Name
        documents:
          - *file3_chunk0
          - *file4_chunk0
          - *file4_chunk1
  - description: "delete when length is 8"
    operations:
      - name: delete
        object: *bucket0
        arguments:
          id: { $oid: "000000000000000000000004" }
    outcome:
      - collectionName: *bucket0_files_collectionName
        databaseName: *database0Name
        documents:
          - *file1
          - *file2
          - *file3
      - collectionName: *bucket0_chunks_collectionName
        databaseName: *database0Name
        documents:
          - *file2_chunk0
          - *file3_chunk0
  - description: "delete when files entry does not exist"
    operations:
      - name: delete
        object: *bucket0
        arguments:
          id: { $oid: "000000000000000000000000" }
        expectError: { isError: true } # FileNotFound
    outcome:
      - collectionName: *bucket0_files_collectionName
        databaseName: *database0Name
        documents:
          - *file1
          - *file2
          - *file3
          - *file4
      - collectionName: *bucket0_chunks_collectionName
        databaseName: *database0Name
        documents:
          - *file2_chunk0
          - *file3_chunk0
          - *file4_chunk0
          - *file4_chunk1
  - description: "delete when files entry does not exist and there are orphaned chunks"
    operations:
      - name: deleteOne
        object: *bucket0_files_collection
        arguments:
          filter:
            _id: { $oid: "000000000000000000000004" }
        expectResult:
          deletedCount: 1
      - name: delete
        object: *bucket0
        arguments:
          id: { $oid: "000000000000000000000004" }
        expectError: { isError: true } # FileNotFound
    outcome:
      - collectionName: *bucket0_files_collectionName
        databaseName: *database0Name
        documents:
          - *file1
          - *file2
          - *file3
      # Orphaned chunks are still deleted even if fs.files
      - collectionName: *bucket0_chunks_collectionName
        databaseName: *database0Name
        documents:
          - *file2_chunk0
          - *file3_chunk0
