Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
3b0fa57
update login test cases
yoeweida36 Apr 8, 2026
734f0e9
update registration test cases
yoeweida36 Apr 9, 2026
257eaa9
The home page test cases
yoeweida36 Apr 9, 2026
0d2ac79
Profile page test cases
yoeweida36 Apr 9, 2026
7f5e725
TrackUpload test case
yoeweida36 Apr 10, 2026
ed0a710
Track test cases
yoeweida36 Apr 10, 2026
fcf1085
Player test case
yoeweida36 Apr 10, 2026
652f896
track/player page update
yoeweida36 Apr 10, 2026
d58915b
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 10, 2026
487dd04
update profile test cases
yoeweida36 Apr 10, 2026
698e607
Comments test cases + fixing some files
yoeweida36 Apr 10, 2026
c2d49c4
Playlist test cases
yoeweida36 Apr 10, 2026
400dfb6
edit profile_module test cases
yoeweida36 Apr 11, 2026
a45cce8
Track/Player/Feed (replace pumpAndSettle with pump to avoid waiting f…
yoeweida36 Apr 11, 2026
1119b3b
fix comment test case
yoeweida36 Apr 11, 2026
90f63f4
fix playlist test cases
yoeweida36 Apr 11, 2026
95fb79e
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 17, 2026
8b7834b
merging development to e2e branch & solving conflicts
yoeweida36 Apr 17, 2026
bcc57a5
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 22, 2026
c926408
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 24, 2026
af47a7a
Update register test to work with backend
yoeweida36 Apr 24, 2026
41b1b56
update profile test cases to work with backend
yoeweida36 Apr 24, 2026
ad32e22
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 24, 2026
133e1bd
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 24, 2026
6322293
update home page test cases
yoeweida36 Apr 24, 2026
8ad54c7
add initial feed page test case
yoeweida36 Apr 24, 2026
c8829de
add initial search test cases
yoeweida36 Apr 25, 2026
427f058
change placing of search modules
yoeweida36 Apr 25, 2026
3606bc6
add initial library test cases
yoeweida36 Apr 25, 2026
4299074
delete unwanted import
yoeweida36 Apr 25, 2026
4680fc9
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 25, 2026
3cb2803
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 26, 2026
1f39a36
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 26, 2026
e737304
Update the selectors.dart
yoeweida36 Apr 26, 2026
bd05e50
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 26, 2026
d1450fa
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 26, 2026
e22b69c
update feed test cases
yoeweida36 Apr 26, 2026
9667d89
Update home & feed page test cases by scrolling until visible and exp…
yoeweida36 Apr 26, 2026
a2bc896
update the search test cases with valid selectors
yoeweida36 Apr 26, 2026
8573f5f
update library test cases "Your Likes" section
yoeweida36 Apr 26, 2026
16fdc5e
update to use real API in library
yoeweida36 Apr 26, 2026
fbce56c
update for library test cases
yoeweida36 Apr 26, 2026
5ea0bf6
add initial notification tests --> waiting for keyvalues
yoeweida36 Apr 26, 2026
8bc84e8
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 26, 2026
1028e35
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 26, 2026
99e95c6
Update notification test case & keyValues
yoeweida36 Apr 26, 2026
87c46dd
Update M1_authenitication module and detect failure
yoeweida36 Apr 27, 2026
6c008f6
update modules to have same format
yoeweida36 Apr 27, 2026
249da27
Update notifications test cases to match code structure
yoeweida36 Apr 28, 2026
f138f36
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 28, 2026
f8e55f6
update notification test cases to have same format & all test cases p…
yoeweida36 Apr 28, 2026
5b448c4
delete trackUpload test case due to integration test package limitations
yoeweida36 Apr 28, 2026
b91a2fe
finalize search module test cases
yoeweida36 Apr 28, 2026
404a73d
fix naming issue in search_test
yoeweida36 Apr 28, 2026
a13a2b8
update comment test case
yoeweida36 Apr 28, 2026
ffcf8a9
final updates on comments test & add new test cases to feed module
yoeweida36 Apr 29, 2026
3849405
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 29, 2026
db50c9c
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 29, 2026
94870a5
finalize track_test & update feed tests
yoeweida36 Apr 29, 2026
99665f8
finalize feed tests (home & feed page)
yoeweida36 Apr 29, 2026
7970060
Update the library tests
yoeweida36 Apr 29, 2026
0ada02d
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 30, 2026
e4927b1
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 Apr 30, 2026
0c4c4bd
Update playlist & library tests & add keyvalues to run the tests
yoeweida36 Apr 30, 2026
d2de45b
Update player test to new structure
yoeweida36 Apr 30, 2026
57389a0
add premium test cases
yoeweida36 Apr 30, 2026
85fbfe9
add missingKeyValues in cross code + update premium & library test + …
yoeweida36 Apr 30, 2026
8c45fee
finalize premium & settings modules
yoeweida36 Apr 30, 2026
5f6a926
Updates on remaining modules
yoeweida36 Apr 30, 2026
07bdd5d
finalize profile tests & update other modules
yoeweida36 May 1, 2026
8297a3a
update library nodule
yoeweida36 May 1, 2026
8c39115
finalize library module
yoeweida36 May 1, 2026
9a42b1c
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 May 1, 2026
92bd5b8
finalize playlist module & update in player module
yoeweida36 May 1, 2026
deed01c
finalize player module
yoeweida36 May 1, 2026
08a02da
finalize authentication module
yoeweida36 May 1, 2026
d4d88c4
Clean code from unnecessary comments
yoeweida36 May 1, 2026
634484f
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 May 1, 2026
3dc243e
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 May 1, 2026
d0dbed2
change function place
yoeweida36 May 1, 2026
eba7c4d
Add a test case that goes through the main user scenarios
yoeweida36 May 2, 2026
716852d
update on the main flow
yoeweida36 May 2, 2026
e3a4f61
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 May 2, 2026
da171fc
update on the main flow
yoeweida36 May 3, 2026
e3a8a11
Merge remote-tracking branch 'origin/Development' into e2e-cross
yoeweida36 May 3, 2026
8ea5ac9
final update on main_flow, change the scenario of creating a playlist
yoeweida36 May 3, 2026
6128a34
Updates to request PR
yoeweida36 May 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 23 additions & 13 deletions integration_test/fixtures/test_data.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,29 +33,29 @@ class InvalidPassword {
}

// Valid test user for login
const String validEmail = 'bassel@rythmify.com';
const String validPassword = 'Biso1234';
const String validEmail = 'yoeweida@gmail.com';
const String validPassword = 'Yomna1234';

// New user for registration
final TestUser newUser = TestUser(
email: 'newuser@rythmify.com',
email: 'testingNewUser1@gmail.com',
password: 'NewUser1234',
username: 'newuser',
month: 'March',
day: '3',
year: '2013',
username: 'testing_user',
month: 'June',
day: '30',
year: '1999',
gender: 'Female',
);

// Existing user
final TestUser existingUser = TestUser(
email: 'bassel@rythmify.com',
password: 'Biso1234',
username: 'user-002',
email: 'yoeweida@gmail.com',
password: 'Yomna1234',
username: 'yoeweidalll',
month: 'March',
day: '5',
year: '2013',
gender: 'Male',
day: '3',
year: '2006',
gender: 'Female',
);

// User with restricted age (below 13)
Expand Down Expand Up @@ -93,6 +93,16 @@ final List<InvalidPassword> invalidPasswords = [
),
];

// Profile edit test data
const String profileEditNewName = 'User Test';
const String profileEditUserName = 'yoeweida';
const String profileEditFirstName = 'YOMNA';
const String profileEditLastName = 'Mahmoud';
const String profileEditNewCity = 'Yafa';
const String profileEditNewCountry = 'EG';
const String profileEditNewCountryName = 'Egypt';
const String profileEditNewBio = 'Integration test bio';

// Scroll test values
class ScrollValues {
static const String days = '31';
Expand Down
134 changes: 134 additions & 0 deletions integration_test/pages/M10_Notifications/notification_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import '../base_page.dart';
import '../../selectors/selectors.dart';

class NotificationsPage extends BasePage {
NotificationsPage(WidgetTester tester) : super(tester);

// ── Navigation ─────────────────────────────────────────────────────────────
Future<void> tapNotificationIcon() async => await tapByKey(homeNotificationsButton);
Future<void> tapBack() async => await tapByKey(notificationsBackButton);
Future<void> tapTrackPageBack() async => await tapByKey(behindTheTrackBackButton);
Future<void> tapProfilePageBack() async => await tapByKey(publicProfileBackButton);

// ── Scroll ─────────────────────────────────────────────────────────────────
Future<void> scrollDown() async {
await tester.drag(find.byKey(const Key(notificationsListView)), const Offset(0, -400));
await tester.pumpAndSettle(const Duration(seconds: 1));
}

Future<void> scrollUp() async {
await tester.drag(find.byKey(const Key(notificationsListView)), const Offset(0, 400));
await tester.pumpAndSettle(const Duration(seconds: 1));
}

// ── Filter ─────────────────────────────────────────────────────────────────
Future<void> tapFilterIcon() async {
await tapByKey(notificationsFilterIcon);
await tester.pumpAndSettle(const Duration(seconds: 1));
}
Future<void> tapFilterComments() async {
await tapByKey(notificationsFilterComments);
await tester.pumpAndSettle(const Duration(seconds: 2));
}
Future<void> tapFilterLikes() async {
await tapByKey(notificationsFilterLikes);
await tester.pumpAndSettle(const Duration(seconds: 2));
}
Future<void> tapFilterFollowing() async {
await tapByKey(notificationsFilterFollowing);
await tester.pumpAndSettle(const Duration(seconds: 2));
}
Future<void> tapFilterReposts() async {
await tapByKey(notificationsFilterReposts);
await tester.pumpAndSettle(const Duration(seconds: 2));
}
Future<void> tapFilterReactions() async {
await tapByKey(notificationsFilterReactions);
await tester.pumpAndSettle(const Duration(seconds: 2));
}
Future<void> tapFilterShowAll() async {
await tapByKey(notificationsFilterShowAll);
await tester.pumpAndSettle(const Duration(seconds: 2));
}

// ── Tap first notification in list ─────────────────────────────────────────
Future<void> tapFirstNotification() async {
final finder = find.byKey(const Key(notificationTileInkwell));

if (finder.evaluate().isEmpty) {
debugPrint('tapFirstNotification: no notification tiles found, skipping');
return;
}
debugPrint('tapFirstNotification: found ${finder.evaluate().length} tiles, tapping first');
// ensure the first tile is scrolled into view before tapping
await tester.ensureVisible(finder.first);
await tester.pumpAndSettle(const Duration(seconds: 1));

await tester.tap(finder.first, warnIfMissed: false);
await tester.pumpAndSettle(const Duration(seconds: 4));
}

Future<void> waitForNotificationsToLoad() async {
// first wait for bottom sheet to fully dismiss (filter button reappears)
for (int i = 0; i < 10; i++) {
await tester.pump(const Duration(milliseconds: 300));
final filterVisible = find
.byKey(const Key(notificationsFilterIcon))
.evaluate()
.isNotEmpty;
debugPrint('waitForNotifications: filterVisible=$filterVisible');
if (filterVisible) break;
}

// then wait for tiles or empty state
for (int i = 0; i < 20; i++) {
await tester.pump(const Duration(milliseconds: 500));

final isLoading = find
.byKey(const Key(notificationsLoadingIndicator))
.evaluate()
.isNotEmpty;

final hasTiles = find
.byKey(const Key(notificationTileInkwell))
.evaluate()
.isNotEmpty;

final isEmpty = find
.text('Switch to showing all to see recent notifications')
.evaluate()
.isNotEmpty;

debugPrint('waitForNotifications: loading=$isLoading tiles=$hasTiles empty=$isEmpty');

if (!isLoading && (hasTiles || isEmpty)) break;
}

await tester.pumpAndSettle(const Duration(seconds: 1));
}

// ── Visibility checks ──────────────────────────────────────────────────────
bool isNotificationsScreenVisible() => isVisible(notificationsScreenKey);
bool isHomePageVisible() => isVisible(homeScaffold);

// ── Filter result checks ───────────────────────────────────────────────────
// After applying a filter the screen is valid if EITHER:
// - the list has results (notificationsListKey visible), OR
// - the empty-filter message is shown (no notifications of that type)
// Both mean the filter was applied successfully.
bool isFilterAppliedSuccessfully() =>
isVisible(notificationsListKey) ||
find.text('Switch to showing all to see recent notifications')
.evaluate().isNotEmpty;

bool hasNotificationItems() {
final count = find.byKey(const Key(notificationTileInkwell)).evaluate().length;
debugPrint('hasNotificationItems: $count tiles found');
return count > 0;
}

bool isOnTrackPage() => isVisible(behindTheTrackBackButton);
bool isOnProfilePage() => isVisible(profileAvatarGesture);
}
Loading
Loading