# encoding: UTF-8
require "test_helper"
describe Vines::Stream::Server::Auth do
# disable logging for tests
Class.new.extend(Vines::Log).log.level = Logger::FATAL
subject { Vines::Stream::Server::Auth.new(stream) }
let(:stream) { MiniTest::Mock.new }
before do
class << stream
attr_accessor :remote_domain
end
stream.remote_domain = "wonderland.lit"
end
describe "when given a valid authzid" do
before do
stream.expect :cert_domain_matches?, true, ["wonderland.lit"]
stream.expect :write, nil, [%()]
stream.expect :advance, nil, [Vines::Stream::Server::FinalRestart]
stream.expect :reset, nil
stream.expect :authentication_mechanisms, ["EXTERNAL"]
end
it "passes external auth with empty authzid" do
EM.run {
node = external("=")
subject.node(node)
stream.verify
EM.stop
}
end
it "passes external auth with authzid matching from domain" do
EM.run {
node = external(Base64.strict_encode64("wonderland.lit"))
subject.node(node)
stream.verify
EM.stop
}
end
end
describe "when given an invalid authzid" do
before do
stream.expect :write, nil, [""]
stream.expect :close_connection_after_writing, nil
stream.expect :error, nil, [Vines::SaslErrors::InvalidAuthzid]
stream.expect :authentication_mechanisms, ["EXTERNAL"]
end
it "fails external auth with mismatched from domain" do
EM.run {
node = external(Base64.strict_encode64("verona.lit"))
subject.node(node)
stream.verify
EM.stop
}
end
end
private
def external(authzid)
node(%(#{authzid}))
end
end