/* * decaffeinate suggestions: * DS101: Remove unnecessary use of Array.from * 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'); const should = chai.should(); const modulePath = "../../../../app/js/ProjectHistoryRedisManager.js"; const SandboxedModule = require('sandboxed-module'); const tk = require("timekeeper"); describe("ProjectHistoryRedisManager", function() { beforeEach(function() { this.project_id = "project-id-123"; this.projectHistoryId = "history-id-123"; this.user_id = "user-id-123"; this.callback = sinon.stub(); this.rclient = {}; tk.freeze(new Date()); return this.ProjectHistoryRedisManager = SandboxedModule.require(modulePath, { requires: { "settings-sharelatex": (this.settings = { redis: { project_history: { key_schema: { projectHistoryOps({project_id}) { return `ProjectHistory:Ops:${project_id}`; }, projectHistoryFirstOpTimestamp({project_id}) { return `ProjectHistory:FirstOpTimestamp:${project_id}`; } } } } }), "redis-sharelatex": { createClient: () => this.rclient }, "logger-sharelatex": { log() {} }, "./Metrics": (this.metrics = { summary: sinon.stub()}) }, globals: { JSON: (this.JSON = JSON) } } ); }); afterEach(() => tk.reset()); describe("queueOps", function() { beforeEach(function() { this.ops = ["mock-op-1", "mock-op-2"]; this.multi = {exec: sinon.stub()}; this.multi.rpush = sinon.stub(); this.multi.setnx = sinon.stub(); this.rclient.multi = () => this.multi; // @rclient = multi: () => @multi return this.ProjectHistoryRedisManager.queueOps(this.project_id, ...Array.from(this.ops), this.callback); }); it("should queue an update", function() { return this.multi.rpush .calledWithExactly( `ProjectHistory:Ops:${this.project_id}`, this.ops[0], this.ops[1] ).should.equal(true); }); return it("should set the queue timestamp if not present", function() { return this.multi.setnx .calledWithExactly( `ProjectHistory:FirstOpTimestamp:${this.project_id}`, Date.now() ).should.equal(true); }); }); describe("queueRenameEntity", function() { beforeEach(function() { this.file_id = 1234; this.rawUpdate = { pathname: (this.pathname = '/old'), newPathname: (this.newPathname = '/new'), version: (this.version = 2) }; this.ProjectHistoryRedisManager.queueOps = sinon.stub(); return this.ProjectHistoryRedisManager.queueRenameEntity(this.project_id, this.projectHistoryId, 'file', this.file_id, this.user_id, this.rawUpdate, this.callback); }); return it("should queue an update", function() { const update = { pathname: this.pathname, new_pathname: this.newPathname, meta: { user_id: this.user_id, ts: new Date() }, version: this.version, projectHistoryId: this.projectHistoryId, file: this.file_id }; return this.ProjectHistoryRedisManager.queueOps .calledWithExactly(this.project_id, this.JSON.stringify(update), this.callback) .should.equal(true); }); }); return describe("queueAddEntity", function() { beforeEach(function() { this.rclient.rpush = sinon.stub().yields(); this.doc_id = 1234; this.rawUpdate = { pathname: (this.pathname = '/old'), docLines: (this.docLines = 'a\nb'), version: (this.version = 2), url: (this.url = 'filestore.example.com') }; this.ProjectHistoryRedisManager.queueOps = sinon.stub(); return this.ProjectHistoryRedisManager.queueAddEntity(this.project_id, this.projectHistoryId, 'doc', this.doc_id, this.user_id, this.rawUpdate, this.callback); }); it("should queue an update", function() { const update = { pathname: this.pathname, docLines: this.docLines, url: this.url, meta: { user_id: this.user_id, ts: new Date() }, version: this.version, projectHistoryId: this.projectHistoryId, doc: this.doc_id }; return this.ProjectHistoryRedisManager.queueOps .calledWithExactly(this.project_id, this.JSON.stringify(update), this.callback) .should.equal(true); }); describe("queueResyncProjectStructure", () => it("should queue an update", function() {})); return describe("queueResyncDocContent", () => it("should queue an update", function() {})); }); });