sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
commit aeefd695c6ebeb8c486590a49e38db466f43c3bc
parent efdca8c7195228698ccd6a4dc21debd478014e61
Author: Dan Callaghan <djc@djc.id.au>
Date:   Sun, 27 Apr 2025 17:42:09 +1000

tests: add rudimentary coverage for drafts

Diffstat:
M Manifest.txt | 1 +
M lib/sup/draft.rb | 4 ++--
A test/integration/test_draft.rb | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 61 insertions(+), 2 deletions(-)
diff --git a/Manifest.txt b/Manifest.txt
@@ -160,6 +160,7 @@ test/gnupg_test_home/receiver_secring.gpg
 test/gnupg_test_home/regen_keys.sh
 test/gnupg_test_home/secring.gpg
 test/gnupg_test_home/sup-test-2@foo.bar.asc
+test/integration/test_draft.rb
 test/integration/test_maildir.rb
 test/integration/test_mbox.rb
 test/integration/test_sup-add.rb
diff --git a/lib/sup/draft.rb b/lib/sup/draft.rb
@@ -11,7 +11,7 @@ class DraftManager
 
   def self.source_name; "sup://drafts"; end
   def self.source_id; 9999; end
-  def new_source; @source = DraftLoader.new; end
+  def new_source; @source = DraftLoader.new @dir; end
 
   def write_draft
     offset = @source.gen_offset
@@ -32,7 +32,7 @@ class DraftLoader < Source
   attr_accessor :dir
   yaml_properties
 
-  def initialize dir=Redwood::DRAFT_DIR
+  def initialize dir
     Dir.mkdir dir unless File.exist? dir
     super DraftManager.source_name, true, false
     @dir = dir
diff --git a/test/integration/test_draft.rb b/test/integration/test_draft.rb
@@ -0,0 +1,58 @@
+require "sup"
+require "test_helper"
+
+class TestDraft < Minitest::Test
+  include Redwood
+
+  def setup
+    @path = Dir.mktmpdir
+    start
+    @draft_dir = File.join @path, "drafts"
+    @test_message_1 = <<EOS
+From: Some Person <someone@example.invalid>
+To:
+Cc:
+Bcc:
+Subject: draft
+Date: Fri, 11 Apr 2025 22:34:05 +1000
+Message-ID: <123@example.invalid>
+
+My incomplete message
+EOS
+    DraftManager.instance.instance_eval "@dir = '#{@draft_dir}'"
+    Index.init @path
+    Index.load
+    SourceManager.instance.instance_eval "@sources = {}"
+    SourceManager.add_source DraftManager.new_source
+  end
+
+  def teardown
+    ObjectSpace.each_object(Class).select {|a| a < Redwood::Singleton}.each do |klass|
+      klass.deinstantiate! unless klass == Redwood::Logger
+    end
+    FileUtils.rm_r @path
+  end
+
+  def test_write_draft
+    DraftManager.write_draft { |f| f.write @test_message_1 }
+
+    draft_filename = File.join @draft_dir, "0"
+    assert File.exist? draft_filename
+    assert_equal @test_message_1, (File.read draft_filename)
+
+    ## Check that it is loaded back into the index successfully too.
+    messages_in_index = Index.instance.enum_for(:each_message).to_a
+    assert_equal @test_message_1, messages_in_index.first.raw_message
+    assert_equal [:draft, :inbox].to_set, messages_in_index.first.labels
+  end
+
+  def test_discard_draft
+    DraftManager.write_draft { |f| f.write @test_message_1 }
+    draft_filename = File.join @draft_dir, "0"
+    assert File.exist? draft_filename
+    message_in_index = Index.instance.enum_for(:each_message).to_a.first
+
+    DraftManager.discard message_in_index
+    refute File.exist? draft_filename
+  end
+end