SandboxedModule = require('sandboxed-module')
assert = require('assert')
require('chai').should()
sinon = require('sinon')
modulePath = require('path').join __dirname, '../../../../app/js/Features/SystemMessages/SystemMessageManager.js'


describe 'SystemMessageManager', ->
	beforeEach ->
		@SystemMessage = {}
		@SystemMessageManager = SandboxedModule.require modulePath, requires:
			"../../models/SystemMessage": SystemMessage: @SystemMessage
		@callback = sinon.stub()
			
	describe "getMessage", ->
		beforeEach ->
			@messages = ["messages-stub"]
			@SystemMessage.find = sinon.stub().callsArgWith(1, null, @messages)
			
		describe "when the messages are not cached", ->
			beforeEach ->
				@SystemMessageManager.getMessages @callback
				
			it "should look the messages up in the database", ->
				@SystemMessage.find
					.calledWith({})
					.should.equal true
					
			it "should return the messages", ->
				@callback.calledWith(null, @messages).should.equal true
				
			it "should cache the messages", ->
				@SystemMessageManager._cachedMessages.should.equal @messages
				
		describe "when the messages are cached", ->
			beforeEach ->
				@SystemMessageManager._cachedMessages = @messages
				@SystemMessageManager.getMessages @callback
				
			it "should not look the messages up in the database", ->
				@SystemMessage.find.called.should.equal false
					
			it "should return the messages", ->
				@callback.calledWith(null, @messages).should.equal true
				
	describe "clearMessages", ->
		beforeEach ->
			@SystemMessage.remove = sinon.stub().callsArg(1)
			@SystemMessageManager.clearMessages @callback
			
		it "should remove the messages from the database", ->
			@SystemMessage.remove
				.calledWith({})
				.should.equal true
				
		it "should return the callback", ->
			@callback.called.should.equal true