Commit c23bf0f

mokha <mokha@cisco.com>
2019-04-15 19:56:50
add inbox class to scan folder for emails
1 parent 8b8caeb
Changed files (3)
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