| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- /*
- * decaffeinate suggestions:
- * DS102: Remove unnecessary code created because of implicit returns
- * DS206: Consider reworking classes to avoid initClass
- * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
- */
- const should = require('chai').should()
- const SandboxedModule = require('sandboxed-module')
- const assert = require('assert')
- const path = require('path')
- const sinon = require('sinon')
- const modulePath = path.join(__dirname, './../../../index.js')
- const { expect } = require('chai')
- describe('index', function () {
- beforeEach(function () {
- let Cluster, IoRedis, ioredisConstructor
- this.settings = {}
- this.ioredisConstructor = ioredisConstructor = sinon.stub()
- this.ioredis = IoRedis = (function () {
- let createIoRedis
- IoRedis = class IoRedis {
- static initClass() {
- this.prototype.on = sinon.stub()
- createIoRedis = ioredisConstructor
- }
- constructor() {
- return createIoRedis.apply(this, arguments)
- }
- }
- IoRedis.initClass()
- return IoRedis
- })()
- this.ioredis.Cluster = Cluster = (function () {
- Cluster = class Cluster {
- static initClass() {
- this.prototype.on = sinon.stub()
- }
- constructor(config, options) {
- this.config = config
- this.options = options
- }
- }
- Cluster.initClass()
- return Cluster
- })()
- this.redis = SandboxedModule.require(modulePath, {
- requires: {
- ioredis: this.ioredis,
- },
- globals: {
- process: process,
- },
- })
- return (this.auth_pass = '1234 pass')
- })
- describe('redis-sentinel', function () {
- it('should throw an error when creating a client', function () {
- const redisSentinelOptions = {
- endpoints: ['127.0.0.1:1234', '127.0.0.1:2345', '127.0.0.1:3456'],
- }
- const createNewClient = () => {
- this.redis.createClient(redisSentinelOptions)
- }
- expect(createNewClient).to.throw(
- '@overleaf/redis-wrapper: redis-sentinel is no longer supported'
- )
- })
- })
- describe('single node redis', function () {
- beforeEach(function () {
- return (this.standardOpts = {
- auth_pass: this.auth_pass,
- port: 1234,
- host: 'redis.mysite.env',
- })
- })
- it('should work without opts', function () {
- this.redis.createClient()
- })
- it('should use the ioredis driver in single-instance mode if a non array is passed', function () {
- const client = this.redis.createClient(this.standardOpts)
- return assert.equal(client.constructor, this.ioredis)
- })
- return it('should call createClient for the ioredis driver in single-instance mode if a non array is passed', function () {
- const client = this.redis.createClient(this.standardOpts)
- return this.ioredisConstructor
- .calledWith(sinon.match(this.standardOpts))
- .should.equal(true)
- })
- })
- describe('cluster', function () {
- beforeEach(function () {
- this.cluster = [{ mock: 'cluster' }, { mock: 'cluster2' }]
- this.extraOptions = { keepAlive: 100 }
- return (this.settings = {
- cluster: this.cluster,
- redisOptions: this.extraOptions,
- key_schema: {
- foo(x) {
- return `${x}`
- },
- },
- })
- })
- it('should pass the options correctly though with no options', function () {
- const client = this.redis.createClient({ cluster: this.cluster })
- assert(client instanceof this.ioredis.Cluster)
- return client.config.should.deep.equal(this.cluster)
- })
- it('should not pass the key_schema through to the driver', function () {
- const client = this.redis.createClient({
- cluster: this.cluster,
- key_schema: 'foobar',
- })
- assert(client instanceof this.ioredis.Cluster)
- client.config.should.deep.equal(this.cluster)
- return expect(client.options).to.deep.equal({ retry_max_delay: 5000 })
- })
- return it('should pass the options correctly though with additional options', function () {
- const client = this.redis.createClient(this.settings)
- assert(client instanceof this.ioredis.Cluster)
- client.config.should.deep.equal(this.cluster)
- // need to use expect here because of _.clone in sandbox
- return expect(client.options).to.deep.equal({
- redisOptions: this.extraOptions,
- retry_max_delay: 5000,
- })
- })
- })
- return describe('monkey patch ioredis exec', function () {
- beforeEach(function () {
- this.callback = sinon.stub()
- this.results = []
- this.multiOrig = { exec: sinon.stub().yields(null, this.results) }
- this.client = { multi: sinon.stub().returns(this.multiOrig) }
- this.ioredisConstructor.returns(this.client)
- this.redis.createClient(this.client)
- return (this.multi = this.client.multi())
- })
- it('should return the old redis format for an array', function () {
- this.results[0] = [null, 42]
- this.results[1] = [null, 'foo']
- this.multi.exec(this.callback)
- return this.callback.calledWith(null, [42, 'foo']).should.equal(true)
- })
- return it('should return the old redis format when there is an error', function () {
- this.results[0] = [null, 42]
- this.results[1] = ['error', 'foo']
- this.multi.exec(this.callback)
- return this.callback.calledWith('error').should.equal(true)
- })
- })
- })
|