Skip to content

Commit

Permalink
✨ Add support for UNSELECT extension (RFC3691)
Browse files Browse the repository at this point in the history
This is needed for IMAP4rev2 #12.

Fixes #40.
  • Loading branch information
nevans committed Nov 21, 2022
1 parent 7d07e74 commit 34f35ee
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
14 changes: 14 additions & 0 deletions lib/net/imap.rb
Original file line number Diff line number Diff line change
Expand Up @@ -796,6 +796,20 @@ def close
send_command("CLOSE")
end

# Sends an {UNSELECT command [IMAP4rev2
# §6.4.2]}[https://www.rfc-editor.org/rfc/rfc9051#section-6.4.2] to free the
# session resources for a mailbox and return to the "_authenticated_" state.
# This is the same as #close, except that <tt>\\Deleted</tt> messages are
# not removed from the mailbox.
#
# ===== Capabilities
#
# The server's capabilities must include +UNSELECT+
# [RFC3691[https://tools.ietf.org/html/rfc3691]].
def unselect
send_command("UNSELECT")
end

# Sends a EXPUNGE command to permanently remove from the currently
# selected mailbox all messages that have the \Deleted flag set.
def expunge
Expand Down
21 changes: 21 additions & 0 deletions test/net/imap/test_imap.rb
Original file line number Diff line number Diff line change
Expand Up @@ -915,6 +915,27 @@ def test_close
end
end

def test_unselect
requests = Queue.new
port = yields_in_test_server_thread do |sock, gets|
requests.push(gets[])
sock.print("RUBY0001 OK UNSELECT completed\r\n")
requests.push(gets[])
"RUBY0002"
end
begin
imap = Net::IMAP.new(server_addr, :port => port)
resp = imap.unselect
assert_equal(["RUBY0001", "UNSELECT", ""], requests.pop)
assert_equal([Net::IMAP::TaggedResponse, "RUBY0001", "OK"],
[resp.class, resp.tag, resp.name])
imap.logout
assert_equal(["RUBY0002", "LOGOUT", ""], requests.pop)
ensure
imap.disconnect if imap
end
end

private

def imaps_test
Expand Down

0 comments on commit 34f35ee

Please sign in to comment.