/* eslint-disable
    no-unused-vars,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
 * decaffeinate suggestions:
 * DS101: Remove unnecessary use of Array.from
 * DS102: Remove unnecessary code created because of implicit returns
 * DS207: Consider shorter variations of null checks
 * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
 */
const sinon = require('sinon')
const { ObjectId } = require('mongodb-legacy')
const async = require('async')
const DocstoreApp = require('./helpers/DocstoreApp')

const DocstoreClient = require('./helpers/DocstoreClient')

describe('Getting all docs', function () {
  beforeEach(function (done) {
    this.project_id = new ObjectId()
    this.docs = [
      {
        _id: new ObjectId(),
        lines: ['one', 'two', 'three'],
        ranges: { mock: 'one' },
        rev: 2,
      },
      {
        _id: new ObjectId(),
        lines: ['aaa', 'bbb', 'ccc'],
        ranges: { mock: 'two' },
        rev: 4,
      },
      {
        _id: new ObjectId(),
        lines: ['111', '222', '333'],
        ranges: { mock: 'three' },
        rev: 6,
      },
    ]
    this.deleted_doc = {
      _id: new ObjectId(),
      lines: ['deleted'],
      ranges: { mock: 'four' },
      rev: 8,
    }
    const version = 42
    const jobs = Array.from(this.docs).map(doc =>
      (doc => {
        return callback => {
          return DocstoreClient.createDoc(
            this.project_id,
            doc._id,
            doc.lines,
            version,
            doc.ranges,
            callback
          )
        }
      })(doc)
    )
    jobs.push(cb => {
      return DocstoreClient.createDoc(
        this.project_id,
        this.deleted_doc._id,
        this.deleted_doc.lines,
        version,
        this.deleted_doc.ranges,
        err => {
          if (err) return done(err)
          return DocstoreClient.deleteDoc(
            this.project_id,
            this.deleted_doc._id,
            cb
          )
        }
      )
    })
    jobs.unshift(cb => DocstoreApp.ensureRunning(cb))
    return async.series(jobs, done)
  })

  it('getAllDocs should return all the (non-deleted) docs', function (done) {
    return DocstoreClient.getAllDocs(this.project_id, (error, res, docs) => {
      if (error != null) {
        throw error
      }
      docs.length.should.equal(this.docs.length)
      for (let i = 0; i < docs.length; i++) {
        const doc = docs[i]
        doc.lines.should.deep.equal(this.docs[i].lines)
      }
      return done()
    })
  })

  return it('getAllRanges should return all the (non-deleted) doc ranges', function (done) {
    return DocstoreClient.getAllRanges(this.project_id, (error, res, docs) => {
      if (error != null) {
        throw error
      }
      docs.length.should.equal(this.docs.length)
      for (let i = 0; i < docs.length; i++) {
        const doc = docs[i]
        doc.ranges.should.deep.equal(this.docs[i].ranges)
      }
      return done()
    })
  })
})
