/* eslint-disable
    handle-callback-err,
    no-unused-vars,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
 * decaffeinate suggestions:
 * DS102: Remove unnecessary code created because of implicit returns
 * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
 */
const sinon = require('sinon')
const chai = require('chai')
chai.should()
const { expect } = chai
const mongojs = require('../../../app/js/mongojs')
const { ObjectId } = mongojs
const Settings = require('settings-sharelatex')
const LockManager = require('../../../app/js/LockManager')
const rclient = require('redis').createClient(Settings.redis.history) // Only works locally for now
const TrackChangesApp = require('./helpers/TrackChangesApp')

describe('Locking document', function () {
  before(function (done) {
    TrackChangesApp.ensureRunning(done)
    return null
  })

  return describe('when the lock has expired in redis', function () {
    before(function (done) {
      LockManager.LOCK_TTL = 1 // second
      LockManager.runWithLock(
        'doc123',
        (releaseA) => {
          // we create a lock A and allow it to expire in redis
          return setTimeout(
            () =>
              // now we create a new lock B and try to release A
              LockManager.runWithLock(
                'doc123',
                (releaseB) => {
                  return releaseA()
                }, // try to release lock A to see if it wipes out lock B
                (error) => {}
              ),

            // we never release lock B so nothing should happen here
            1500
          )
        }, // enough time to wait until the lock has expired
        (error) =>
          // we get here after trying to release lock A
          done()
      )
      return null
    })

    return it('the new lock should not be removed by the expired locker', function (done) {
      LockManager.checkLock('doc123', (err, isFree) => {
        expect(isFree).to.equal(false)
        return done()
      })
      return null
    })
  })
})
