Commit c23bf0f
Changed files (3)
spec
minbox
lib/minbox/inbox.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Minbox
+ class Inbox
+ include Enumerable
+ attr_reader :root_dir
+
+ def initialize(root_dir: 'tmp')
+ @root_dir = Pathname.new(root_dir)
+ end
+
+ def emails
+ map { |x| File.basename(x) }
+ end
+
+ def open(id)
+ file = find { |x| x.end_with?(id) }
+ file ? Mail.read(file) : nil
+ end
+
+ def empty!
+ each do |email|
+ File.unlink(email)
+ rescue StandardError
+ nil
+ end
+ end
+
+ def each
+ Dir[root_dir.join("*.eml")].sort_by { |x| File.mtime(x) }.each do |email|
+ yield email
+ end
+ end
+ end
+end
lib/minbox.rb
@@ -6,9 +6,10 @@ require 'hashie'
require 'logger'
require 'socket'
+require 'minbox/client'
require 'minbox/core'
+require 'minbox/inbox'
require 'minbox/publisher'
-require 'minbox/client'
require 'minbox/server'
require 'minbox/version'
spec/minbox/inbox_spec.rb
@@ -0,0 +1,69 @@
+# frozen_string_literal: true
+
+RSpec.describe Minbox::Inbox do
+ subject { described_class.new }
+
+ before do
+ FileUtils.rm(Dir.glob('tmp/*.eml'))
+ end
+
+ describe "#empty!" do
+ before :example do
+ IO.write("tmp/1.eml", Mail.new do
+ to Faker::Internet.email
+ from Faker::Internet.email
+ subject "hello world"
+ end.to_s)
+ subject.empty!
+ end
+
+ specify { expect(Dir['tmp/*.eml'].count).to be_zero }
+ end
+
+ describe "#emails" do
+ before :example do
+ subject.empty!
+ IO.write("tmp/1.eml", Mail.new do
+ to Faker::Internet.email
+ from Faker::Internet.email
+ subject "hello world"
+ end.to_s)
+ IO.write("tmp/2.eml", Mail.new do
+ to Faker::Internet.email
+ from Faker::Internet.email
+ subject "goodbye world"
+ end.to_s)
+ @result = subject.emails
+ end
+
+ specify { expect(@result).to match_array(['1.eml', '2.eml']) }
+ end
+
+ describe "#open" do
+ before :example do
+ subject.empty!
+ IO.write("tmp/1.eml", Mail.new do
+ to Faker::Internet.email
+ from Faker::Internet.email
+ subject "hello world"
+ end.to_s)
+ IO.write("tmp/2.eml", Mail.new do
+ to Faker::Internet.email
+ from Faker::Internet.email
+ subject "goodbye world"
+ end.to_s)
+ end
+
+ context "when opening an email in the inbox" do
+ before { @result = subject.open('2.eml') }
+
+ specify { expect(@result.subject).to eql('goodbye world') }
+ end
+
+ context "when opening an email not in the inbox" do
+ before { @result = subject.open("#{SecureRandom.uuid}.eml") }
+
+ specify { expect(@result).to be_nil }
+ end
+ end
+end