test/stanza/pubsub/create_test.rb in vines-0.4.5 vs test/stanza/pubsub/create_test.rb in vines-0.4.6

- old
+ new

@@ -1,138 +1,116 @@ # encoding: UTF-8 -require 'tmpdir' -require 'vines' -require 'ext/nokogiri' -require 'minitest/autorun' +require 'test_helper' -class CreatePubSubTest < MiniTest::Unit::TestCase - def setup - @user = Vines::User.new(jid: 'alice@wonderland.lit/tea') - @config = Vines::Config.new do +describe Vines::Stanza::PubSub::Create do + subject { Vines::Stanza::PubSub::Create.new(xml, stream) } + let(:user) { Vines::User.new(jid: 'alice@wonderland.lit/tea') } + let(:stream) { MiniTest::Mock.new } + let(:config) do + Vines::Config.new do host 'wonderland.lit' do storage(:fs) { dir Dir.tmpdir } pubsub 'games' end end - @stream = MiniTest::Mock.new - @stream.expect(:config, @config) - @stream.expect(:user, @user) end - def test_missing_to_address_raises - node = node(%q{ - <iq type='set' id='42'> - <pubsub xmlns='http://jabber.org/protocol/pubsub'> - <create node='game_13'/> - </pubsub> - </iq> - }.strip.gsub(/\n|\s{2,}/, '')) + before do + class << stream + attr_accessor :config, :nodes, :user + def write(node) + @nodes ||= [] + @nodes << node + end + end + stream.config = config + stream.user = user + end - @stream.expect(:domain, 'wonderland.lit') + describe 'when missing a to address' do + let(:xml) { create('') } - stanza = Vines::Stanza::PubSub::Create.new(node, @stream) - assert_raises(Vines::StanzaErrors::FeatureNotImplemented) { stanza.process } - assert @stream.verify + it 'raises a feature-not-implemented stanza error' do + stream.expect :domain, 'wonderland.lit' + -> { subject.process }.must_raise Vines::StanzaErrors::FeatureNotImplemented + stream.verify + end end - def test_server_domain_to_address_raises - node = node(%q{ - <iq type='set' to='wonderland.lit' id='42'> - <pubsub xmlns='http://jabber.org/protocol/pubsub'> - <create node='game_13'/> - </pubsub> - </iq> - }.strip.gsub(/\n|\s{2,}/, '')) + describe 'when addressed to bare server domain' do + let(:xml) { create('wonderland.lit') } - stanza = Vines::Stanza::PubSub::Create.new(node, @stream) - assert_raises(Vines::StanzaErrors::FeatureNotImplemented) { stanza.process } - assert @stream.verify + it 'raises a feature-not-implemented stanza error' do + -> { subject.process }.must_raise Vines::StanzaErrors::FeatureNotImplemented + stream.verify + end end - def test_non_pubsub_to_address_routes - node = node(%q{ - <iq type='set' to='bogus.wonderland.lit' id='42'> - <pubsub xmlns='http://jabber.org/protocol/pubsub'> - <create node='game_13'/> - </pubsub> - </iq> - }.strip.gsub(/\n|\s{2,}/, '')) + describe 'when addressed to a non-pubsub component' do + let(:router) { MiniTest::Mock.new } + let(:xml) { create('bogus.wonderland.lit') } - router = MiniTest::Mock.new - router.expect(:route, nil, [node]) - @stream.expect(:router, router) + before do + router.expect :route, nil, [xml] + stream.expect :router, router + end - stanza = Vines::Stanza::PubSub::Create.new(node, @stream) - stanza.process - assert @stream.verify - assert router.verify + it 'routes rather than handle locally' do + subject.process + stream.verify + router.verify + end end - def test_multiple_create_elements_raises - node = node(%q{ - <iq type='set' to='games.wonderland.lit' id='42'> - <pubsub xmlns='http://jabber.org/protocol/pubsub'> - <create node='game_13'/> - <create node='game_14'/> - </pubsub> - </iq> - }.strip.gsub(/\n|\s{2,}/, '')) + describe 'when attempting to create multiple nodes' do + let(:xml) { create('games.wonderland.lit', true) } - stanza = Vines::Stanza::PubSub::Create.new(node, @stream) - assert_raises(Vines::StanzaErrors::BadRequest) { stanza.process } - assert @stream.verify + it 'raises a bad-request stanza error' do + -> { subject.process }.must_raise Vines::StanzaErrors::BadRequest + stream.verify + end end - def test_create_duplicate_node_raises - node = node(%q{ - <iq type='set' to='games.wonderland.lit' id='42'> - <pubsub xmlns='http://jabber.org/protocol/pubsub'> - <create node='game_13'/> - </pubsub> - </iq> - }.strip.gsub(/\n|\s{2,}/, '')) + describe 'when attempting to create duplicate nodes' do + let(:pubsub) { MiniTest::Mock.new } + let(:xml) { create('games.wonderland.lit') } - stanza = Vines::Stanza::PubSub::Create.new(node, @stream) - def stanza.pubsub - pubsub = MiniTest::Mock.new - pubsub.expect(:node?, true, ['game_13']) - pubsub + it 'raises a conflict stanza error' do + pubsub.expect :node?, true, ['game_13'] + subject.stub :pubsub, pubsub do + -> { subject.process }.must_raise Vines::StanzaErrors::Conflict + end + stream.verify + pubsub.verify end - assert_raises(Vines::StanzaErrors::Conflict) { stanza.process } - assert @stream.verify end - def test_good_stanza_processes - node = node(%q{ - <iq type='set' to='games.wonderland.lit' id='42'> - <pubsub xmlns='http://jabber.org/protocol/pubsub'> - <create node='game_13'/> - </pubsub> - </iq> - }.strip.gsub(/\n|\s{2,}/, '')) + describe 'when given a valid stanza' do + let(:xml) { create('games.wonderland.lit') } + let(:expected) { result(user.jid, 'games.wonderland.lit') } - def @stream.nodes; @nodes; end - def @stream.write(node) - @nodes ||= [] - @nodes << node + it 'sends an iq result stanza to sender' do + subject.process + stream.nodes.size.must_equal 1 + stream.nodes.first.must_equal expected + stream.verify end - - stanza = Vines::Stanza::PubSub::Create.new(node, @stream) - stanza.process - - assert @stream.verify - assert_equal 1, @stream.nodes.size - - expected = %q{<iq from="games.wonderland.lit" id="42" to="alice@wonderland.lit/tea" type="result">} - expected << %q{<pubsub xmlns="http://jabber.org/protocol/pubsub"><create node="game_13"/></pubsub>} - expected << %q{</iq>} - expected = node(expected) - assert_equal expected, @stream.nodes[0] end private - def node(xml) - Nokogiri::XML(xml).root + def create(to, multiple=false) + extra_create = "<create node='game_14'/>" if multiple + body = %Q{ + <pubsub xmlns='http://jabber.org/protocol/pubsub'> + <create node='game_13'/> + #{extra_create} + </pubsub>} + iq(type: 'set', to: to, id: 42, body: body) + end + + def result(to, from) + body = '<pubsub xmlns="http://jabber.org/protocol/pubsub"><create node="game_13"/></pubsub>' + iq(from: from, id: 42, to: to, type: 'result', body: body) end end