# encoding: UTF-8 require "test_helper" class OperatorWrapper def <<(stream) [stream] end end class StateWrapper def dialback_secret=(secret); end end module Vines module Kit def auth_token; "1234"; end end end module Boolean; end class TrueClass; include Boolean; end class FalseClass; include Boolean; end class NilClass; include Boolean; end describe Vines::Stream::Server::Outbound::Auth do before do @stream = MiniTest::Mock.new @state = Vines::Stream::Server::Outbound::Auth.new(@stream) end def test_missing_children EM.run { node = node("") @stream.expect(:dialback_verify_key?, false) @stream.expect(:outbound_tls_required, nil, [Boolean]) assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) } assert @stream.verify EM.stop } end def test_invalid_children EM.run { node = node(%()) @stream.expect(:dialback_verify_key?, false) @stream.expect(:outbound_tls_required, nil, [Boolean]) assert_raises(Vines::StreamErrors::NotAuthorized) { @state.node(node) } assert @stream.verify EM.stop } end def test_valid_stream_features EM.run { node = node( %() + %() + %() ) starttls = %() @stream.expect(:dialback_verify_key?, false) @stream.expect(:outbound_tls_required, nil, [Boolean]) @stream.expect(:advance, nil, [Vines::Stream::Server::Outbound::TLSResult]) @stream.expect(:write, nil, [starttls]) @state.node(node) assert @stream.verify EM.stop } end def test_dialback_feature_only EM.run { node = node( %() + %() ) @stream.expect(:dialback_verify_key?, false) @stream.expect(:router, OperatorWrapper.new) @stream.expect(:domain, "local.host") @stream.expect(:remote_domain, "remote.host") @stream.expect(:domain, "local.host") @stream.expect(:remote_domain, "remote.host") @stream.expect(:id, "1234") @stream.expect(:write, nil, [String]) @stream.expect(:outbound_tls_required, nil, [Boolean]) @stream.expect(:advance, nil, [Vines::Stream::Server::Outbound::AuthDialbackResult]) @stream.expect(:state, StateWrapper.new) @state.node(node) assert @stream.verify EM.stop } end def test_dialback_verify_key EM.run { node = node("") @stream.expect(:advance, nil, [Vines::Stream::Server::Outbound::Authoritative]) @stream.expect(:dialback_verify_key?, true) @stream.expect(:callback!, nil) @stream.expect(:outbound_tls_required, nil, [Boolean]) @state.node(node) assert @stream.verify EM.stop } end private def node(xml) Nokogiri::XML(xml).root end end