Skip to content

Commit 34a3272

Browse files
committed
improved validator with additional possible twitter URLs
moved link validator out, and added unit tests
1 parent 3ca97d1 commit 34a3272

3 files changed

Lines changed: 52 additions & 8 deletions

File tree

mobile-app/lib/features/components/raid_submission_action_sheet.dart

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:resonance_network_wallet/features/styles/app_text_theme.dart';
1313
import 'package:resonance_network_wallet/providers/raider_quest_providers.dart';
1414
import 'package:resonance_network_wallet/shared/extensions/media_query_data_extension.dart';
1515
import 'package:resonance_network_wallet/shared/extensions/snackbar_extensions.dart';
16+
import 'package:resonance_network_wallet/utils/validators.dart';
1617

1718
class RaidSubmissionActionSheet extends ConsumerStatefulWidget {
1819
const RaidSubmissionActionSheet({super.key});
@@ -46,8 +47,8 @@ class _RaidSubmissionActionSheetState extends ConsumerState<RaidSubmissionAction
4647
String targetInput = _targetTweetController.text.trim();
4748
String replyInput = _replyTweetController.text.trim();
4849

49-
bool targetTweetIsValid = isValidXStatusUrl(targetInput);
50-
bool replyTweetIsValid = isValidXStatusUrl(replyInput);
50+
bool targetTweetIsValid = Validators.isValidXStatusUrl(targetInput);
51+
bool replyTweetIsValid = Validators.isValidXStatusUrl(replyInput);
5152

5253
String errMsg = 'Invalid X status link.';
5354

@@ -59,12 +60,6 @@ class _RaidSubmissionActionSheetState extends ConsumerState<RaidSubmissionAction
5960
});
6061
}
6162

62-
bool isValidXStatusUrl(String url) {
63-
final regex = RegExp(r'^https?:\/\/(www\.)?x\.com\/[A-Za-z0-9_]{1,15}\/status\/\d{10,25}(\?.*)?$');
64-
65-
return regex.hasMatch(url);
66-
}
67-
6863
void _closeSheet() {
6964
Navigator.of(context).pop();
7065
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Validators {
2+
static bool isValidXStatusUrl(String url) {
3+
final regex = RegExp(
4+
r'^https?:\/\/(www\.|mobile\.)?(x\.com|twitter\.com)\/[A-Za-z0-9_]{1,15}\/status\/\d{10,25}(\?.*)?$',
5+
);
6+
7+
return regex.hasMatch(url);
8+
}
9+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:resonance_network_wallet/utils/validators.dart';
3+
4+
void main() {
5+
group('Validators', () {
6+
test('isValidXStatusUrl should validate correct X and Twitter URLs', () {
7+
final validUrls = [
8+
'https://x.com/username/status/123456789012345',
9+
'https://www.x.com/username/status/123456789012345',
10+
'http://x.com/username/status/123456789012345',
11+
'https://twitter.com/username/status/123456789012345',
12+
'https://mobile.twitter.com/username/status/123456789012345',
13+
'https://mobile.x.com/username/status/123456789012345',
14+
'https://x.com/username/status/123456789012345?s=20',
15+
'https://twitter.com/User_Name/status/1234567890',
16+
];
17+
18+
for (final url in validUrls) {
19+
expect(Validators.isValidXStatusUrl(url), isTrue, reason: 'URL should be valid: $url');
20+
}
21+
});
22+
23+
test('isValidXStatusUrl should reject invalid URLs', () {
24+
final invalidUrls = [
25+
'https://google.com',
26+
'https://x.com/username',
27+
'https://x.com/status/12345', // Missing username
28+
'https://x.com/username/12345', // Missing status
29+
'ftp://x.com/username/status/12345', // Invalid protocol
30+
'https://other-domain.com/username/status/12345',
31+
'',
32+
'random text',
33+
];
34+
35+
for (final url in invalidUrls) {
36+
expect(Validators.isValidXStatusUrl(url), isFalse, reason: 'URL should be invalid: $url');
37+
}
38+
});
39+
});
40+
}

0 commit comments

Comments
 (0)