require '../helpers'

{BattleServer} = require('../../server/server')
{Room} = require '../../server/rooms'
{User} = require '../../server/user'

describe "A server room:", ->
  beforeEach ->
    @server = new BattleServer()
    @spark1 = @stubSpark()
    @spark2 = @stubSpark()
    @user1 = @server.findOrCreateUser(id: 1, name: 'aaaa', @spark1)
    @user2 = @server.findOrCreateUser(id: 2, name: 'bbbb', @spark2)
    @room = new Room('derp')
    @room.add(@spark1)
    @room.add(@spark2)

  describe "#message", ->
    it "sends a message to all users in that room", ->
      mock1 = @sandbox.mock(@user1)
      mock1.expects('send').withArgs("rawMessage", @room.name, "hello").once()
      mock2 = @sandbox.mock(@user2)
      mock2.expects('send').withArgs("rawMessage", @room.name, "hello").once()

      @room.message("hello")
      mock1.verify()
      mock2.verify()

  describe "#userMessage", ->
    it "sends a message to all users in that room", ->
      mock1 = @sandbox.mock(@user1).expects('send')
      mock1.withArgs("userMessage", @room.name, @user1.name, "hello").once()
      mock2 = @sandbox.mock(@user2).expects('send').once()
      mock2.withArgs("userMessage", @room.name, @user1.name, "hello").once()

      @room.userMessage(@user1, "hello")
      mock1.verify()
      mock2.verify()

  describe "#setTopic", ->
    it "sends a topic message to all users in that room", ->
      mock1 = @sandbox.mock(@user1).expects('send')
      mock1.withArgs("topic", "a test").once()
      mock2 = @sandbox.mock(@user2).expects('send').once()
      mock2.withArgs("topic", "a test").once()

      @room.setTopic("a test")
      mock1.verify()
      mock2.verify()

  describe "#userJSON", ->
    it "returns an array containing the JSON of all users", ->
      @room.toJSON().should.eql([ @user1.toJSON(), @user2.toJSON() ])

  describe "#send", ->
    it "broadcasts to every single user, including ones on the same account", ->
      mock1 = @sandbox.mock(@user1).expects('send').withArgs('hello').once()
      mock2 = @sandbox.mock(@user2).expects('send').withArgs('hello').once()
      @room.send("hello")
      mock1.verify()
      mock2.verify()

    it "stops broadcasting to sparks that leave", ->
      spy1 = @sandbox.spy(@user1, 'send')
      spy2 = @sandbox.spy(@user2, 'send')

      @room.remove(@spark1)
      @room.send("hello")

      spy1.withArgs('hello').called.should.be.false
      spy2.withArgs('hello').calledOnce.should.be.true

      @room.remove(@spark2)
      @room.send("hello")
      spy1.withArgs('hello').called.should.be.false
      spy2.withArgs('hello').calledOnce.should.be.true
