Permalink
Find file
Fetching contributors…
Cannot retrieve contributors at this time
176 lines (143 sloc) 5.26 KB
require 'test_helper'
class ServerTest < Test::Unit::TestCase
include JsChatHelpers
def setup
@jschat = JsChatMock.new
@jschat.post_init
end
def teardown
@jschat.reset
end
def test_identify
response = JSON.parse @jschat.receive_line({ 'identify' => 'alex' }.to_json)
assert_equal 'identified', response['display']
end
def test_invalid_identify
response = JSON.parse @jschat.receive_line({ 'identify' => '@lex' }.to_json)
assert_equal JsChat::Errors::Codes.invert[:invalid_name], response['error']['code']
end
def test_identify_twice_fails
identify_as 'alex'
result = JSON.parse identify_as('alex')
assert_equal 106, result['error']['code']
end
def test_ensure_nicks_are_longer_than_0
result = JSON.parse identify_as('')
assert result['error']
end
def test_ensure_nicks_are_unique
identify_as 'alex'
# Obvious duplicate
result = identify_as 'alex'
assert result['error']
# Case
result = identify_as 'Alex'
assert result['error']
end
def test_invalid_room_name
identify_as 'bob'
response = JSON.parse @jschat.receive_line({ 'join' => 'oublinet' }.to_json)
assert_equal 'Invalid room name', response['error']['message']
end
def test_join
identify_as 'bob'
expected = { 'display' => 'join', 'join' => { 'user' => 'bob', 'room' => '#oublinet' } }.to_json + "\n"
assert_equal expected, @jschat.receive_line({ 'join' => '#oublinet' }.to_json)
end
def test_join_without_identifying
response = JSON.parse @jschat.receive_line({ 'join' => '#oublinet' }.to_json)
assert response['error']
end
def test_join_more_than_once
identify_as 'bob'
expected = { 'display' => 'error', 'error' => { 'message' => 'Already in that room' } }.to_json + "\n"
@jschat.receive_line({ 'join' => '#oublinet' }.to_json)
response = JSON.parse @jschat.receive_line({ 'join' => '#oublinet' }.to_json)
assert_equal JsChat::Errors::Codes.invert[:already_joined], response['error']['code']
end
def test_names
identify_as 'nick', '#oublinet'
# Add a user
@jschat.add_user 'alex', '#oublinet'
response = JSON.parse(@jschat.receive_line({ 'names' => '#oublinet' }.to_json))
assert response['names']
end
def test_valid_names
user = JsChat::User.new nil
['alex*', "alex\n"].each do |name|
assert_raises JsChat::Errors::InvalidName do
user.name = name
end
end
end
def test_message_not_in_room
identify_as 'nick', '#oublinet'
@jschat.add_user 'alex', '#oublinet'
response = JSON.parse @jschat.receive_line({ 'send' => 'hello', 'to' => '#merk' }.to_json)
assert_equal 'Please join this room first', response['error']['message']
end
def test_message
identify_as 'nick', '#oublinet'
@jschat.add_user 'alex', '#oublinet'
assert @jschat.receive_line({ 'send' => 'hello', 'to' => '#oublinet' }.to_json)
end
def test_message_ignores_case
identify_as 'nick', '#oublinet'
@jschat.add_user 'alex', '#oublinet'
response = @jschat.receive_line({ 'send' => 'hello', 'to' => '#Oublinet' }.to_json)
assert response
end
def test_part
identify_as 'nick', '#oublinet'
@jschat.add_user 'alex', '#oublinet'
response = JSON.parse @jschat.receive_line({ 'part' => '#oublinet'}.to_json)
assert_equal '#oublinet', response['part']['room']
end
def test_private_message
identify_as 'nick'
@jschat.add_user 'alex', '#oublinet'
response = JSON.parse @jschat.receive_line({ 'send' => 'hello', 'to' => 'alex' }.to_json)
assert_equal 'hello', response['message']['message']
end
def test_private_message_ignores_case
identify_as 'nick'
@jschat.add_user 'alex', '#oublinet'
response = JSON.parse @jschat.receive_line({ 'send' => 'hello', 'to' => 'Alex' }.to_json)
assert_equal 'hello', response['message']['message']
end
def test_log_request
identify_as 'nick', '#oublinet'
@jschat.receive_line({ 'send' => 'hello', 'to' => '#oublinet' }.to_json)
response = JSON.parse @jschat.receive_line({ 'lastlog' => '#oublinet' }.to_json)
assert_equal 'hello', response['messages'].last['message']['message']
end
def test_name_change
identify_as 'nick', '#oublinet'
@jschat.add_user 'alex', '#oublinet'
response = JSON.parse @jschat.receive_line({ 'change' => 'user', 'user' => { 'name' => 'bob' }}.to_json)
assert_equal 'notice', response['display']
end
def test_name_change_duplicate
identify_as 'nick', '#oublinet'
@jschat.add_user 'alex', '#oublinet'
response = JSON.parse @jschat.receive_line({ 'change' => 'user', 'user' => { 'name' => 'alex' }}.to_json)
assert_equal 'error', response['display']
end
def test_max_message_length
identify_as 'nick', '#oublinet'
response = JSON.parse @jschat.receive_line({ 'send' => 'a' * 1000, 'to' => '#oublinet' }.to_json)
assert response['error']
end
def test_flood_protection
identify_as 'nick', '#oublinet'
response = ''
# simulate a flood and extract the error response
(1..50).detect do
response = @jschat.receive_line({ 'send' => 'a' * 10, 'to' => '#oublinet' }.to_json)
response.match /error/
end
response = JSON.parse response
assert response['error']
assert_match /wait a few seconds/i, response['error']['message']
end
end