mirror of https://github.com/status-im/codimd.git
287 lines
8.1 KiB
JavaScript
287 lines
8.1 KiB
JavaScript
/* eslint-env node, mocha */
|
|
'use strict'
|
|
|
|
const assert = require('assert')
|
|
const mock = require('mock-require')
|
|
const sinon = require('sinon')
|
|
|
|
const { removeLibModuleCache } = require('./utils')
|
|
const { createFakeLogger } = require('../testDoubles/loggerFake')
|
|
const realtimeJobStub = require('../testDoubles/realtimeJobStub')
|
|
|
|
describe('realtime#updateNote', function () {
|
|
let modelsStub
|
|
let realtime
|
|
const now = 1546300800000
|
|
let clock
|
|
|
|
beforeEach(() => {
|
|
removeLibModuleCache()
|
|
clock = sinon.useFakeTimers({
|
|
now,
|
|
toFake: ['Date']
|
|
})
|
|
modelsStub = {
|
|
Note: {
|
|
findOne: sinon.stub()
|
|
},
|
|
User: {
|
|
findOne: sinon.stub()
|
|
}
|
|
}
|
|
|
|
mock('../../lib/config', {})
|
|
mock('../../lib/logger', createFakeLogger())
|
|
mock('../../lib/models', modelsStub)
|
|
mock('../../lib/realtimeUpdateDirtyNoteJob', realtimeJobStub)
|
|
mock('../../lib/realtimeCleanDanglingUserJob', realtimeJobStub)
|
|
// mock('../../lib/realtimeSaveRevisionJob', realtimeJobStub)
|
|
})
|
|
|
|
afterEach(() => {
|
|
mock.stopAll()
|
|
clock.restore()
|
|
sinon.restore()
|
|
removeLibModuleCache()
|
|
})
|
|
|
|
it('should save history to each edited user', function (done) {
|
|
modelsStub.Note.findOne.returns(Promise.resolve({}))
|
|
realtime = require('../../lib/realtime')
|
|
const updateHistoryStub = sinon.stub(realtime, 'updateHistory')
|
|
|
|
const callback = sinon.stub()
|
|
const note = {
|
|
tempUsers: {
|
|
'user1': Date.now()
|
|
}
|
|
}
|
|
realtime.updateNote(note, callback)
|
|
clock.restore()
|
|
setTimeout(() => {
|
|
assert(updateHistoryStub.calledOnce)
|
|
assert(updateHistoryStub.lastCall.calledWith('user1', note, now))
|
|
done()
|
|
}, 50)
|
|
})
|
|
|
|
it('should set lastchangeprofile when lastchangeuser is set', function (done) {
|
|
const callback = sinon.stub()
|
|
|
|
const note = {
|
|
lastchangeuser: 'user1'
|
|
}
|
|
|
|
modelsStub.Note.findOne.returns(Promise.resolve({}))
|
|
|
|
modelsStub.User.findOne.withArgs({
|
|
where: {
|
|
id: 'user1'
|
|
}
|
|
}).returns(Promise.resolve({
|
|
id: 'user1',
|
|
profile: '{ "displayName": "User 01" }'
|
|
}))
|
|
modelsStub.User.getProfile = sinon.stub().returns({
|
|
name: 'User 01'
|
|
})
|
|
|
|
realtime = require('../../lib/realtime')
|
|
|
|
realtime.updateNote(note, callback)
|
|
clock.restore()
|
|
setTimeout(() => {
|
|
assert(note.lastchangeuserprofile.name === 'User 01')
|
|
done()
|
|
}, 50)
|
|
})
|
|
|
|
it('should save note with new data', function (done) {
|
|
const callback = sinon.stub()
|
|
const note = {
|
|
lastchangeuser: 'user1',
|
|
server: {
|
|
document: '# title\n\n## test2'
|
|
},
|
|
authorship: []
|
|
}
|
|
|
|
modelsStub.Note.parseNoteTitle = sinon.stub().returns('title')
|
|
const updateNoteStub = sinon.stub().returns(Promise.resolve({}))
|
|
modelsStub.Note.findOne.returns(Promise.resolve({
|
|
update: updateNoteStub
|
|
}))
|
|
|
|
modelsStub.User.findOne.withArgs({
|
|
where: {
|
|
id: 'user1'
|
|
}
|
|
}).returns(Promise.resolve({
|
|
id: 'user1',
|
|
profile: '{ "displayName": "User 01" }'
|
|
}))
|
|
modelsStub.User.getProfile = sinon.stub().returns({
|
|
name: 'User 01'
|
|
})
|
|
clock.tick(1000)
|
|
|
|
realtime = require('../../lib/realtime')
|
|
realtime.updateNote(note, callback)
|
|
setTimeout(() => {
|
|
assert(note.lastchangeuserprofile.name === 'User 01')
|
|
assert(callback.calledOnce)
|
|
assert(callback.lastCall.args[0] === null)
|
|
assert(updateNoteStub.calledOnce)
|
|
assert(updateNoteStub.lastCall.args[0].lastchangeAt === now + 1000)
|
|
assert(updateNoteStub.lastCall.args[0].title === 'title')
|
|
assert(updateNoteStub.lastCall.args[0].content === '# title\n\n## test2')
|
|
done()
|
|
}, 50)
|
|
})
|
|
|
|
it('should save note when lsatChangeUser is guest', function (done) {
|
|
const callback = sinon.stub()
|
|
const note = {
|
|
server: {
|
|
document: '# title\n\n## test2'
|
|
},
|
|
authorship: []
|
|
}
|
|
|
|
modelsStub.Note.parseNoteTitle = sinon.stub().returns('title')
|
|
const updateNoteStub = sinon.stub().returns(Promise.resolve({}))
|
|
modelsStub.Note.findOne.returns(Promise.resolve({
|
|
update: updateNoteStub
|
|
}))
|
|
|
|
modelsStub.User.getProfile = sinon.stub().returns({
|
|
name: 'User 01'
|
|
})
|
|
clock.tick(1000)
|
|
|
|
realtime = require('../../lib/realtime')
|
|
realtime.updateNote(note, callback)
|
|
setTimeout(() => {
|
|
assert(modelsStub.User.findOne.callCount === 0)
|
|
assert(note.lastchangeuserprofile === null)
|
|
assert(callback.calledOnce)
|
|
assert(callback.lastCall.args[0] === null)
|
|
assert(updateNoteStub.calledOnce)
|
|
assert(updateNoteStub.lastCall.args[0].lastchangeAt === now + 1000)
|
|
assert(updateNoteStub.lastCall.args[0].title === 'title')
|
|
assert(updateNoteStub.lastCall.args[0].content === '# title\n\n## test2')
|
|
done()
|
|
}, 50)
|
|
})
|
|
|
|
it('should save note when lastChangeUser as same as database', function (done) {
|
|
const callback = sinon.stub()
|
|
const note = {
|
|
lastchangeuser: 'user1',
|
|
server: {
|
|
document: '# title\n\n## test2'
|
|
},
|
|
authorship: []
|
|
}
|
|
|
|
modelsStub.Note.parseNoteTitle = sinon.stub().returns('title')
|
|
const updateNoteStub = sinon.stub().returns(Promise.resolve({}))
|
|
modelsStub.Note.findOne.returns(Promise.resolve({
|
|
update: updateNoteStub,
|
|
lastchangeuserId: 'user1'
|
|
}))
|
|
|
|
modelsStub.User.getProfile = sinon.stub().returns({
|
|
name: 'User 01'
|
|
})
|
|
clock.tick(1000)
|
|
|
|
realtime = require('../../lib/realtime')
|
|
realtime.updateNote(note, callback)
|
|
setTimeout(() => {
|
|
assert(modelsStub.User.findOne.callCount === 0)
|
|
assert(modelsStub.User.getProfile.callCount === 0)
|
|
assert(callback.calledOnce)
|
|
assert(callback.lastCall.args[0] === null)
|
|
assert(updateNoteStub.calledOnce)
|
|
assert(updateNoteStub.lastCall.args[0].lastchangeAt === now + 1000)
|
|
assert(updateNoteStub.lastCall.args[0].lastchangeuserId === 'user1')
|
|
assert(updateNoteStub.lastCall.args[0].title === 'title')
|
|
assert(updateNoteStub.lastCall.args[0].content === '# title\n\n## test2')
|
|
done()
|
|
}, 50)
|
|
})
|
|
|
|
it('should not save note when lastChangeUser not found in database', function (done) {
|
|
const callback = sinon.stub()
|
|
const note = {
|
|
lastchangeuser: 'user1',
|
|
server: {
|
|
document: '# title\n\n## test2'
|
|
},
|
|
authorship: []
|
|
}
|
|
|
|
modelsStub.Note.parseNoteTitle = sinon.stub().returns('title')
|
|
const updateNoteStub = sinon.stub().returns(Promise.resolve({}))
|
|
modelsStub.Note.findOne.returns(Promise.resolve({
|
|
update: updateNoteStub
|
|
}))
|
|
modelsStub.User.findOne.returns(Promise.resolve(null))
|
|
modelsStub.User.getProfile = sinon.stub().returns({
|
|
name: 'User 01'
|
|
})
|
|
clock.tick(1000)
|
|
|
|
realtime = require('../../lib/realtime')
|
|
realtime.updateNote(note, callback)
|
|
setTimeout(() => {
|
|
assert(modelsStub.User.findOne.called)
|
|
assert(modelsStub.User.getProfile.callCount === 0)
|
|
assert(callback.calledOnce)
|
|
assert(callback.lastCall.args[0] === null)
|
|
assert(callback.lastCall.args[1] === null)
|
|
assert(updateNoteStub.callCount === 0)
|
|
done()
|
|
}, 50)
|
|
})
|
|
|
|
it('should not save note when note.server not exists', function (done) {
|
|
const callback = sinon.stub()
|
|
const note = {
|
|
lastchangeuser: 'user1',
|
|
authorship: []
|
|
}
|
|
|
|
modelsStub.Note.parseNoteTitle = sinon.stub().returns('title')
|
|
const updateNoteStub = sinon.stub().returns(Promise.resolve({}))
|
|
modelsStub.Note.findOne.returns(Promise.resolve({
|
|
update: updateNoteStub
|
|
}))
|
|
|
|
modelsStub.User.findOne.withArgs({
|
|
where: {
|
|
id: 'user1'
|
|
}
|
|
}).returns(Promise.resolve({
|
|
id: 'user1',
|
|
profile: '{ "displayName": "User 01" }'
|
|
}))
|
|
modelsStub.User.getProfile = sinon.stub().returns({
|
|
name: 'User 01'
|
|
})
|
|
clock.tick(1000)
|
|
|
|
realtime = require('../../lib/realtime')
|
|
realtime.updateNote(note, callback)
|
|
setTimeout(() => {
|
|
assert(note.lastchangeuserprofile.name === 'User 01')
|
|
assert(callback.calledOnce)
|
|
assert(callback.lastCall.args[0] === null)
|
|
assert(callback.lastCall.args[1] === null)
|
|
assert(updateNoteStub.callCount === 0)
|
|
done()
|
|
}, 50)
|
|
})
|
|
})
|