diff --git a/lib/src/private/imap/status_parser.dart b/lib/src/private/imap/status_parser.dart index 2199404d..27d2fb11 100644 --- a/lib/src/private/imap/status_parser.dart +++ b/lib/src/private/imap/status_parser.dart @@ -6,7 +6,10 @@ import 'response_parser.dart'; /// Parses status responses class StatusParser extends ResponseParser { /// Creates a new parser - StatusParser(this.box) : _regex = RegExp(r'(STATUS "[^"]+?" )(.*)'); + // Matches both a quoted ("INBOX") and an unquoted atom (INBOX) mailbox + // name: servers such as Dovecot return the atom form in STATUS responses. + StatusParser(this.box) + : _regex = RegExp(r'(STATUS (?:"[^"]+?"|[^ (]+) )(.*)'); /// The current mailbox Mailbox box; diff --git a/test/src/imap/status_parser_test.dart b/test/src/imap/status_parser_test.dart index b11e90b5..6244118e 100644 --- a/test/src/imap/status_parser_test.dart +++ b/test/src/imap/status_parser_test.dart @@ -1,61 +1,61 @@ -import 'package:enough_mail/enough_mail.dart'; -import 'package:enough_mail/src/private/imap/all_parsers.dart'; -import 'package:enough_mail/src/private/imap/imap_response.dart'; -import 'package:enough_mail/src/private/imap/imap_response_line.dart'; -import 'package:test/test.dart'; -// cSpell:disable - -void main() { - test('Status with unseen', () { - const responseText = 'STATUS "[Gmail]/Spam" (UNSEEN 13)'; - final details = ImapResponse()..add(ImapResponseLine(responseText)); - final box = Mailbox( - encodedName: 'Spam', - encodedPath: '[Gmail]/Spam', - flags: [MailboxFlag.junk], - pathSeparator: '/', - ); - final parser = StatusParser(box); - final response = Response()..status = ResponseStatus.ok; - final processed = parser.parseUntagged(details, response); - expect(processed, true); - expect(box.messagesUnseen, 13); - }); - - test('Status with unseen, messages, uidnext, uidvalidity', () { - const responseText = - 'STATUS "[Gmail]/Spam" (MESSAGES 123 UNSEEN 13 UIDVALIDITY 2222 UIDNEXT 876)'; - final details = ImapResponse()..add(ImapResponseLine(responseText)); - final box = Mailbox( - encodedName: 'Spam', - encodedPath: '[Gmail]/Spam', - flags: [MailboxFlag.junk], - pathSeparator: '/', - ); - final parser = StatusParser(box); - final response = Response()..status = ResponseStatus.ok; - final processed = parser.parseUntagged(details, response); - expect(processed, true); - expect(box.messagesUnseen, 13); - expect(box.messagesExists, 123); - expect(box.uidValidity, 2222); - expect(box.uidNext, 876); - }); - - test('Status of Mailbox with name containing brackets', () { - const responseText = - 'STATUS "upper level.Funny folder (with brackets)" (MESSAGES 2)'; - final details = ImapResponse()..add(ImapResponseLine(responseText)); - final box = Mailbox( - encodedName: 'Funny folder (with brackets)', - encodedPath: 'upper level.Funny folder (with brackets)', - flags: [MailboxFlag.junk], - pathSeparator: '.', - ); - final parser = StatusParser(box); - final response = Response()..status = ResponseStatus.ok; - final processed = parser.parseUntagged(details, response); - expect(processed, true); - expect(box.messagesExists, 2); - }); -} +import 'package:enough_mail/enough_mail.dart'; +import 'package:enough_mail/src/private/imap/all_parsers.dart'; +import 'package:enough_mail/src/private/imap/imap_response.dart'; +import 'package:enough_mail/src/private/imap/imap_response_line.dart'; +import 'package:test/test.dart'; +// cSpell:disable + +void main() { + test('Status with unseen', () { + const responseText = 'STATUS "[Gmail]/Spam" (UNSEEN 13)'; + final details = ImapResponse()..add(ImapResponseLine(responseText)); + final box = Mailbox( + encodedName: 'Spam', + encodedPath: '[Gmail]/Spam', + flags: [MailboxFlag.junk], + pathSeparator: '/', + ); + final parser = StatusParser(box); + final response = Response()..status = ResponseStatus.ok; + final processed = parser.parseUntagged(details, response); + expect(processed, true); + expect(box.messagesUnseen, 13); + }); + + test('Status with unseen, messages, uidnext, uidvalidity', () { + const responseText = + 'STATUS "[Gmail]/Spam" (MESSAGES 123 UNSEEN 13 UIDVALIDITY 2222 UIDNEXT 876)'; + final details = ImapResponse()..add(ImapResponseLine(responseText)); + final box = Mailbox( + encodedName: 'Spam', + encodedPath: '[Gmail]/Spam', + flags: [MailboxFlag.junk], + pathSeparator: '/', + ); + final parser = StatusParser(box); + final response = Response()..status = ResponseStatus.ok; + final processed = parser.parseUntagged(details, response); + expect(processed, true); + expect(box.messagesUnseen, 13); + expect(box.messagesExists, 123); + expect(box.uidValidity, 2222); + expect(box.uidNext, 876); + }); + + test('Status of Mailbox with name containing brackets', () { + const responseText = + 'STATUS "upper level.Funny folder (with brackets)" (MESSAGES 2)'; + final details = ImapResponse()..add(ImapResponseLine(responseText)); + final box = Mailbox( + encodedName: 'Funny folder (with brackets)', + encodedPath: 'upper level.Funny folder (with brackets)', + flags: [MailboxFlag.junk], + pathSeparator: '.', + ); + final parser = StatusParser(box); + final response = Response()..status = ResponseStatus.ok; + final processed = parser.parseUntagged(details, response); + expect(processed, true); + expect(box.messagesExists, 2); + }); +}