overleaf/services/track-changes/test/acceptance/js/FlushingUpdatesTests.js

197 lines
5.8 KiB
JavaScript

/* 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
* DS207: Consider shorter variations of null checks
* 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 request = require("request");
const rclient = require("redis").createClient(Settings.redis.history); // Only works locally for now
const TrackChangesApp = require("./helpers/TrackChangesApp");
const TrackChangesClient = require("./helpers/TrackChangesClient");
const MockWebApi = require("./helpers/MockWebApi");
describe("Flushing updates", function() {
before(function(done) { return TrackChangesApp.ensureRunning(done); });
describe("flushing a doc's updates", function() {
before(function(done) {
this.project_id = ObjectId().toString();
this.doc_id = ObjectId().toString();
this.user_id = ObjectId().toString();
MockWebApi.projects[this.project_id] = {features: {versioning: true}};
TrackChangesClient.pushRawUpdates(this.project_id, this.doc_id, [{
op: [{ i: "f", p: 3 }],
meta: { ts: Date.now(), user_id: this.user_id },
v: 3
}], error => {
if (error != null) { throw error; }
return TrackChangesClient.flushDoc(this.project_id, this.doc_id, (error) => {
if (error != null) { throw error; }
return done();
});
});
return null;
});
return it("should flush the op into mongo", function(done) {
TrackChangesClient.getCompressedUpdates(this.doc_id, (error, updates) => {
expect(updates[0].pack[0].op).to.deep.equal([{
p: 3, i: "f"
}]);
return done();
});
return null;
});
});
return describe("flushing a project's updates", function() {
describe("with versioning enabled", function() {
before(function(done) {
this.project_id = ObjectId().toString();
this.doc_id = ObjectId().toString();
this.user_id = ObjectId().toString();
this.weeks = 7 * 24 * 60 * 60 * 1000;
MockWebApi.projects[this.project_id] = {
features: {
versioning: true
}
};
TrackChangesClient.pushRawUpdates(this.project_id, this.doc_id, [{
op: [{ i: "g", p: 2 }],
meta: { ts: Date.now() - (2 * this.weeks), user_id: this.user_id },
v: 2
}, {
op: [{ i: "f", p: 3 }],
meta: { ts: Date.now(), user_id: this.user_id },
v: 3
}], error => {
if (error != null) { throw error; }
return TrackChangesClient.flushProject(this.project_id, (error) => {
if (error != null) { throw error; }
return done();
});
});
return null;
});
it("should not mark the updates for deletion", function(done) {
TrackChangesClient.getCompressedUpdates(this.doc_id, (error, updates) => {
expect(updates[0].expiresAt).to.not.exist;
return done();
});
return null;
});
return it("should preserve history forever", function(done) {
TrackChangesClient.getProjectMetaData(this.project_id, (error, project) => {
expect(project.preserveHistory).to.equal(true);
return done();
});
return null;
});
});
describe("without versioning enabled", function() {
before(function(done) {
this.project_id = ObjectId().toString();
this.doc_id = ObjectId().toString();
this.user_id = ObjectId().toString();
this.weeks = 7 * 24 * 60 * 60 * 1000;
MockWebApi.projects[this.project_id] = {
features: {
versioning: false
}
};
TrackChangesClient.pushRawUpdates(this.project_id, this.doc_id, [{
op: [{ i: "g", p: 2 }],
meta: { ts: Date.now() - (2 * this.weeks), user_id: this.user_id },
v: 2
}, {
op: [{ i: "f", p: 3 }],
meta: { ts: Date.now(), user_id: this.user_id },
v: 3
}], error => {
if (error != null) { throw error; }
return TrackChangesClient.flushProject(this.project_id, (error) => {
if (error != null) { throw error; }
return done();
});
});
return null;
});
return it("should mark the updates for deletion", function(done) {
TrackChangesClient.getCompressedUpdates(this.doc_id, (error, updates) => {
expect(updates[0].expiresAt).to.exist;
return done();
});
return null;
});
});
return describe("without versioning enabled but with preserveHistory set to true", function() {
before(function(done) {
this.project_id = ObjectId().toString();
this.doc_id = ObjectId().toString();
this.user_id = ObjectId().toString();
this.weeks = 7 * 24 * 60 * 60 * 1000;
MockWebApi.projects[this.project_id] = {
features: {
versioning: false
}
};
TrackChangesClient.setPreserveHistoryForProject(this.project_id, error => {
if (error != null) { throw error; }
return TrackChangesClient.pushRawUpdates(this.project_id, this.doc_id, [{
op: [{ i: "g", p: 2 }],
meta: { ts: Date.now() - (2 * this.weeks), user_id: this.user_id },
v: 2
}, {
op: [{ i: "f", p: 3 }],
meta: { ts: Date.now(), user_id: this.user_id },
v: 3
}], error => {
if (error != null) { throw error; }
return TrackChangesClient.flushProject(this.project_id, (error) => {
if (error != null) { throw error; }
return done();
});
});
});
return null;
});
return it("should not mark the updates for deletion", function(done) {
TrackChangesClient.getCompressedUpdates(this.doc_id, (error, updates) => {
expect(updates[0].expiresAt).to.not.exist;
return done();
});
return null;
});
});
});
});