mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-07 20:31:06 -05:00
191 lines
5 KiB
JavaScript
191 lines
5 KiB
JavaScript
/*
|
|
* 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
|
|
}, function(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 (let 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
|
|
}, function(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: ""
|
|
}
|
|
]);
|
|
});
|
|
});
|
|
});
|