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

192 lines
5.7 KiB
JavaScript
Raw Normal View History

/*
* 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(done=> 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 },
2014-03-25 07:40:48 -04:00
v: 3
}], error => {
if (error != null) { throw error; }
return TrackChangesClient.flushDoc(this.project_id, this.doc_id, function(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, function(error, updates) {
expect(updates[0].pack[0].op).to.deep.equal([{
2014-03-25 07:40:48 -04:00
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, function(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, function(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, function(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, function(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, function(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, function(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, function(error, updates) {
expect(updates[0].expiresAt).to.not.exist;
return done();
});
return null;
});
});
});
});