overleaf/services/real-time/test/acceptance/js/ClientTrackingTests.js

198 lines
5.2 KiB
JavaScript

/* eslint-disable
camelcase,
handle-callback-err,
no-unused-vars,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
* decaffeinate suggestions:
* DS101: Remove unnecessary use of Array.from
* 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 chai = require("chai");
const {
expect
} = chai;
chai.should();
const RealTimeClient = require("./helpers/RealTimeClient");
const MockWebServer = require("./helpers/MockWebServer");
const FixturesManager = require("./helpers/FixturesManager");
const async = require("async");
describe("clientTracking", function() {
describe("when a client updates its cursor location", function() {
before(function(done) {
return async.series([
cb => {
return FixturesManager.setUpProject({
privilegeLevel: "owner",
project: { name: "Test Project" }
}, (error, {user_id, project_id}) => { this.user_id = user_id; this.project_id = project_id; return cb(); });
},
cb => {
return FixturesManager.setUpDoc(this.project_id, {lines: this.lines, version: this.version, ops: this.ops}, (e, {doc_id}) => {
this.doc_id = doc_id;
return cb(e);
});
},
cb => {
this.clientA = RealTimeClient.connect();
return this.clientA.on("connectionAccepted", cb);
},
cb => {
this.clientB = RealTimeClient.connect();
return this.clientB.on("connectionAccepted", cb);
},
cb => {
return this.clientA.emit("joinProject", {
project_id: this.project_id
}, cb);
},
cb => {
return this.clientA.emit("joinDoc", this.doc_id, cb);
},
cb => {
return this.clientB.emit("joinProject", {
project_id: this.project_id
}, cb);
},
cb => {
this.updates = [];
this.clientB.on("clientTracking.clientUpdated", data => {
return this.updates.push(data);
});
return this.clientA.emit("clientTracking.updatePosition", {
row: (this.row = 42),
column: (this.column = 36),
doc_id: this.doc_id
}, (error) => {
if (error != null) { throw error; }
return setTimeout(cb, 300);
});
} // Give the message a chance to reach client B.
], done);
});
it("should tell other clients about the update", function() {
return this.updates.should.deep.equal([
{
row: this.row,
column: this.column,
doc_id: this.doc_id,
id: this.clientA.publicId,
user_id: this.user_id,
name: "Joe Bloggs"
}
]);
});
return it("should record the update in getConnectedUsers", function(done) {
return this.clientB.emit("clientTracking.getConnectedUsers", (error, users) => {
for (const user of Array.from(users)) {
if (user.client_id === this.clientA.publicId) {
expect(user.cursorData).to.deep.equal({
row: this.row,
column: this.column,
doc_id: this.doc_id
});
return done();
}
}
throw new Error("user was never found");
});
});
});
return describe("when an anonymous client updates its cursor location", function() {
before(function(done) {
return async.series([
cb => {
return FixturesManager.setUpProject({
privilegeLevel: "owner",
project: { name: "Test Project" },
publicAccess: "readAndWrite"
}, (error, {user_id, project_id}) => { this.user_id = user_id; this.project_id = project_id; return cb(); });
},
cb => {
return FixturesManager.setUpDoc(this.project_id, {lines: this.lines, version: this.version, ops: this.ops}, (e, {doc_id}) => {
this.doc_id = doc_id;
return cb(e);
});
},
cb => {
this.clientA = RealTimeClient.connect();
return this.clientA.on("connectionAccepted", cb);
},
cb => {
return this.clientA.emit("joinProject", {
project_id: this.project_id
}, cb);
},
cb => {
return RealTimeClient.setSession({}, cb);
},
cb => {
this.anonymous = RealTimeClient.connect();
return this.anonymous.on("connectionAccepted", cb);
},
cb => {
return this.anonymous.emit("joinProject", {
project_id: this.project_id
}, cb);
},
cb => {
return this.anonymous.emit("joinDoc", this.doc_id, cb);
},
cb => {
this.updates = [];
this.clientA.on("clientTracking.clientUpdated", data => {
return this.updates.push(data);
});
return this.anonymous.emit("clientTracking.updatePosition", {
row: (this.row = 42),
column: (this.column = 36),
doc_id: this.doc_id
}, (error) => {
if (error != null) { throw error; }
return setTimeout(cb, 300);
});
} // Give the message a chance to reach client B.
], done);
});
return it("should tell other clients about the update", function() {
return this.updates.should.deep.equal([
{
row: this.row,
column: this.column,
doc_id: this.doc_id,
id: this.anonymous.publicId,
user_id: "anonymous-user",
name: ""
}
]);
});
});
});