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:
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