Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6c96bd97f3 | ||
|
|
2bc24887dc | ||
|
|
cf2bfa383b | ||
|
|
a438d80e67 | ||
|
|
cc88491cec | ||
|
|
55e731ade9 |
@@ -22,14 +22,7 @@ jobs:
|
|||||||
created_at=$(curl -sf \
|
created_at=$(curl -sf \
|
||||||
-H "Authorization: token $FORGEJO_TOKEN" \
|
-H "Authorization: token $FORGEJO_TOKEN" \
|
||||||
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
||||||
| python3 -c "
|
| python3 -c "import sys,json;data=json.load(sys.stdin);rs=[r for r in data.get('workflow_runs',[]) if r.get('run_number')==$RUN_NUMBER];print(rs[0]['created_at'] if rs else '')" 2>/dev/null)
|
||||||
import sys, json
|
|
||||||
data = json.load(sys.stdin)
|
|
||||||
for r in data.get('workflow_runs', []):
|
|
||||||
if r.get('run_number') == $RUN_NUMBER:
|
|
||||||
print(r['created_at'])
|
|
||||||
break
|
|
||||||
" 2>/dev/null)
|
|
||||||
if [ -n "$created_at" ]; then
|
if [ -n "$created_at" ]; then
|
||||||
queued_epoch=$(date -d "$created_at" +%s)
|
queued_epoch=$(date -d "$created_at" +%s)
|
||||||
wait_seconds=$((runner_start - queued_epoch))
|
wait_seconds=$((runner_start - queued_epoch))
|
||||||
|
|||||||
@@ -24,14 +24,7 @@ jobs:
|
|||||||
created_at=$(curl -sf \
|
created_at=$(curl -sf \
|
||||||
-H "Authorization: token $FORGEJO_TOKEN" \
|
-H "Authorization: token $FORGEJO_TOKEN" \
|
||||||
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
||||||
| python3 -c "
|
| python3 -c "import sys,json;data=json.load(sys.stdin);rs=[r for r in data.get('workflow_runs',[]) if r.get('run_number')==$RUN_NUMBER];print(rs[0]['created_at'] if rs else '')" 2>/dev/null)
|
||||||
import sys, json
|
|
||||||
data = json.load(sys.stdin)
|
|
||||||
for r in data.get('workflow_runs', []):
|
|
||||||
if r.get('run_number') == $RUN_NUMBER:
|
|
||||||
print(r['created_at'])
|
|
||||||
break
|
|
||||||
" 2>/dev/null)
|
|
||||||
if [ -n "$created_at" ]; then
|
if [ -n "$created_at" ]; then
|
||||||
queued_epoch=$(date -d "$created_at" +%s)
|
queued_epoch=$(date -d "$created_at" +%s)
|
||||||
wait_seconds=$((runner_start - queued_epoch))
|
wait_seconds=$((runner_start - queued_epoch))
|
||||||
@@ -174,14 +167,7 @@ for r in data.get('workflow_runs', []):
|
|||||||
created_at=$(curl -sf \
|
created_at=$(curl -sf \
|
||||||
-H "Authorization: token $FORGEJO_TOKEN" \
|
-H "Authorization: token $FORGEJO_TOKEN" \
|
||||||
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
||||||
| python3 -c "
|
| python3 -c "import sys,json;data=json.load(sys.stdin);rs=[r for r in data.get('workflow_runs',[]) if r.get('run_number')==$RUN_NUMBER];print(rs[0]['created_at'] if rs else '')" 2>/dev/null)
|
||||||
import sys, json
|
|
||||||
data = json.load(sys.stdin)
|
|
||||||
for r in data.get('workflow_runs', []):
|
|
||||||
if r.get('run_number') == $RUN_NUMBER:
|
|
||||||
print(r['created_at'])
|
|
||||||
break
|
|
||||||
" 2>/dev/null)
|
|
||||||
if [ -n "$created_at" ]; then
|
if [ -n "$created_at" ]; then
|
||||||
queued_epoch=$(date -d "$created_at" +%s)
|
queued_epoch=$(date -d "$created_at" +%s)
|
||||||
wait_seconds=$((runner_start - queued_epoch))
|
wait_seconds=$((runner_start - queued_epoch))
|
||||||
@@ -232,14 +218,7 @@ for r in data.get('workflow_runs', []):
|
|||||||
created_at=$(curl -sf \
|
created_at=$(curl -sf \
|
||||||
-H "Authorization: token $FORGEJO_TOKEN" \
|
-H "Authorization: token $FORGEJO_TOKEN" \
|
||||||
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
||||||
| python3 -c "
|
| python3 -c "import sys,json;data=json.load(sys.stdin);rs=[r for r in data.get('workflow_runs',[]) if r.get('run_number')==$RUN_NUMBER];print(rs[0]['created_at'] if rs else '')" 2>/dev/null)
|
||||||
import sys, json
|
|
||||||
data = json.load(sys.stdin)
|
|
||||||
for r in data.get('workflow_runs', []):
|
|
||||||
if r.get('run_number') == $RUN_NUMBER:
|
|
||||||
print(r['created_at'])
|
|
||||||
break
|
|
||||||
" 2>/dev/null)
|
|
||||||
if [ -n "$created_at" ]; then
|
if [ -n "$created_at" ]; then
|
||||||
queued_epoch=$(date -d "$created_at" +%s)
|
queued_epoch=$(date -d "$created_at" +%s)
|
||||||
wait_seconds=$((runner_start - queued_epoch))
|
wait_seconds=$((runner_start - queued_epoch))
|
||||||
@@ -284,14 +263,7 @@ for r in data.get('workflow_runs', []):
|
|||||||
created_at=$(curl -sf \
|
created_at=$(curl -sf \
|
||||||
-H "Authorization: token $FORGEJO_TOKEN" \
|
-H "Authorization: token $FORGEJO_TOKEN" \
|
||||||
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
||||||
| python3 -c "
|
| python3 -c "import sys,json;data=json.load(sys.stdin);rs=[r for r in data.get('workflow_runs',[]) if r.get('run_number')==$RUN_NUMBER];print(rs[0]['created_at'] if rs else '')" 2>/dev/null)
|
||||||
import sys, json
|
|
||||||
data = json.load(sys.stdin)
|
|
||||||
for r in data.get('workflow_runs', []):
|
|
||||||
if r.get('run_number') == $RUN_NUMBER:
|
|
||||||
print(r['created_at'])
|
|
||||||
break
|
|
||||||
" 2>/dev/null)
|
|
||||||
if [ -n "$created_at" ]; then
|
if [ -n "$created_at" ]; then
|
||||||
queued_epoch=$(date -d "$created_at" +%s)
|
queued_epoch=$(date -d "$created_at" +%s)
|
||||||
wait_seconds=$((runner_start - queued_epoch))
|
wait_seconds=$((runner_start - queued_epoch))
|
||||||
@@ -341,14 +313,7 @@ for r in data.get('workflow_runs', []):
|
|||||||
created_at=$(curl -sf \
|
created_at=$(curl -sf \
|
||||||
-H "Authorization: token $FORGEJO_TOKEN" \
|
-H "Authorization: token $FORGEJO_TOKEN" \
|
||||||
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
||||||
| python3 -c "
|
| python3 -c "import sys,json;data=json.load(sys.stdin);rs=[r for r in data.get('workflow_runs',[]) if r.get('run_number')==$RUN_NUMBER];print(rs[0]['created_at'] if rs else '')" 2>/dev/null)
|
||||||
import sys, json
|
|
||||||
data = json.load(sys.stdin)
|
|
||||||
for r in data.get('workflow_runs', []):
|
|
||||||
if r.get('run_number') == $RUN_NUMBER:
|
|
||||||
print(r['created_at'])
|
|
||||||
break
|
|
||||||
" 2>/dev/null)
|
|
||||||
if [ -n "$created_at" ]; then
|
if [ -n "$created_at" ]; then
|
||||||
queued_epoch=$(date -d "$created_at" +%s)
|
queued_epoch=$(date -d "$created_at" +%s)
|
||||||
wait_seconds=$((runner_start - queued_epoch))
|
wait_seconds=$((runner_start - queued_epoch))
|
||||||
|
|||||||
@@ -23,14 +23,7 @@ jobs:
|
|||||||
created_at=$(curl -sf \
|
created_at=$(curl -sf \
|
||||||
-H "Authorization: token $FORGEJO_TOKEN" \
|
-H "Authorization: token $FORGEJO_TOKEN" \
|
||||||
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
||||||
| python3 -c "
|
| python3 -c "import sys,json;data=json.load(sys.stdin);rs=[r for r in data.get('workflow_runs',[]) if r.get('run_number')==$RUN_NUMBER];print(rs[0]['created_at'] if rs else '')" 2>/dev/null)
|
||||||
import sys, json
|
|
||||||
data = json.load(sys.stdin)
|
|
||||||
for r in data.get('workflow_runs', []):
|
|
||||||
if r.get('run_number') == $RUN_NUMBER:
|
|
||||||
print(r['created_at'])
|
|
||||||
break
|
|
||||||
" 2>/dev/null)
|
|
||||||
if [ -n "$created_at" ]; then
|
if [ -n "$created_at" ]; then
|
||||||
queued_epoch=$(date -d "$created_at" +%s)
|
queued_epoch=$(date -d "$created_at" +%s)
|
||||||
wait_seconds=$((runner_start - queued_epoch))
|
wait_seconds=$((runner_start - queued_epoch))
|
||||||
@@ -83,14 +76,7 @@ for r in data.get('workflow_runs', []):
|
|||||||
created_at=$(curl -sf \
|
created_at=$(curl -sf \
|
||||||
-H "Authorization: token $FORGEJO_TOKEN" \
|
-H "Authorization: token $FORGEJO_TOKEN" \
|
||||||
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
||||||
| python3 -c "
|
| python3 -c "import sys,json;data=json.load(sys.stdin);rs=[r for r in data.get('workflow_runs',[]) if r.get('run_number')==$RUN_NUMBER];print(rs[0]['created_at'] if rs else '')" 2>/dev/null)
|
||||||
import sys, json
|
|
||||||
data = json.load(sys.stdin)
|
|
||||||
for r in data.get('workflow_runs', []):
|
|
||||||
if r.get('run_number') == $RUN_NUMBER:
|
|
||||||
print(r['created_at'])
|
|
||||||
break
|
|
||||||
" 2>/dev/null)
|
|
||||||
if [ -n "$created_at" ]; then
|
if [ -n "$created_at" ]; then
|
||||||
queued_epoch=$(date -d "$created_at" +%s)
|
queued_epoch=$(date -d "$created_at" +%s)
|
||||||
wait_seconds=$((runner_start - queued_epoch))
|
wait_seconds=$((runner_start - queued_epoch))
|
||||||
|
|||||||
@@ -27,14 +27,7 @@ jobs:
|
|||||||
created_at=$(curl -sf \
|
created_at=$(curl -sf \
|
||||||
-H "Authorization: token $FORGEJO_TOKEN" \
|
-H "Authorization: token $FORGEJO_TOKEN" \
|
||||||
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
"${{ github.server_url }}/api/v1/repos/${{ github.repository }}/actions/tasks?limit=100" \
|
||||||
| python3 -c "
|
| python3 -c "import sys,json;data=json.load(sys.stdin);rs=[r for r in data.get('workflow_runs',[]) if r.get('run_number')==$RUN_NUMBER];print(rs[0]['created_at'] if rs else '')" 2>/dev/null)
|
||||||
import sys, json
|
|
||||||
data = json.load(sys.stdin)
|
|
||||||
for r in data.get('workflow_runs', []):
|
|
||||||
if r.get('run_number') == $RUN_NUMBER:
|
|
||||||
print(r['created_at'])
|
|
||||||
break
|
|
||||||
" 2>/dev/null)
|
|
||||||
if [ -n "$created_at" ]; then
|
if [ -n "$created_at" ]; then
|
||||||
queued_epoch=$(date -d "$created_at" +%s)
|
queued_epoch=$(date -d "$created_at" +%s)
|
||||||
wait_seconds=$((runner_start - queued_epoch))
|
wait_seconds=$((runner_start - queued_epoch))
|
||||||
|
|||||||
@@ -2922,9 +2922,9 @@ class EmailRepositoryImpl implements EmailRepository {
|
|||||||
|
|
||||||
final sql = accountId != null
|
final sql = accountId != null
|
||||||
? 'SELECT e.* FROM email_fts f JOIN emails e ON e.rowid = f.rowid'
|
? 'SELECT e.* FROM email_fts f JOIN emails e ON e.rowid = f.rowid'
|
||||||
' WHERE email_fts MATCH ? AND e.account_id = ? ORDER BY rank LIMIT 50'
|
' WHERE email_fts MATCH ? AND e.account_id = ? ORDER BY e.received_at DESC LIMIT 50'
|
||||||
: 'SELECT e.* FROM email_fts f JOIN emails e ON e.rowid = f.rowid'
|
: 'SELECT e.* FROM email_fts f JOIN emails e ON e.rowid = f.rowid'
|
||||||
' WHERE email_fts MATCH ? ORDER BY rank LIMIT 50';
|
' WHERE email_fts MATCH ? ORDER BY e.received_at DESC LIMIT 50';
|
||||||
final variables = accountId != null
|
final variables = accountId != null
|
||||||
? [Variable<String>(ftsQuery), Variable<String>(accountId)]
|
? [Variable<String>(ftsQuery), Variable<String>(accountId)]
|
||||||
: [Variable<String>(ftsQuery)];
|
: [Variable<String>(ftsQuery)];
|
||||||
@@ -2942,6 +2942,7 @@ class EmailRepositoryImpl implements EmailRepository {
|
|||||||
for (final e in [...emailRows.map(_toModel), ...noteRows]) {
|
for (final e in [...emailRows.map(_toModel), ...noteRows]) {
|
||||||
if (seen.add(e.id)) merged.add(e);
|
if (seen.add(e.id)) merged.add(e);
|
||||||
}
|
}
|
||||||
|
merged.sort((a, b) => b.receivedAt.compareTo(a.receivedAt));
|
||||||
return merged;
|
return merged;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2952,16 +2953,12 @@ class EmailRepositoryImpl implements EmailRepository {
|
|||||||
String? mailboxPath,
|
String? mailboxPath,
|
||||||
String query,
|
String query,
|
||||||
) async {
|
) async {
|
||||||
final words = query
|
final words =
|
||||||
.trim()
|
query.trim().split(RegExp(r'\s+')).where((w) => w.isNotEmpty).toList();
|
||||||
.split(RegExp(r'\s+'))
|
|
||||||
.where((w) => w.isNotEmpty)
|
|
||||||
.toList();
|
|
||||||
if (words.isEmpty) return [];
|
if (words.isEmpty) return [];
|
||||||
|
|
||||||
final noteConditions = words.map((_) => 'n.note_text LIKE ?').join(' AND ');
|
final noteConditions = words.map((_) => 'n.note_text LIKE ?').join(' AND ');
|
||||||
final likeVars =
|
final likeVars = words.map((w) => Variable<String>('%$w%')).toList();
|
||||||
words.map((w) => Variable<String>('%$w%')).toList();
|
|
||||||
|
|
||||||
final extraConditions = StringBuffer();
|
final extraConditions = StringBuffer();
|
||||||
final extraVars = <Variable<String>>[];
|
final extraVars = <Variable<String>>[];
|
||||||
@@ -2980,14 +2977,13 @@ class EmailRepositoryImpl implements EmailRepository {
|
|||||||
' WHERE $noteConditions$extraConditions'
|
' WHERE $noteConditions$extraConditions'
|
||||||
' ORDER BY e.received_at DESC LIMIT 50';
|
' ORDER BY e.received_at DESC LIMIT 50';
|
||||||
|
|
||||||
final rows = await _db
|
final rows = await _db.customSelect(
|
||||||
.customSelect(
|
sql,
|
||||||
sql,
|
variables: [...likeVars, ...extraVars],
|
||||||
variables: [...likeVars, ...extraVars],
|
readsFrom: {_db.emails, _db.emailNotes},
|
||||||
readsFrom: {_db.emails, _db.emailNotes},
|
).get();
|
||||||
)
|
final emailRows =
|
||||||
.get();
|
await Future.wait(rows.map((r) => _db.emails.mapFromRow(r)));
|
||||||
final emailRows = await Future.wait(rows.map((r) => _db.emails.mapFromRow(r)));
|
|
||||||
return emailRows.map(_toModel).toList();
|
return emailRows.map(_toModel).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2997,9 +2993,7 @@ class EmailRepositoryImpl implements EmailRepository {
|
|||||||
static String _toFtsQuery(String query) {
|
static String _toFtsQuery(String query) {
|
||||||
final words = query
|
final words = query
|
||||||
.trim()
|
.trim()
|
||||||
.split(RegExp(r'\s+'))
|
.split(RegExp(r'[^\w]+'))
|
||||||
.where((w) => w.isNotEmpty)
|
|
||||||
.map((w) => w.replaceAll(RegExp(r'[^\w]'), ''))
|
|
||||||
.where((w) => w.isNotEmpty)
|
.where((w) => w.isNotEmpty)
|
||||||
.toList();
|
.toList();
|
||||||
if (words.isEmpty) return '';
|
if (words.isEmpty) return '';
|
||||||
@@ -3113,7 +3107,7 @@ class EmailRepositoryImpl implements EmailRepository {
|
|||||||
|
|
||||||
const sql = 'SELECT e.* FROM email_fts f JOIN emails e ON e.rowid = f.rowid'
|
const sql = 'SELECT e.* FROM email_fts f JOIN emails e ON e.rowid = f.rowid'
|
||||||
' WHERE email_fts MATCH ? AND e.account_id = ? AND e.mailbox_path = ?'
|
' WHERE email_fts MATCH ? AND e.account_id = ? AND e.mailbox_path = ?'
|
||||||
' ORDER BY rank LIMIT 50';
|
' ORDER BY e.received_at DESC LIMIT 50';
|
||||||
final variables = [
|
final variables = [
|
||||||
Variable<String>(ftsQuery),
|
Variable<String>(ftsQuery),
|
||||||
Variable<String>(accountId),
|
Variable<String>(accountId),
|
||||||
@@ -3126,14 +3120,14 @@ class EmailRepositoryImpl implements EmailRepository {
|
|||||||
queryRows.map((r) => _db.emails.mapFromRow(r)),
|
queryRows.map((r) => _db.emails.mapFromRow(r)),
|
||||||
);
|
);
|
||||||
|
|
||||||
final noteRows =
|
final noteRows = await _searchEmailsByNotes(accountId, mailboxPath, query);
|
||||||
await _searchEmailsByNotes(accountId, mailboxPath, query);
|
|
||||||
|
|
||||||
final seen = <String>{};
|
final seen = <String>{};
|
||||||
final merged = <model.Email>[];
|
final merged = <model.Email>[];
|
||||||
for (final e in [...emailRows.map(_toModel), ...noteRows]) {
|
for (final e in [...emailRows.map(_toModel), ...noteRows]) {
|
||||||
if (seen.add(e.id)) merged.add(e);
|
if (seen.add(e.id)) merged.add(e);
|
||||||
}
|
}
|
||||||
|
merged.sort((a, b) => b.receivedAt.compareTo(a.receivedAt));
|
||||||
return merged;
|
return merged;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -109,6 +109,7 @@ class _SharedInboxAppState extends ConsumerState<SharedInboxApp> {
|
|||||||
theme: ThemeData(
|
theme: ThemeData(
|
||||||
colorScheme: ColorScheme.fromSeed(seedColor: Colors.indigo),
|
colorScheme: ColorScheme.fromSeed(seedColor: Colors.indigo),
|
||||||
useMaterial3: true,
|
useMaterial3: true,
|
||||||
|
splashFactory: NoSplash.splashFactory,
|
||||||
),
|
),
|
||||||
darkTheme: ThemeData(
|
darkTheme: ThemeData(
|
||||||
colorScheme: ColorScheme.fromSeed(
|
colorScheme: ColorScheme.fromSeed(
|
||||||
@@ -116,6 +117,7 @@ class _SharedInboxAppState extends ConsumerState<SharedInboxApp> {
|
|||||||
brightness: Brightness.dark,
|
brightness: Brightness.dark,
|
||||||
),
|
),
|
||||||
useMaterial3: true,
|
useMaterial3: true,
|
||||||
|
splashFactory: NoSplash.splashFactory,
|
||||||
),
|
),
|
||||||
routerConfig: router,
|
routerConfig: router,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ class CrashScreen extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return MaterialApp(
|
return MaterialApp(
|
||||||
|
theme: ThemeData(splashFactory: NoSplash.splashFactory),
|
||||||
home: Scaffold(
|
home: Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: const Text('Something went wrong'),
|
title: const Text('Something went wrong'),
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ void main() {
|
|||||||
tearDown(() => db.close());
|
tearDown(() => db.close());
|
||||||
|
|
||||||
test('chaos monkey — random operations do not crash the repository',
|
test('chaos monkey — random operations do not crash the repository',
|
||||||
() async {
|
timeout: Timeout.none, () async {
|
||||||
final seedStr = _env('CHAOS_SEED');
|
final seedStr = _env('CHAOS_SEED');
|
||||||
final seed = seedStr.isEmpty
|
final seed = seedStr.isEmpty
|
||||||
? DateTime.now().millisecondsSinceEpoch
|
? DateTime.now().millisecondsSinceEpoch
|
||||||
|
|||||||
@@ -514,8 +514,7 @@ void main() {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
final results =
|
final results = await r.emails.searchEmailsGlobal(null, 'urgent');
|
||||||
await r.emails.searchEmailsGlobal(null, 'urgent');
|
|
||||||
expect(results, hasLength(1));
|
expect(results, hasLength(1));
|
||||||
expect(results.first.subject, 'Weekly report');
|
expect(results.first.subject, 'Weekly report');
|
||||||
});
|
});
|
||||||
@@ -569,13 +568,76 @@ void main() {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
final results =
|
final results = await r.emails.searchEmails('acc-1', 'INBOX', 'client');
|
||||||
await r.emails.searchEmails('acc-1', 'INBOX', 'client');
|
|
||||||
expect(results, hasLength(1));
|
expect(results, hasLength(1));
|
||||||
expect(results.first.subject, 'Project update');
|
expect(results.first.subject, 'Project update');
|
||||||
expect(results.first.mailboxPath, 'INBOX');
|
expect(results.first.mailboxPath, 'INBOX');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('searchEmailsGlobal returns results sorted by receivedAt descending',
|
||||||
|
() async {
|
||||||
|
final r = _makeRepos();
|
||||||
|
await r.accounts.addAccount(_account, 'pw');
|
||||||
|
|
||||||
|
await r.db.into(r.db.emails).insert(
|
||||||
|
EmailsCompanion.insert(
|
||||||
|
id: 'acc-1:1',
|
||||||
|
accountId: 'acc-1',
|
||||||
|
mailboxPath: 'INBOX',
|
||||||
|
uid: 1,
|
||||||
|
subject: const Value('Older report'),
|
||||||
|
receivedAt: DateTime(2024),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
await r.db.into(r.db.emails).insert(
|
||||||
|
EmailsCompanion.insert(
|
||||||
|
id: 'acc-1:2',
|
||||||
|
accountId: 'acc-1',
|
||||||
|
mailboxPath: 'INBOX',
|
||||||
|
uid: 2,
|
||||||
|
subject: const Value('Newer report'),
|
||||||
|
receivedAt: DateTime(2024, 6),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final results = await r.emails.searchEmailsGlobal(null, 'report');
|
||||||
|
expect(results, hasLength(2));
|
||||||
|
expect(results[0].subject, 'Newer report');
|
||||||
|
expect(results[1].subject, 'Older report');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('searchEmails returns results sorted by receivedAt descending',
|
||||||
|
() async {
|
||||||
|
final r = _makeRepos();
|
||||||
|
await r.accounts.addAccount(_account, 'pw');
|
||||||
|
|
||||||
|
await r.db.into(r.db.emails).insert(
|
||||||
|
EmailsCompanion.insert(
|
||||||
|
id: 'acc-1:1',
|
||||||
|
accountId: 'acc-1',
|
||||||
|
mailboxPath: 'INBOX',
|
||||||
|
uid: 1,
|
||||||
|
subject: const Value('Older meeting'),
|
||||||
|
receivedAt: DateTime(2024),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
await r.db.into(r.db.emails).insert(
|
||||||
|
EmailsCompanion.insert(
|
||||||
|
id: 'acc-1:2',
|
||||||
|
accountId: 'acc-1',
|
||||||
|
mailboxPath: 'INBOX',
|
||||||
|
uid: 2,
|
||||||
|
subject: const Value('Newer meeting'),
|
||||||
|
receivedAt: DateTime(2024, 6),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final results = await r.emails.searchEmails('acc-1', 'INBOX', 'meeting');
|
||||||
|
expect(results, hasLength(2));
|
||||||
|
expect(results[0].subject, 'Newer meeting');
|
||||||
|
expect(results[1].subject, 'Older meeting');
|
||||||
|
});
|
||||||
|
|
||||||
test(
|
test(
|
||||||
'searchAddresses returns results sorted by most recently used',
|
'searchAddresses returns results sorted by most recently used',
|
||||||
() async {
|
() async {
|
||||||
|
|||||||
@@ -50,7 +50,10 @@ Widget _buildScreen({List<Account> accounts = const []}) {
|
|||||||
FakeAccountRepository(accounts),
|
FakeAccountRepository(accounts),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
child: const MaterialApp(home: AboutScreen()),
|
child: MaterialApp(
|
||||||
|
theme: ThemeData(splashFactory: NoSplash.splashFactory),
|
||||||
|
home: const AboutScreen(),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user