|
@@ -1,5 +1,6 @@
|
|
|
sinon = require('sinon')
|
|
sinon = require('sinon')
|
|
|
chai = require('chai')
|
|
chai = require('chai')
|
|
|
|
|
+expect = chai.should
|
|
|
should = chai.should()
|
|
should = chai.should()
|
|
|
modulePath = "../../../app/js/Notifications.js"
|
|
modulePath = "../../../app/js/Notifications.js"
|
|
|
SandboxedModule = require('sandboxed-module')
|
|
SandboxedModule = require('sandboxed-module')
|
|
@@ -17,7 +18,6 @@ describe 'Notifications Tests', ->
|
|
|
@insertStub = sinon.stub()
|
|
@insertStub = sinon.stub()
|
|
|
@countStub = sinon.stub()
|
|
@countStub = sinon.stub()
|
|
|
@updateStub = sinon.stub()
|
|
@updateStub = sinon.stub()
|
|
|
- @findStub.cock = "helllo"
|
|
|
|
|
@mongojs = =>
|
|
@mongojs = =>
|
|
|
notifications:
|
|
notifications:
|
|
|
update: self.mongojsUpdate
|
|
update: self.mongojsUpdate
|
|
@@ -28,7 +28,10 @@ describe 'Notifications Tests', ->
|
|
|
@mongojs.ObjectId = ObjectId
|
|
@mongojs.ObjectId = ObjectId
|
|
|
|
|
|
|
|
@notifications = SandboxedModule.require modulePath, requires:
|
|
@notifications = SandboxedModule.require modulePath, requires:
|
|
|
- 'logger-sharelatex': log:->
|
|
|
|
|
|
|
+ 'logger-sharelatex': {
|
|
|
|
|
+ log:()->
|
|
|
|
|
+ error:()->
|
|
|
|
|
+ }
|
|
|
'settings-sharelatex': {}
|
|
'settings-sharelatex': {}
|
|
|
'mongojs':@mongojs
|
|
'mongojs':@mongojs
|
|
|
|
|
|
|
@@ -44,12 +47,26 @@ describe 'Notifications Tests', ->
|
|
|
done()
|
|
done()
|
|
|
|
|
|
|
|
describe 'addNotification', ->
|
|
describe 'addNotification', ->
|
|
|
- it 'should insert the notification into the collectionssss', (done)->
|
|
|
|
|
|
|
+ beforeEach ->
|
|
|
|
|
+ @stubbedNotification = {
|
|
|
|
|
+ user_id: ObjectId(user_id),
|
|
|
|
|
+ key:"notification-key",
|
|
|
|
|
+ messageOpts:"some info",
|
|
|
|
|
+ templateKey:"template-key"
|
|
|
|
|
+ }
|
|
|
|
|
+ @expectedDocument = {
|
|
|
|
|
+ user_id: @stubbedNotification.user_id,
|
|
|
|
|
+ key:"notification-key",
|
|
|
|
|
+ messageOpts:"some info",
|
|
|
|
|
+ templateKey:"template-key"
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ it 'should insert the notification into the collection', (done)->
|
|
|
@insertStub.callsArgWith(1, null)
|
|
@insertStub.callsArgWith(1, null)
|
|
|
@countStub.callsArgWith(1, null, 0)
|
|
@countStub.callsArgWith(1, null, 0)
|
|
|
|
|
|
|
|
@notifications.addNotification user_id, @stubbedNotification, (err)=>
|
|
@notifications.addNotification user_id, @stubbedNotification, (err)=>
|
|
|
- assert.deepEqual(@insertStub.args[0][0], @stubbedNotification)
|
|
|
|
|
|
|
+ @insertStub.calledWith(@expectedDocument).should.equal true
|
|
|
done()
|
|
done()
|
|
|
|
|
|
|
|
it 'should fail insert of existing notification key', (done)->
|
|
it 'should fail insert of existing notification key', (done)->
|
|
@@ -57,18 +74,71 @@ describe 'Notifications Tests', ->
|
|
|
@countStub.callsArgWith(1, null, 1)
|
|
@countStub.callsArgWith(1, null, 1)
|
|
|
|
|
|
|
|
@notifications.addNotification user_id, @stubbedNotification, (err)=>
|
|
@notifications.addNotification user_id, @stubbedNotification, (err)=>
|
|
|
- @insertStub.calledWith(@stubbedNotification).should.equal false
|
|
|
|
|
|
|
+ @insertStub.calledWith(@expectedDocument).should.equal false
|
|
|
done()
|
|
done()
|
|
|
|
|
|
|
|
|
|
+ describe 'when the notification is set to expire', () ->
|
|
|
|
|
+ beforeEach ->
|
|
|
|
|
+ @stubbedNotification = {
|
|
|
|
|
+ user_id: ObjectId(user_id),
|
|
|
|
|
+ key:"notification-key",
|
|
|
|
|
+ messageOpts:"some info",
|
|
|
|
|
+ templateKey:"template-key",
|
|
|
|
|
+ expires: '2922-02-13T09:32:56.289Z'
|
|
|
|
|
+ }
|
|
|
|
|
+ @expectedDocument = {
|
|
|
|
|
+ user_id: @stubbedNotification.user_id,
|
|
|
|
|
+ key:"notification-key",
|
|
|
|
|
+ messageOpts:"some info",
|
|
|
|
|
+ templateKey:"template-key",
|
|
|
|
|
+ expires: new Date(@stubbedNotification.expires),
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ it 'should add an `expires` Date field to the document', (done)->
|
|
|
|
|
+ @insertStub.callsArgWith(1, null)
|
|
|
|
|
+ @countStub.callsArgWith(1, null, 0)
|
|
|
|
|
+
|
|
|
|
|
+ @notifications.addNotification user_id, @stubbedNotification, (err)=>
|
|
|
|
|
+ @insertStub.callCount.should.equal 1
|
|
|
|
|
+ @insertStub.calledWith(@expectedDocument).should.equal true
|
|
|
|
|
+ done()
|
|
|
|
|
+
|
|
|
|
|
+ describe 'when the notification has a nonsensical expires field', () ->
|
|
|
|
|
+ beforeEach ->
|
|
|
|
|
+ @stubbedNotification = {
|
|
|
|
|
+ user_id: ObjectId(user_id),
|
|
|
|
|
+ key:"notification-key",
|
|
|
|
|
+ messageOpts:"some info",
|
|
|
|
|
+ templateKey:"template-key",
|
|
|
|
|
+ expires: 'WAT'
|
|
|
|
|
+ }
|
|
|
|
|
+ @expectedDocument = {
|
|
|
|
|
+ user_id: @stubbedNotification.user_id,
|
|
|
|
|
+ key:"notification-key",
|
|
|
|
|
+ messageOpts:"some info",
|
|
|
|
|
+ templateKey:"template-key",
|
|
|
|
|
+ expires: new Date(@stubbedNotification.expires),
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ it 'should produce an error', (done)->
|
|
|
|
|
+ @insertStub.callsArgWith(1, null)
|
|
|
|
|
+ @countStub.callsArgWith(1, null, 0)
|
|
|
|
|
+
|
|
|
|
|
+ @notifications.addNotification user_id, @stubbedNotification, (err)=>
|
|
|
|
|
+ (err instanceof Error).should.equal true
|
|
|
|
|
+ @insertStub.callCount.should.equal 0
|
|
|
|
|
+ @insertStub.calledWith(@expectedDocument).should.equal false
|
|
|
|
|
+ done()
|
|
|
|
|
+
|
|
|
describe 'removeNotificationId', ->
|
|
describe 'removeNotificationId', ->
|
|
|
it 'should mark the notification id as read', (done)->
|
|
it 'should mark the notification id as read', (done)->
|
|
|
@updateStub.callsArgWith(2, null)
|
|
@updateStub.callsArgWith(2, null)
|
|
|
|
|
|
|
|
@notifications.removeNotificationId user_id, notification_id, (err)=>
|
|
@notifications.removeNotificationId user_id, notification_id, (err)=>
|
|
|
- searchOps =
|
|
|
|
|
|
|
+ searchOps =
|
|
|
user_id:ObjectId(user_id)
|
|
user_id:ObjectId(user_id)
|
|
|
_id:ObjectId(notification_id)
|
|
_id:ObjectId(notification_id)
|
|
|
- updateOperation =
|
|
|
|
|
|
|
+ updateOperation =
|
|
|
"$unset": {templateKey:true, messageOpts:true}
|
|
"$unset": {templateKey:true, messageOpts:true}
|
|
|
assert.deepEqual(@updateStub.args[0][0], searchOps)
|
|
assert.deepEqual(@updateStub.args[0][0], searchOps)
|
|
|
assert.deepEqual(@updateStub.args[0][1], updateOperation)
|
|
assert.deepEqual(@updateStub.args[0][1], updateOperation)
|
|
@@ -79,10 +149,22 @@ describe 'Notifications Tests', ->
|
|
|
@updateStub.callsArgWith(2, null)
|
|
@updateStub.callsArgWith(2, null)
|
|
|
|
|
|
|
|
@notifications.removeNotificationKey user_id, notification_key, (err)=>
|
|
@notifications.removeNotificationKey user_id, notification_key, (err)=>
|
|
|
- searchOps =
|
|
|
|
|
|
|
+ searchOps =
|
|
|
user_id:ObjectId(user_id)
|
|
user_id:ObjectId(user_id)
|
|
|
key: notification_key
|
|
key: notification_key
|
|
|
- updateOperation =
|
|
|
|
|
|
|
+ updateOperation =
|
|
|
|
|
+ "$unset": {templateKey:true}
|
|
|
|
|
+ @updateStub.calledWith(searchOps, updateOperation).should.equal true
|
|
|
|
|
+ done()
|
|
|
|
|
+
|
|
|
|
|
+ describe 'removeNotificationByKeyOnly', ->
|
|
|
|
|
+ it 'should mark the notification key as read', (done)->
|
|
|
|
|
+ @updateStub.callsArgWith(2, null)
|
|
|
|
|
+
|
|
|
|
|
+ @notifications.removeNotificationByKeyOnly notification_key, (err)=>
|
|
|
|
|
+ searchOps =
|
|
|
|
|
+ key: notification_key
|
|
|
|
|
+ updateOperation =
|
|
|
"$unset": {templateKey:true}
|
|
"$unset": {templateKey:true}
|
|
|
assert.deepEqual(@updateStub.args[0][0], searchOps)
|
|
assert.deepEqual(@updateStub.args[0][0], searchOps)
|
|
|
assert.deepEqual(@updateStub.args[0][1], updateOperation)
|
|
assert.deepEqual(@updateStub.args[0][1], updateOperation)
|