2019-05-15 08:25:20 +00:00
|
|
|
/* eslint-env node, mocha */
|
|
|
|
'use strict'
|
|
|
|
|
|
|
|
const assert = require('assert')
|
|
|
|
const mock = require('mock-require')
|
|
|
|
const sinon = require('sinon')
|
|
|
|
|
|
|
|
const { createFakeLogger } = require('../testDoubles/loggerFake')
|
|
|
|
const realtimeJobStub = require('../testDoubles/realtimeJobStub')
|
|
|
|
const { removeLibModuleCache, makeMockSocket } = require('./utils')
|
|
|
|
|
|
|
|
describe('realtime#ifMayEdit', function () {
|
|
|
|
let modelsStub
|
|
|
|
beforeEach(() => {
|
|
|
|
removeLibModuleCache()
|
|
|
|
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()
|
|
|
|
sinon.restore()
|
|
|
|
})
|
|
|
|
|
|
|
|
const Role = {
|
|
|
|
Guest: 'guest',
|
|
|
|
LoggedIn: 'LoggedIn',
|
|
|
|
Owner: 'Owner'
|
|
|
|
}
|
|
|
|
|
|
|
|
const Permission = {
|
|
|
|
Freely: 'freely',
|
|
|
|
Editable: 'editable',
|
|
|
|
Limited: 'limited',
|
|
|
|
Locked: 'locked',
|
|
|
|
Protected: 'protected',
|
|
|
|
Private: 'private'
|
|
|
|
}
|
|
|
|
|
|
|
|
const testcases = [
|
|
|
|
{ role: Role.Guest, permission: Permission.Freely, canEdit: true },
|
|
|
|
{ role: Role.LoggedIn, permission: Permission.Freely, canEdit: true },
|
|
|
|
{ role: Role.Owner, permission: Permission.Freely, canEdit: true },
|
|
|
|
{ role: Role.Guest, permission: Permission.Editable, canEdit: false },
|
|
|
|
{ role: Role.LoggedIn, permission: Permission.Editable, canEdit: true },
|
|
|
|
{ role: Role.Owner, permission: Permission.Editable, canEdit: true },
|
|
|
|
{ role: Role.Guest, permission: Permission.Limited, canEdit: false },
|
|
|
|
{ role: Role.LoggedIn, permission: Permission.Limited, canEdit: true },
|
|
|
|
{ role: Role.Owner, permission: Permission.Limited, canEdit: true },
|
|
|
|
{ role: Role.Guest, permission: Permission.Locked, canEdit: false },
|
|
|
|
{ role: Role.LoggedIn, permission: Permission.Locked, canEdit: false },
|
|
|
|
{ role: Role.Owner, permission: Permission.Locked, canEdit: true },
|
2019-05-24 03:40:16 +00:00
|
|
|
{ role: Role.Guest, permission: Permission.Protected, canEdit: false },
|
2019-05-15 08:25:20 +00:00
|
|
|
{ role: Role.LoggedIn, permission: Permission.Protected, canEdit: false },
|
|
|
|
{ role: Role.Owner, permission: Permission.Protected, canEdit: true },
|
|
|
|
{ role: Role.Guest, permission: Permission.Private, canEdit: false },
|
|
|
|
{ role: Role.LoggedIn, permission: Permission.Private, canEdit: false },
|
|
|
|
{ role: Role.Owner, permission: Permission.Private, canEdit: true }
|
|
|
|
]
|
|
|
|
|
|
|
|
const noteOwnerId = 'owner'
|
|
|
|
const loggedInUserId = 'user1'
|
|
|
|
const noteId = 'noteId'
|
|
|
|
|
|
|
|
testcases.forEach((tc) => {
|
|
|
|
it(`${tc.role} ${tc.canEdit ? 'can' : 'can\'t'} edit note with permission ${tc.permission}`, function () {
|
|
|
|
const client = makeMockSocket()
|
|
|
|
const note = {
|
|
|
|
permission: tc.permission,
|
|
|
|
owner: noteOwnerId
|
|
|
|
}
|
|
|
|
if (tc.role === Role.LoggedIn) {
|
|
|
|
client.request.user.logged_in = true
|
|
|
|
client.request.user.id = loggedInUserId
|
|
|
|
} else if (tc.role === Role.Owner) {
|
|
|
|
client.request.user.logged_in = true
|
|
|
|
client.request.user.id = noteOwnerId
|
|
|
|
}
|
|
|
|
client.noteId = noteId
|
2020-01-04 22:14:03 +00:00
|
|
|
const realtime = require('../../lib/realtime/realtime')
|
2019-05-15 08:25:20 +00:00
|
|
|
realtime.getNotePool()[noteId] = note
|
|
|
|
const callback = sinon.stub()
|
|
|
|
realtime.ifMayEdit(client, callback)
|
|
|
|
assert(callback.calledOnce)
|
|
|
|
assert(callback.lastCall.args[0] === tc.canEdit)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
it('should set lsatchangeuser to null if guest edit operation', function () {
|
|
|
|
const note = {
|
|
|
|
permission: Permission.Freely
|
|
|
|
}
|
|
|
|
const client = makeMockSocket()
|
|
|
|
client.noteId = noteId
|
|
|
|
const callback = sinon.stub()
|
|
|
|
client.origin = 'operation'
|
2020-01-04 22:14:03 +00:00
|
|
|
const realtime = require('../../lib/realtime/realtime')
|
2019-05-15 08:25:20 +00:00
|
|
|
realtime.getNotePool()[noteId] = note
|
|
|
|
realtime.ifMayEdit(client, callback)
|
|
|
|
assert(callback.calledOnce)
|
|
|
|
assert(callback.lastCall.args[0])
|
|
|
|
assert(note.lastchangeuser === null)
|
|
|
|
})
|
|
|
|
|
|
|
|
it('should set lastchangeuser to logged_in user id if user edit', function () {
|
|
|
|
const note = {
|
|
|
|
permission: Permission.Freely
|
|
|
|
}
|
|
|
|
const client = makeMockSocket()
|
|
|
|
client.noteId = noteId
|
|
|
|
client.request.user.logged_in = true
|
|
|
|
client.request.user.id = loggedInUserId
|
|
|
|
const callback = sinon.stub()
|
|
|
|
client.origin = 'operation'
|
2020-01-04 22:14:03 +00:00
|
|
|
const realtime = require('../../lib/realtime/realtime')
|
2019-05-15 08:25:20 +00:00
|
|
|
realtime.getNotePool()[noteId] = note
|
|
|
|
realtime.ifMayEdit(client, callback)
|
|
|
|
assert(callback.calledOnce)
|
|
|
|
assert(callback.lastCall.args[0])
|
|
|
|
assert(note.lastchangeuser === loggedInUserId)
|
|
|
|
})
|
|
|
|
})
|