diff --git a/services/contacts/test/unit/js/ContactsManagerTests.js b/services/contacts/test/unit/js/ContactsManagerTests.js index 551b30c837..5fe8286a88 100644 --- a/services/contacts/test/unit/js/ContactsManagerTests.js +++ b/services/contacts/test/unit/js/ContactsManagerTests.js @@ -9,116 +9,135 @@ * 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 { - expect -} = chai; -const modulePath = "../../../app/js/ContactManager.js"; -const SandboxedModule = require('sandboxed-module'); -const { - ObjectId -} = require("mongojs"); -const tk = require("timekeeper"); +const sinon = require('sinon') +const chai = require('chai') +const should = chai.should() +const { expect } = chai +const modulePath = '../../../app/js/ContactManager.js' +const SandboxedModule = require('sandboxed-module') +const { ObjectId } = require('mongojs') +const tk = require('timekeeper') -describe("ContactManager", function() { - beforeEach(function() { - tk.freeze(Date.now()); - this.ContactManager = SandboxedModule.require(modulePath, { requires: { - "./mongojs": { - db: (this.db = {contacts: {}}), - ObjectId - }, - 'logger-sharelatex': {log: sinon.stub()}, - 'metrics-sharelatex': {timeAsyncMethod: sinon.stub()} - } - }); - this.user_id = ObjectId().toString(); - this.contact_id = ObjectId().toString(); - return this.callback = sinon.stub(); - }); - - afterEach(function() { return tk.reset(); }); +describe('ContactManager', function() { + beforeEach(function() { + tk.freeze(Date.now()) + this.ContactManager = SandboxedModule.require(modulePath, { + requires: { + './mongojs': { + db: (this.db = { contacts: {} }), + ObjectId + }, + 'logger-sharelatex': { log: sinon.stub() }, + 'metrics-sharelatex': { timeAsyncMethod: sinon.stub() } + } + }) + this.user_id = ObjectId().toString() + this.contact_id = ObjectId().toString() + return (this.callback = sinon.stub()) + }) - describe("touchContact", function() { - beforeEach(function() { - return this.db.contacts.update = sinon.stub().callsArg(3); - }); - - describe("with a valid user_id", function() { - beforeEach(function() { - return this.ContactManager.touchContact(this.user_id, (this.contact_id = "mock_contact"), this.callback); - }); - - it("should increment the contact count and timestamp", function() { - return this.db.contacts.update - .calledWith({ - user_id: sinon.match(o => o.toString() === this.user_id.toString()) - }, { - $inc: { - "contacts.mock_contact.n": 1 - }, - $set: { - "contacts.mock_contact.ts": new Date() - } - }, { - upsert: true - }) - .should.equal(true); - }); - - return it("should call the callback", function() { - return this.callback.called.should.equal(true); - }); - }); - - return describe("with an invalid user id", function() { - beforeEach(function() { - return this.ContactManager.touchContact("not-valid-object-id", this.contact_id, this.callback); - }); - - return it("should call the callback with an error", function() { - return this.callback.calledWith(new Error()).should.equal(true); - }); - }); - }); - - return describe("getContacts", function() { - beforeEach(function() { - this.user = { - contacts: ["mock", "contacts"] - }; - return this.db.contacts.findOne = sinon.stub().callsArgWith(1, null, this.user); - }); - - describe("with a valid user_id", function() { - beforeEach(function() { - return this.ContactManager.getContacts(this.user_id, this.callback); - }); - - it("should find the user's contacts", function() { - return this.db.contacts.findOne - .calledWith({ - user_id: sinon.match(o => o.toString() === this.user_id.toString()) - }) - .should.equal(true); - }); - - return it("should call the callback with the contacts", function() { - return this.callback.calledWith(null, this.user.contacts).should.equal(true); - }); - }); - - return describe("with an invalid user id", function() { - beforeEach(function() { - return this.ContactManager.getContacts("not-valid-object-id", this.callback); - }); - - return it("should call the callback with an error", function() { - return this.callback.calledWith(new Error()).should.equal(true); - }); - }); - }); -}); - + afterEach(function() { + return tk.reset() + }) + + describe('touchContact', function() { + beforeEach(function() { + return (this.db.contacts.update = sinon.stub().callsArg(3)) + }) + + describe('with a valid user_id', function() { + beforeEach(function() { + return this.ContactManager.touchContact( + this.user_id, + (this.contact_id = 'mock_contact'), + this.callback + ) + }) + + it('should increment the contact count and timestamp', function() { + return this.db.contacts.update + .calledWith( + { + user_id: sinon.match( + o => o.toString() === this.user_id.toString() + ) + }, + { + $inc: { + 'contacts.mock_contact.n': 1 + }, + $set: { + 'contacts.mock_contact.ts': new Date() + } + }, + { + upsert: true + } + ) + .should.equal(true) + }) + + return it('should call the callback', function() { + return this.callback.called.should.equal(true) + }) + }) + + return describe('with an invalid user id', function() { + beforeEach(function() { + return this.ContactManager.touchContact( + 'not-valid-object-id', + this.contact_id, + this.callback + ) + }) + + return it('should call the callback with an error', function() { + return this.callback.calledWith(new Error()).should.equal(true) + }) + }) + }) + + return describe('getContacts', function() { + beforeEach(function() { + this.user = { + contacts: ['mock', 'contacts'] + } + return (this.db.contacts.findOne = sinon + .stub() + .callsArgWith(1, null, this.user)) + }) + + describe('with a valid user_id', function() { + beforeEach(function() { + return this.ContactManager.getContacts(this.user_id, this.callback) + }) + + it("should find the user's contacts", function() { + return this.db.contacts.findOne + .calledWith({ + user_id: sinon.match(o => o.toString() === this.user_id.toString()) + }) + .should.equal(true) + }) + + return it('should call the callback with the contacts', function() { + return this.callback + .calledWith(null, this.user.contacts) + .should.equal(true) + }) + }) + + return describe('with an invalid user id', function() { + beforeEach(function() { + return this.ContactManager.getContacts( + 'not-valid-object-id', + this.callback + ) + }) + + return it('should call the callback with an error', function() { + return this.callback.calledWith(new Error()).should.equal(true) + }) + }) + }) +}) diff --git a/services/contacts/test/unit/js/HttpControllerTests.js b/services/contacts/test/unit/js/HttpControllerTests.js index d91475ce07..fd92a6a37d 100644 --- a/services/contacts/test/unit/js/HttpControllerTests.js +++ b/services/contacts/test/unit/js/HttpControllerTests.js @@ -10,150 +10,145 @@ * 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 { - expect -} = chai; -const modulePath = "../../../app/js/HttpController.js"; -const SandboxedModule = require('sandboxed-module'); +const sinon = require('sinon') +const chai = require('chai') +const should = chai.should() +const { expect } = chai +const modulePath = '../../../app/js/HttpController.js' +const SandboxedModule = require('sandboxed-module') -describe("HttpController", function() { - beforeEach(function() { - this.HttpController = SandboxedModule.require(modulePath, { requires: { - "./ContactManager": (this.ContactManager = {}), - "logger-sharelatex": (this.logger = { log: sinon.stub() }) - } - }); - this.user_id = "mock-user-id"; - this.contact_id = "mock-contact-id"; - - this.req = {}; - this.res = {}; - this.res.status = sinon.stub().returns(this.res); - this.res.end = sinon.stub(); - this.res.send = sinon.stub(); - return this.next = sinon.stub(); - }); +describe('HttpController', function() { + beforeEach(function() { + this.HttpController = SandboxedModule.require(modulePath, { + requires: { + './ContactManager': (this.ContactManager = {}), + 'logger-sharelatex': (this.logger = { log: sinon.stub() }) + } + }) + this.user_id = 'mock-user-id' + this.contact_id = 'mock-contact-id' - describe("addContact", function() { - beforeEach(function() { - this.req.params = - {user_id: this.user_id}; - return this.ContactManager.touchContact = sinon.stub().callsArg(2); - }); - - describe("with a valid user_id and contact_id", function() { - beforeEach(function() { - this.req.body = - {contact_id: this.contact_id}; - return this.HttpController.addContact(this.req, this.res, this.next); - }); - - it("should update the contact in the user's contact list", function() { - return this.ContactManager.touchContact - .calledWith(this.user_id, this.contact_id) - .should.equal(true); - }); - - it("should update the user in the contact's contact list", function() { - return this.ContactManager.touchContact - .calledWith(this.contact_id, this.user_id) - .should.equal(true); - }); - - return it("should send back a 204 status", function() { - this.res.status.calledWith(204).should.equal(true); - return this.res.end.called.should.equal(true); - }); - }); - - return describe("with an invalid contact id", function() { - beforeEach(function() { - this.req.body = - {contact_id: ""}; - return this.HttpController.addContact(this.req, this.res, this.next); - }); - - return it("should return 400, Bad Request", function() { - this.res.status.calledWith(400).should.equal(true); - return this.res.send.calledWith("contact_id should be a non-blank string").should.equal(true); - }); - }); - }); + this.req = {} + this.res = {} + this.res.status = sinon.stub().returns(this.res) + this.res.end = sinon.stub() + this.res.send = sinon.stub() + return (this.next = sinon.stub()) + }) - return describe("getContacts", function() { - beforeEach(function() { - this.req.params = - {user_id: this.user_id}; - const now = Date.now(); - this.contacts = { - "user-id-1": { n: 2, ts: new Date(now) }, - "user-id-2": { n: 4, ts: new Date(now) }, - "user-id-3": { n: 2, ts: new Date(now - 1000) } - }; - return this.ContactManager.getContacts = sinon.stub().callsArgWith(1, null, this.contacts); - }); + describe('addContact', function() { + beforeEach(function() { + this.req.params = { user_id: this.user_id } + return (this.ContactManager.touchContact = sinon.stub().callsArg(2)) + }) - describe("normally", function() { - beforeEach(function() { - return this.HttpController.getContacts(this.req, this.res, this.next); - }); - - it("should look up the contacts in mongo", function() { - return this.ContactManager.getContacts - .calledWith(this.user_id) - .should.equal(true); - }); - - return it("should return a sorted list of contacts by count and timestamp", function() { - return this.res.send - .calledWith({ - contact_ids: [ - "user-id-2", - "user-id-1", - "user-id-3" - ] - }) - .should.equal(true); - }); - }); - - describe("with more contacts than the limit", function() { - beforeEach(function() { - this.req.query = - {limit: 2}; - return this.HttpController.getContacts(this.req, this.res, this.next); - }); + describe('with a valid user_id and contact_id', function() { + beforeEach(function() { + this.req.body = { contact_id: this.contact_id } + return this.HttpController.addContact(this.req, this.res, this.next) + }) - return it("should return the most commonly used contacts up to the limit", function() { - return this.res.send - .calledWith({ - contact_ids: [ - "user-id-2", - "user-id-1" - ] - }) - .should.equal(true); - }); - }); - - describe("without a contact list", function() { - beforeEach(function() { - this.ContactManager.getContacts = sinon.stub().callsArgWith(1, null, null); - return this.HttpController.getContacts(this.req, this.res, this.next); - }); + it("should update the contact in the user's contact list", function() { + return this.ContactManager.touchContact + .calledWith(this.user_id, this.contact_id) + .should.equal(true) + }) - return it("should return an empty list", function() { - return this.res.send - .calledWith({ - contact_ids: [] - }) - .should.equal(true); - }); - }); - - return describe("with a holding account", function() { return it("should not return holding accounts"); }); - }); -}); \ No newline at end of file + it("should update the user in the contact's contact list", function() { + return this.ContactManager.touchContact + .calledWith(this.contact_id, this.user_id) + .should.equal(true) + }) + + return it('should send back a 204 status', function() { + this.res.status.calledWith(204).should.equal(true) + return this.res.end.called.should.equal(true) + }) + }) + + return describe('with an invalid contact id', function() { + beforeEach(function() { + this.req.body = { contact_id: '' } + return this.HttpController.addContact(this.req, this.res, this.next) + }) + + return it('should return 400, Bad Request', function() { + this.res.status.calledWith(400).should.equal(true) + return this.res.send + .calledWith('contact_id should be a non-blank string') + .should.equal(true) + }) + }) + }) + + return describe('getContacts', function() { + beforeEach(function() { + this.req.params = { user_id: this.user_id } + const now = Date.now() + this.contacts = { + 'user-id-1': { n: 2, ts: new Date(now) }, + 'user-id-2': { n: 4, ts: new Date(now) }, + 'user-id-3': { n: 2, ts: new Date(now - 1000) } + } + return (this.ContactManager.getContacts = sinon + .stub() + .callsArgWith(1, null, this.contacts)) + }) + + describe('normally', function() { + beforeEach(function() { + return this.HttpController.getContacts(this.req, this.res, this.next) + }) + + it('should look up the contacts in mongo', function() { + return this.ContactManager.getContacts + .calledWith(this.user_id) + .should.equal(true) + }) + + return it('should return a sorted list of contacts by count and timestamp', function() { + return this.res.send + .calledWith({ + contact_ids: ['user-id-2', 'user-id-1', 'user-id-3'] + }) + .should.equal(true) + }) + }) + + describe('with more contacts than the limit', function() { + beforeEach(function() { + this.req.query = { limit: 2 } + return this.HttpController.getContacts(this.req, this.res, this.next) + }) + + return it('should return the most commonly used contacts up to the limit', function() { + return this.res.send + .calledWith({ + contact_ids: ['user-id-2', 'user-id-1'] + }) + .should.equal(true) + }) + }) + + describe('without a contact list', function() { + beforeEach(function() { + this.ContactManager.getContacts = sinon + .stub() + .callsArgWith(1, null, null) + return this.HttpController.getContacts(this.req, this.res, this.next) + }) + + return it('should return an empty list', function() { + return this.res.send + .calledWith({ + contact_ids: [] + }) + .should.equal(true) + }) + }) + + return describe('with a holding account', function() { + return it('should not return holding accounts') + }) + }) +})