# encoding: UTF-8
require 'test_helper'
describe Vines::Stream::Component::Ready do
subject { Vines::Stream::Component::Ready.new(stream, nil) }
let(:alice) { Vines::User.new(jid: 'alice@tea.wonderland.lit') }
let(:hatter) { Vines::User.new(jid: 'hatter@wonderland.lit') }
let(:stream) { MiniTest::Mock.new }
let(:config) do
Vines::Config.new do
host 'wonderland.lit' do
storage(:fs) { dir Dir.tmpdir }
end
end
end
before do
class << stream
attr_accessor :config
end
stream.config = config
end
describe 'when missing to and from addresses' do
it 'raises an improper-addressing stream error' do
node = node('')
-> { subject.node(node) }.must_raise Vines::StreamErrors::ImproperAddressing
stream.verify
end
end
describe 'when missing from address' do
it 'raises an improper-addressing stream error' do
node = node(%q{})
-> { subject.node(node) }.must_raise Vines::StreamErrors::ImproperAddressing
stream.verify
end
end
describe 'when missing to address' do
it 'raises an improper-addressing stream error' do
node = node(%q{})
-> { subject.node(node) }.must_raise Vines::StreamErrors::ImproperAddressing
stream.verify
end
end
describe 'when from address domain does not match component domain' do
it 'raises and invalid-from stream error' do
stream.expect :remote_domain, 'tea.wonderland.lit'
node = node(%q{})
-> { subject.node(node) }.must_raise Vines::StreamErrors::InvalidFrom
stream.verify
end
end
describe 'when unrecognized element is received' do
it 'raises an unsupported-stanza-type stream error' do
node = node('')
-> { subject.node(node) }.must_raise Vines::StreamErrors::UnsupportedStanzaType
stream.verify
end
end
describe 'when addressed to a remote jid' do
let(:router) { MiniTest::Mock.new }
let(:xml) { node(%q{}) }
before do
router.expect :route, nil, [xml]
stream.expect :remote_domain, 'tea.wonderland.lit'
stream.expect :user=, nil, [alice]
stream.expect :router, router
end
it 'routes rather than handle locally' do
subject.node(xml)
stream.verify
router.verify
end
end
describe 'when addressed to a local jid' do
let(:recipient) { MiniTest::Mock.new }
let(:xml) { node(%q{}) }
before do
recipient.expect :user, hatter
recipient.expect :write, nil, [xml]
stream.expect :remote_domain, 'tea.wonderland.lit'
stream.expect :user=, nil, [alice]
stream.expect :user, alice
stream.expect :connected_resources, [recipient], [hatter.jid]
end
it 'sends the message to the connected stream' do
subject.node(xml)
stream.verify
recipient.verify
end
end
end