|
@@ -1,153 +1,57 @@
|
|
|
-const SandboxedModule = require('sandboxed-module')
|
|
|
|
|
-const sinon = require('sinon')
|
|
|
|
|
const { expect } = require('chai')
|
|
const { expect } = require('chai')
|
|
|
-const modulePath = require('path').join(
|
|
|
|
|
- __dirname,
|
|
|
|
|
- '../../../../app/src/Features/Cooldown/CooldownManager'
|
|
|
|
|
-)
|
|
|
|
|
|
|
+const { ObjectId } = require('mongodb-legacy')
|
|
|
|
|
+const CooldownManager = require('../../../../app/src/Features/Cooldown/CooldownManager')
|
|
|
|
|
+const {
|
|
|
|
|
+ cleanupTestRedis,
|
|
|
|
|
+} = require('../../../../app/src/infrastructure/RedisWrapper')
|
|
|
|
|
|
|
|
describe('CooldownManager', function () {
|
|
describe('CooldownManager', function () {
|
|
|
|
|
+ beforeEach(cleanupTestRedis)
|
|
|
|
|
+
|
|
|
beforeEach(function () {
|
|
beforeEach(function () {
|
|
|
- this.projectId = 'abcdefg'
|
|
|
|
|
- this.rclient = { set: sinon.stub(), get: sinon.stub() }
|
|
|
|
|
- this.RedisWrapper = { client: () => this.rclient }
|
|
|
|
|
- this.CooldownManager = SandboxedModule.require(modulePath, {
|
|
|
|
|
- requires: {
|
|
|
|
|
- '../../infrastructure/RedisWrapper': this.RedisWrapper,
|
|
|
|
|
- },
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ this.project1Id = new ObjectId().toString()
|
|
|
|
|
+ this.project2Id = new ObjectId().toString()
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
describe('_buildKey', function () {
|
|
describe('_buildKey', function () {
|
|
|
it('should build a properly formatted redis key', function () {
|
|
it('should build a properly formatted redis key', function () {
|
|
|
- expect(this.CooldownManager._buildKey('ABC')).to.equal('Cooldown:{ABC}')
|
|
|
|
|
|
|
+ expect(CooldownManager._buildKey('ABC')).to.equal('Cooldown:{ABC}')
|
|
|
})
|
|
})
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
describe('isProjectOnCooldown', function () {
|
|
describe('isProjectOnCooldown', function () {
|
|
|
- describe('when project is on cooldown', function () {
|
|
|
|
|
- beforeEach(function () {
|
|
|
|
|
- this.rclient.get = sinon.stub().callsArgWith(1, null, '1')
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- it('should fetch key from redis', async function () {
|
|
|
|
|
- await this.CooldownManager.promises.isProjectOnCooldown(this.projectId)
|
|
|
|
|
- this.rclient.get.callCount.should.equal(1)
|
|
|
|
|
- this.rclient.get.calledWith('Cooldown:{abcdefg}').should.equal(true)
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- it('should produce a true result', async function () {
|
|
|
|
|
- const result = await this.CooldownManager.promises.isProjectOnCooldown(
|
|
|
|
|
- this.projectId
|
|
|
|
|
|
|
+ describe('when no project is on cooldown', function () {
|
|
|
|
|
+ it('returns false for project 1', async function () {
|
|
|
|
|
+ const result = await CooldownManager.promises.isProjectOnCooldown(
|
|
|
|
|
+ this.project1Id
|
|
|
)
|
|
)
|
|
|
- expect(result).to.equal(true)
|
|
|
|
|
- })
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- describe('when project is not on cooldown', function () {
|
|
|
|
|
- beforeEach(function () {
|
|
|
|
|
- this.rclient.get = sinon.stub().callsArgWith(1, null, null)
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- it('should fetch key from redis', async function () {
|
|
|
|
|
- await this.CooldownManager.promises.isProjectOnCooldown(this.projectId)
|
|
|
|
|
- this.rclient.get.callCount.should.equal(1)
|
|
|
|
|
- this.rclient.get.calledWith('Cooldown:{abcdefg}').should.equal(true)
|
|
|
|
|
|
|
+ expect(result).to.be.false
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
- it('should produce a false result', async function () {
|
|
|
|
|
- const result = await this.CooldownManager.promises.isProjectOnCooldown(
|
|
|
|
|
- this.projectId
|
|
|
|
|
|
|
+ it('returns false for project 2', async function () {
|
|
|
|
|
+ const result = await CooldownManager.promises.isProjectOnCooldown(
|
|
|
|
|
+ this.project2Id
|
|
|
)
|
|
)
|
|
|
- expect(result).to.equal(false)
|
|
|
|
|
|
|
+ expect(result).to.be.false
|
|
|
})
|
|
})
|
|
|
})
|
|
})
|
|
|
-
|
|
|
|
|
- describe('when rclient.get produces an error', function () {
|
|
|
|
|
- beforeEach(function () {
|
|
|
|
|
- this.rclient.get = sinon.stub().callsArgWith(1, new Error('woops'))
|
|
|
|
|
|
|
+ describe('when project 1 is on cooldown', function () {
|
|
|
|
|
+ beforeEach(async function () {
|
|
|
|
|
+ await CooldownManager.promises.putProjectOnCooldown(this.project1Id)
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
- it('should fetch key from redis', async function () {
|
|
|
|
|
- try {
|
|
|
|
|
- await this.CooldownManager.promises.isProjectOnCooldown(
|
|
|
|
|
- this.projectId
|
|
|
|
|
- )
|
|
|
|
|
- } catch {
|
|
|
|
|
- // ignore errors - expected
|
|
|
|
|
- }
|
|
|
|
|
- this.rclient.get.callCount.should.equal(1)
|
|
|
|
|
- this.rclient.get.calledWith('Cooldown:{abcdefg}').should.equal(true)
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- it('should produce an error', async function () {
|
|
|
|
|
- let error
|
|
|
|
|
-
|
|
|
|
|
- try {
|
|
|
|
|
- await this.CooldownManager.promises.isProjectOnCooldown(
|
|
|
|
|
- this.projectId
|
|
|
|
|
- )
|
|
|
|
|
- } catch (err) {
|
|
|
|
|
- error = err
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- expect(error).to.be.instanceOf(Error)
|
|
|
|
|
- })
|
|
|
|
|
- })
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- describe('putProjectOnCooldown', function () {
|
|
|
|
|
- describe('when rclient.set does not produce an error', function () {
|
|
|
|
|
- beforeEach(function () {
|
|
|
|
|
- this.rclient.set = sinon.stub().callsArgWith(4, null)
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- it('should set a key in redis', async function () {
|
|
|
|
|
- await this.CooldownManager.promises.putProjectOnCooldown(this.projectId)
|
|
|
|
|
- this.rclient.set.callCount.should.equal(1)
|
|
|
|
|
- this.rclient.set.calledWith('Cooldown:{abcdefg}').should.equal(true)
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- it('should not produce an error', async function () {
|
|
|
|
|
- let error
|
|
|
|
|
- try {
|
|
|
|
|
- await this.CooldownManager.promises.putProjectOnCooldown(
|
|
|
|
|
- this.projectId
|
|
|
|
|
- )
|
|
|
|
|
- } catch (err) {
|
|
|
|
|
- error = err
|
|
|
|
|
- }
|
|
|
|
|
- expect(error).not.to.exist
|
|
|
|
|
- })
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- describe('when rclient.set produces an error', function () {
|
|
|
|
|
- beforeEach(function () {
|
|
|
|
|
- this.rclient.set = sinon.stub().callsArgWith(4, new Error('woops'))
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- it('should set a key in redis', async function () {
|
|
|
|
|
- try {
|
|
|
|
|
- await this.CooldownManager.promises.putProjectOnCooldown(
|
|
|
|
|
- this.projectId
|
|
|
|
|
- )
|
|
|
|
|
- } catch {
|
|
|
|
|
- // ignore errors - expected
|
|
|
|
|
- }
|
|
|
|
|
- this.rclient.set.callCount.should.equal(1)
|
|
|
|
|
- this.rclient.set.calledWith('Cooldown:{abcdefg}').should.equal(true)
|
|
|
|
|
|
|
+ it('returns true for project 1', async function () {
|
|
|
|
|
+ const result = await CooldownManager.promises.isProjectOnCooldown(
|
|
|
|
|
+ this.project1Id
|
|
|
|
|
+ )
|
|
|
|
|
+ expect(result).to.be.true
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
- it('produce an error', async function () {
|
|
|
|
|
- let error
|
|
|
|
|
- try {
|
|
|
|
|
- await this.CooldownManager.promises.putProjectOnCooldown(
|
|
|
|
|
- this.projectId
|
|
|
|
|
- )
|
|
|
|
|
- } catch (err) {
|
|
|
|
|
- error = err
|
|
|
|
|
- }
|
|
|
|
|
- expect(error).to.be.instanceOf(Error)
|
|
|
|
|
|
|
+ it('returns false for project 2', async function () {
|
|
|
|
|
+ const result = await CooldownManager.promises.isProjectOnCooldown(
|
|
|
|
|
+ this.project2Id
|
|
|
|
|
+ )
|
|
|
|
|
+ expect(result).to.be.false
|
|
|
})
|
|
})
|
|
|
})
|
|
})
|
|
|
})
|
|
})
|