Files
sharedinbox/test/integration/mailbox_repository_imap_test.dart
T

133 lines
3.9 KiB
Dart

// Integration tests for MailboxRepositoryImpl against a real Stalwart instance.
// Run via: stalwart-dev/test.sh
//
// Environment variables (set by the runner script):
// STALWART_IMAP_HOST, STALWART_IMAP_PORT
// STALWART_USER_B / STALWART_PASS_B (alice@example.com)
import 'dart:io';
import 'package:enough_mail/enough_mail.dart';
import 'package:sharedinbox/core/models/account.dart';
import 'package:sharedinbox/data/db/database.dart' hide Account;
import 'package:sharedinbox/data/repositories/account_repository_impl.dart';
import 'package:sharedinbox/data/repositories/mailbox_repository_impl.dart';
import 'package:test/test.dart';
import '../unit/account_repository_impl_test.dart' show MapSecureStorage;
import '../unit/db_test_helper.dart';
String _env(String key, [String fallback = '']) =>
Platform.environment[key] ?? fallback;
Future<ImapClient> _imapConnect({
required String host,
required int port,
required String user,
required String pass,
}) async {
final client = ImapClient(
defaultResponseTimeout: const Duration(seconds: 20),
);
await client.connectToServer(host, port, isSecure: false);
await client.login(user, pass);
return client;
}
void main() {
late String imapHost;
late int imapPort;
late String userEmail;
late String userPass;
late Account account;
setUpAll(() {
configureSqliteForTests();
imapHost = _env('STALWART_IMAP_HOST', '127.0.0.1');
imapPort = int.parse(_env('STALWART_IMAP_PORT', '1430'));
userEmail = _env('STALWART_USER_B', 'alice@example.com');
userPass = _env('STALWART_PASS_B', 'secret');
account = Account(
id: 'test',
displayName: 'Alice',
email: userEmail,
imapHost: imapHost,
imapPort: imapPort,
imapSsl: false,
smtpHost: imapHost,
smtpPort: 1025,
);
});
Future<ImapClient> testImapConnect(
Account a,
String username,
String password,
) async {
final client = ImapClient(
defaultResponseTimeout: const Duration(seconds: 20),
);
await client.connectToServer(a.imapHost, a.imapPort, isSecure: false);
await client.login(username, password);
return client;
}
({
AppDatabase db,
AccountRepositoryImpl accounts,
MailboxRepositoryImpl mailboxes,
}) makeRepo() {
final db = openTestDatabase();
final accounts = AccountRepositoryImpl(db, MapSecureStorage());
final mailboxes = MailboxRepositoryImpl(
db,
accounts,
imapConnect: testImapConnect,
);
return (db: db, accounts: accounts, mailboxes: mailboxes);
}
test('syncMailboxes stores mailboxes from IMAP in DB', () async {
final r = makeRepo();
await r.accounts.addAccount(account, userPass);
await r.mailboxes.syncMailboxes('test');
final mailboxes = await r.mailboxes.observeMailboxes('test').first;
expect(mailboxes, isNotEmpty);
expect(mailboxes.map((m) => m.path), contains('INBOX'));
});
test('syncMailboxes populates unread and total counts', () async {
// Append a message so INBOX has at least 1 unseen message.
final client = await _imapConnect(
host: imapHost,
port: imapPort,
user: userEmail,
pass: userPass,
);
try {
await client.selectMailboxByPath('INBOX');
final msg = MessageBuilder()
..from = [MailAddress('Alice', userEmail)]
..to = [MailAddress('Alice', userEmail)]
..subject = 'count-test'
..text = 'body';
await client.appendMessage(
msg.buildMimeMessage(),
targetMailboxPath: 'INBOX',
);
} finally {
await client.logout();
}
final r = makeRepo();
await r.accounts.addAccount(account, userPass);
await r.mailboxes.syncMailboxes('test');
final mailboxes = await r.mailboxes.observeMailboxes('test').first;
final inbox = mailboxes.firstWhere((m) => m.path == 'INBOX');
expect(inbox.totalCount, greaterThan(0));
expect(inbox.unreadCount, greaterThan(0));
});
}