Commit f145acd
Changed files (2)
lib
minbox
spec
minbox
lib/minbox/server.rb
@@ -10,17 +10,23 @@ module Minbox
def listen!
logger.debug("Starting server on port #{port}...")
- server = TCPServer.new(port.to_i)
+ @server = TCPServer.new(port.to_i)
logger.debug("Server started!")
+
loop do
- yield handle(server.accept)
+ yield handle(@server.accept)
rescue StandardError => error
logger.error(error)
end
end
def handle(socket)
+ logger.debug("client connected: #{socket.inspect}")
Client.new(host, socket).mail_message
end
+
+ def shutdown!
+ @server&.close
+ end
end
end
spec/minbox/server_spec.rb
@@ -1,13 +1,42 @@
+require 'net/smtp'
+
RSpec.describe Minbox::Server do
subject { described_class.new }
describe "#handle" do
+ let(:publisher) { ->(mail) { inbox << mail } }
+ let(:inbox) { [] }
+ let(:server) { described_class.new(host, port) }
+ let(:host) { 'localhost' }
+ let(:port) { (9000..9999).to_a.sample }
+
+ before :example do
+ server_thread = Thread.new do
+ server.listen! do |mail|
+ publisher.publish(mail)
+ end
+ end
+ server_thread.join(5)
+ end
+
+ after :example do
+ server.shutdown!
+ end
+
context "when handling a simple client" do
- let(:client) { StringIO.new }
+ let(:mail) do
+ Mail.new do
+ from 'Your Name <me@example.org>'
+ to 'Destination Address <them@example.com>'
+ subject 'test message'
+ body "#{Time.now} This is a test message."
+ end
+ end
specify do
- client.puts("EHLO localhost")
- subject.handle(client)
+ Net::SMTP.start(host, port) do |smtp|
+ smtp.send_message(mail.to_s, 'me@example.org', 'them@example.com')
+ end
end
end
end