Skip to content

Commit 51a53fb

Browse files
committed
internal_links: Add variable realmUrlWithSlash to add '/'
Updates the URL construction to include a trailing slash before the fragment identifier. This ensures that the URL is properly formatted and makes the url linkified. Fixes: #845
1 parent 183aa11 commit 51a53fb

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

lib/model/internal_link.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,11 @@ Uri narrowLink(PerAccountStore store, Narrow narrow, {int? nearMessageId}) {
9696
fragment.write('/near/$nearMessageId');
9797
}
9898

99-
return store.realmUrl.replace(fragment: fragment.toString());
99+
final realmUrlWithSlash = store.realmUrl.path.endsWith('/')
100+
? store.realmUrl
101+
: store.realmUrl.replace(path: '${store.realmUrl.path}/');
102+
103+
return realmUrlWithSlash.replace(fragment: fragment.toString());
100104
}
101105

102106
/// A [Narrow] from a given URL, on `store`'s realm.

test/widgets/action_sheet_test.dart

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,12 @@ late FakeApiConnection connection;
3838
Future<void> setupToMessageActionSheet(WidgetTester tester, {
3939
required Message message,
4040
required Narrow narrow,
41+
Account? account,
4142
}) async {
4243
addTearDown(testBinding.reset);
43-
44-
await testBinding.globalStore.add(eg.selfAccount, eg.initialSnapshot());
45-
final store = await testBinding.globalStore.perAccount(eg.selfAccount.id);
44+
final effectiveAccount = account ?? eg.selfAccount;
45+
await testBinding.globalStore.add(effectiveAccount, eg.initialSnapshot());
46+
final store = await testBinding.globalStore.perAccount(effectiveAccount.id);
4647
await store.addUser(eg.user(userId: message.senderId));
4748
if (message is StreamMessage) {
4849
final stream = eg.stream(streamId: message.streamId);
@@ -551,6 +552,26 @@ void main() {
551552
final expectedLink = narrowLink(store, narrow, nearMessageId: message.id).toString();
552553
check(await Clipboard.getData('text/plain')).isNotNull().text.equals(expectedLink);
553554
});
555+
556+
testWidgets('Full Url Testing', (tester) async {
557+
final message = eg.streamMessage();
558+
final narrow = TopicNarrow.ofMessage(message);
559+
await setupToMessageActionSheet(tester, message: message, narrow: narrow);
560+
final store = await testBinding.globalStore.perAccount(eg.selfAccount.id);
561+
562+
await tapCopyMessageLinkButton(tester);
563+
await tester.pump(Duration.zero);
564+
final expectedLink = narrowLink(store, narrow, nearMessageId: message.id).toString();
565+
566+
final customAccount = eg.selfAccount.copyWith(id: 2,realmUrl: Uri.parse('https://chat.example'));
567+
await setupToMessageActionSheet(tester, message: message, narrow: narrow, account: customAccount);
568+
final customAccountStore = await testBinding.globalStore.perAccount(customAccount.id);
569+
570+
await tapCopyMessageLinkButton(tester);
571+
await tester.pump(Duration.zero);
572+
final generatedLink = narrowLink(customAccountStore, narrow, nearMessageId: message.id).toString();
573+
check(expectedLink).equals(generatedLink);
574+
});
554575
});
555576

556577
group('ShareButton', () {

0 commit comments

Comments
 (0)