chore: bump dart sdk to 3.8 (#20355)

* chore: bump dart sdk to 3.8

* chore: make build

* make pigeon

* chore: format files

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
This commit is contained in:
shenlong
2025-07-29 00:34:03 +05:30
committed by GitHub
parent 9b3718120b
commit e52b9d15b5
643 changed files with 32561 additions and 35292 deletions
@@ -49,19 +49,8 @@ final _activities = [
comment: 'Second Activity',
user: UserStub.user1,
),
Activity(
id: '3',
createdAt: DateTime(300),
type: ActivityType.like,
assetId: 'asset-1',
user: UserStub.user2,
),
Activity(
id: '4',
createdAt: DateTime(400),
type: ActivityType.like,
user: UserStub.user1,
),
Activity(id: '3', createdAt: DateTime(300), type: ActivityType.like, assetId: 'asset-1', user: UserStub.user2),
Activity(id: '4', createdAt: DateTime(400), type: ActivityType.like, user: UserStub.user1),
];
void main() {
@@ -85,10 +74,7 @@ void main() {
mockCurrentAssetProvider = MockCurrentAssetProvider(AssetStub.image1);
activityMock = MockAlbumActivity(_activities);
overrides = [
albumActivityProvider(
AlbumStub.twoAsset.remoteId!,
AssetStub.image1.remoteId!,
).overrideWith(() => activityMock),
albumActivityProvider(AlbumStub.twoAsset.remoteId!, AssetStub.image1.remoteId!).overrideWith(() => activityMock),
currentAlbumProvider.overrideWith(() => mockCurrentAlbumProvider),
currentAssetProvider.overrideWith(() => mockCurrentAssetProvider),
];
@@ -108,147 +94,82 @@ void main() {
});
group("App bar", () {
testWidgets(
"No title when currentAsset != null",
(tester) async {
await tester.pumpConsumerWidget(
const ActivitiesPage(),
overrides: overrides,
);
testWidgets("No title when currentAsset != null", (tester) async {
await tester.pumpConsumerWidget(const ActivitiesPage(), overrides: overrides);
final listTile = tester.widget<AppBar>(find.byType(AppBar));
expect(listTile.title, isNull);
},
);
final listTile = tester.widget<AppBar>(find.byType(AppBar));
expect(listTile.title, isNull);
});
testWidgets(
"Album name as title when currentAsset == null",
(tester) async {
await tester.pumpConsumerWidget(
const ActivitiesPage(),
overrides: overrides,
);
await tester.pumpAndSettle();
testWidgets("Album name as title when currentAsset == null", (tester) async {
await tester.pumpConsumerWidget(const ActivitiesPage(), overrides: overrides);
await tester.pumpAndSettle();
mockCurrentAssetProvider.state = null;
await tester.pumpAndSettle();
mockCurrentAssetProvider.state = null;
await tester.pumpAndSettle();
expect(find.text(AlbumStub.twoAsset.name), findsOneWidget);
final listTile = tester.widget<AppBar>(find.byType(AppBar));
expect(listTile.title, isNotNull);
},
);
expect(find.text(AlbumStub.twoAsset.name), findsOneWidget);
final listTile = tester.widget<AppBar>(find.byType(AppBar));
expect(listTile.title, isNotNull);
});
});
group("Body", () {
testWidgets(
"Contains a stack with Activity List and Activity Input",
(tester) async {
await tester.pumpConsumerWidget(
const ActivitiesPage(),
overrides: overrides,
);
await tester.pumpAndSettle();
testWidgets("Contains a stack with Activity List and Activity Input", (tester) async {
await tester.pumpConsumerWidget(const ActivitiesPage(), overrides: overrides);
await tester.pumpAndSettle();
expect(
find.descendant(
of: find.byType(Stack),
matching: find.byType(ActivityTextField),
),
findsOneWidget,
);
expect(find.descendant(of: find.byType(Stack), matching: find.byType(ActivityTextField)), findsOneWidget);
expect(
find.descendant(
of: find.byType(Stack),
matching: find.byType(ListView),
),
findsOneWidget,
);
},
);
expect(find.descendant(of: find.byType(Stack), matching: find.byType(ListView)), findsOneWidget);
});
testWidgets(
"List Contains all dismissible activities",
(tester) async {
await tester.pumpConsumerWidget(
const ActivitiesPage(),
overrides: overrides,
);
await tester.pumpAndSettle();
testWidgets("List Contains all dismissible activities", (tester) async {
await tester.pumpConsumerWidget(const ActivitiesPage(), overrides: overrides);
await tester.pumpAndSettle();
final listFinder = find.descendant(
of: find.byType(Stack),
matching: find.byType(ListView),
);
final listChildren = find.descendant(
of: listFinder,
matching: find.byType(DismissibleActivity),
);
expect(listChildren, findsNWidgets(_activities.length));
},
);
final listFinder = find.descendant(of: find.byType(Stack), matching: find.byType(ListView));
final listChildren = find.descendant(of: listFinder, matching: find.byType(DismissibleActivity));
expect(listChildren, findsNWidgets(_activities.length));
});
testWidgets(
"Submitting text input adds a comment with the text",
(tester) async {
await tester.pumpConsumerWidget(
const ActivitiesPage(),
overrides: overrides,
);
await tester.pumpAndSettle();
testWidgets("Submitting text input adds a comment with the text", (tester) async {
await tester.pumpConsumerWidget(const ActivitiesPage(), overrides: overrides);
await tester.pumpAndSettle();
when(() => activityMock.addComment(any())).thenAnswer((_) => Future.value());
when(() => activityMock.addComment(any())).thenAnswer((_) => Future.value());
final textField = find.byType(TextField);
await tester.enterText(textField, 'Test comment');
await tester.testTextInput.receiveAction(TextInputAction.done);
final textField = find.byType(TextField);
await tester.enterText(textField, 'Test comment');
await tester.testTextInput.receiveAction(TextInputAction.done);
verify(() => activityMock.addComment('Test comment'));
},
);
verify(() => activityMock.addComment('Test comment'));
});
testWidgets(
"Owner can remove all activities",
(tester) async {
await tester.pumpConsumerWidget(
const ActivitiesPage(),
overrides: overrides,
);
await tester.pumpAndSettle();
testWidgets("Owner can remove all activities", (tester) async {
await tester.pumpConsumerWidget(const ActivitiesPage(), overrides: overrides);
await tester.pumpAndSettle();
final deletableActivityFinder = find.byWidgetPredicate(
(widget) => widget is DismissibleActivity && widget.onDismiss != null,
);
expect(deletableActivityFinder, findsNWidgets(_activities.length));
},
);
final deletableActivityFinder = find.byWidgetPredicate(
(widget) => widget is DismissibleActivity && widget.onDismiss != null,
);
expect(deletableActivityFinder, findsNWidgets(_activities.length));
});
testWidgets(
"Non-Owner can remove only their activities",
(tester) async {
final mockCurrentUser = MockCurrentUserProvider();
testWidgets("Non-Owner can remove only their activities", (tester) async {
final mockCurrentUser = MockCurrentUserProvider();
await tester.pumpConsumerWidget(
const ActivitiesPage(),
overrides: [
...overrides,
currentUserProvider.overrideWith((ref) => mockCurrentUser),
],
);
mockCurrentUser.state = UserStub.user1;
await tester.pumpAndSettle();
await tester.pumpConsumerWidget(
const ActivitiesPage(),
overrides: [...overrides, currentUserProvider.overrideWith((ref) => mockCurrentUser)],
);
mockCurrentUser.state = UserStub.user1;
await tester.pumpAndSettle();
final deletableActivityFinder = find.byWidgetPredicate(
(widget) => widget is DismissibleActivity && widget.onDismiss != null,
);
expect(
deletableActivityFinder,
findsNWidgets(
_activities.where((a) => a.user == UserStub.user1).length,
),
);
},
);
final deletableActivityFinder = find.byWidgetPredicate(
(widget) => widget is DismissibleActivity && widget.onDismiss != null,
);
expect(deletableActivityFinder, findsNWidgets(_activities.where((a) => a.user == UserStub.user1).length));
});
});
}
@@ -26,19 +26,8 @@ final _activities = [
comment: 'Second Activity',
user: UserStub.user1,
),
Activity(
id: '3',
createdAt: DateTime(300),
type: ActivityType.like,
assetId: 'asset-1',
user: UserStub.admin,
),
Activity(
id: '4',
createdAt: DateTime(400),
type: ActivityType.like,
user: UserStub.user1,
),
Activity(id: '3', createdAt: DateTime(300), type: ActivityType.like, assetId: 'asset-1', user: UserStub.admin),
Activity(id: '4', createdAt: DateTime(400), type: ActivityType.like, user: UserStub.user1),
];
void main() {
@@ -70,11 +59,7 @@ void main() {
// Init and wait for providers future to complete
provider = albumActivityProvider('test-album', 'test-asset');
listener = ListenerMock();
container.listen(
provider,
listener.call,
fireImmediately: true,
);
container.listen(provider, listener.call, fireImmediately: true);
await container.read(provider.future);
});
@@ -83,18 +68,14 @@ void main() {
verifyInOrder([
() => listener.call(null, const AsyncLoading()),
() => listener.call(
const AsyncLoading(),
any(
that: allOf(
[
isA<AsyncData<List<Activity>>>(),
predicate(
(AsyncData<List<Activity>> ad) => ad.requireValue.every((e) => _activities.contains(e)),
),
],
),
),
),
const AsyncLoading(),
any(
that: allOf([
isA<AsyncData<List<Activity>>>(),
predicate((AsyncData<List<Activity>> ad) => ad.requireValue.every((e) => _activities.contains(e))),
]),
),
),
]);
verifyNoMoreInteractions(listener);
@@ -102,30 +83,15 @@ void main() {
group('addLike()', () {
test('Like successfully added', () async {
final like = Activity(
id: '5',
createdAt: DateTime(2023),
type: ActivityType.like,
user: UserStub.admin,
);
final like = Activity(id: '5', createdAt: DateTime(2023), type: ActivityType.like, user: UserStub.admin);
when(
() => activityMock.addActivity(
'test-album',
ActivityType.like,
assetId: 'test-asset',
),
() => activityMock.addActivity('test-album', ActivityType.like, assetId: 'test-asset'),
).thenAnswer((_) async => AsyncData(like));
await container.read(provider.notifier).addLike();
verify(
() => activityMock.addActivity(
'test-album',
ActivityType.like,
assetId: 'test-asset',
),
);
verify(() => activityMock.addActivity('test-album', ActivityType.like, assetId: 'test-asset'));
final activities = await container.read(provider.future);
expect(activities, hasLength(5));
@@ -136,31 +102,14 @@ void main() {
});
test('Like failed', () async {
final like = Activity(
id: '5',
createdAt: DateTime(2023),
type: ActivityType.like,
user: UserStub.admin,
);
final like = Activity(id: '5', createdAt: DateTime(2023), type: ActivityType.like, user: UserStub.admin);
when(
() => activityMock.addActivity(
'test-album',
ActivityType.like,
assetId: 'test-asset',
),
).thenAnswer(
(_) async => AsyncError(Exception('Mock'), StackTrace.current),
);
() => activityMock.addActivity('test-album', ActivityType.like, assetId: 'test-asset'),
).thenAnswer((_) async => AsyncError(Exception('Mock'), StackTrace.current));
await container.read(provider.notifier).addLike();
verify(
() => activityMock.addActivity(
'test-album',
ActivityType.like,
assetId: 'test-asset',
),
);
verify(() => activityMock.addActivity('test-album', ActivityType.like, assetId: 'test-asset'));
final activities = await container.read(provider.future);
expect(activities, hasLength(4));
@@ -174,16 +123,11 @@ void main() {
await container.read(provider.notifier).removeActivity('3');
verify(
() => activityMock.removeActivity('3'),
);
verify(() => activityMock.removeActivity('3'));
final activities = await container.read(provider.future);
expect(activities, hasLength(3));
expect(
activities,
isNot(anyElement(predicate((Activity a) => a.id == '3'))),
);
expect(activities, isNot(anyElement(predicate((Activity a) => a.id == '3'))));
verifyNever(() => activityStatisticsMock.removeActivity());
});
@@ -195,10 +139,7 @@ void main() {
final activities = await container.read(provider.future);
expect(activities, hasLength(4));
expect(
activities,
anyElement(predicate((Activity a) => a.id == '3')),
);
expect(activities, anyElement(predicate((Activity a) => a.id == '3')));
});
test('Comment successfully removed', () async {
@@ -207,10 +148,7 @@ void main() {
await container.read(provider.notifier).removeActivity('1');
final activities = await container.read(provider.future);
expect(
activities,
isNot(anyElement(predicate((Activity a) => a.id == '1'))),
);
expect(activities, isNot(anyElement(predicate((Activity a) => a.id == '1'))));
verify(() => activityStatisticsMock.removeActivity());
});
@@ -281,11 +219,7 @@ void main() {
);
when(
() => activityMock.addActivity(
'test-album',
ActivityType.comment,
comment: 'Test-Comment',
),
() => activityMock.addActivity('test-album', ActivityType.comment, comment: 'Test-Comment'),
).thenAnswer((_) async => AsyncData(comment));
when(() => albumActivityStatisticsMock.build('test-album')).thenReturn(2);
when(() => activityMock.getAllActivities('test-album')).thenAnswer((_) async => [..._activities]);
@@ -294,12 +228,7 @@ void main() {
await container.read(albumProvider.notifier).addComment('Test-Comment');
verify(
() => activityMock.addActivity(
'test-album',
ActivityType.comment,
assetId: null,
comment: 'Test-Comment',
),
() => activityMock.addActivity('test-album', ActivityType.comment, assetId: null, comment: 'Test-Comment'),
);
final activities = await container.read(albumProvider.future);
@@ -327,9 +256,7 @@ void main() {
assetId: 'test-asset',
comment: 'Test-Comment',
),
).thenAnswer(
(_) async => AsyncError(Exception('Error'), StackTrace.current),
);
).thenAnswer((_) async => AsyncError(Exception('Error'), StackTrace.current));
await container.read(provider.notifier).addComment('Test-Comment');
@@ -15,11 +15,7 @@ void main() {
setUp(() async {
activityMock = ActivityServiceMock();
container = TestUtils.createContainer(
overrides: [
activityServiceProvider.overrideWith((ref) => activityMock),
],
);
container = TestUtils.createContainer(overrides: [activityServiceProvider.overrideWith((ref) => activityMock)]);
listener = ListenerMock();
});
@@ -31,34 +27,21 @@ void main() {
// Read here to make the getStatistics call
container.read(activityStatisticsProvider('test-album', 'test-asset'));
container.listen(
activityStatisticsProvider('test-album', 'test-asset'),
listener.call,
fireImmediately: true,
);
container.listen(activityStatisticsProvider('test-album', 'test-asset'), listener.call, fireImmediately: true);
// Sleep for the getStatistics future to resolve
await Future.delayed(const Duration(milliseconds: 1));
verifyInOrder([
() => listener.call(null, 0),
() => listener.call(0, 5),
]);
verifyInOrder([() => listener.call(null, 0), () => listener.call(0, 5)]);
verifyNoMoreInteractions(listener);
});
test('Adds activity', () async {
when(
() => activityMock.getStatistics('test-album'),
).thenAnswer((_) async => const ActivityStats(comments: 10));
when(() => activityMock.getStatistics('test-album')).thenAnswer((_) async => const ActivityStats(comments: 10));
final provider = activityStatisticsProvider('test-album');
container.listen(
provider,
listener.call,
fireImmediately: true,
);
container.listen(provider, listener.call, fireImmediately: true);
// Sleep for the getStatistics future to resolve
await Future.delayed(const Duration(milliseconds: 1));
@@ -75,11 +58,7 @@ void main() {
).thenAnswer((_) async => const ActivityStats(comments: 10));
final provider = activityStatisticsProvider('new-album', 'test-asset');
container.listen(
provider,
listener.call,
fireImmediately: true,
);
container.listen(provider, listener.call, fireImmediately: true);
// Sleep for the getStatistics future to resolve
await Future.delayed(const Duration(milliseconds: 1));
@@ -49,12 +49,7 @@ void main() {
});
testWidgets('Returns an Input text field', (tester) async {
await tester.pumpConsumerWidget(
ActivityTextField(
onSubmit: (_) {},
),
overrides: overrides,
);
await tester.pumpConsumerWidget(ActivityTextField(onSubmit: (_) {}), overrides: overrides);
expect(find.byType(TextField), findsOneWidget);
});
@@ -63,76 +58,38 @@ void main() {
final userProvider = MockCurrentUserProvider();
await tester.pumpConsumerWidget(
ActivityTextField(
onSubmit: (_) {},
),
overrides: [
currentUserProvider.overrideWith((ref) => userProvider),
...overrides,
],
ActivityTextField(onSubmit: (_) {}),
overrides: [currentUserProvider.overrideWith((ref) => userProvider), ...overrides],
);
expect(find.byType(UserCircleAvatar), findsNothing);
});
testWidgets('UserCircleAvatar displayed when user != null', (tester) async {
await tester.pumpConsumerWidget(
ActivityTextField(
onSubmit: (_) {},
),
overrides: overrides,
);
await tester.pumpConsumerWidget(ActivityTextField(onSubmit: (_) {}), overrides: overrides);
expect(find.byType(UserCircleAvatar), findsOneWidget);
});
testWidgets(
'Filled icon if likedId != null',
(tester) async {
await tester.pumpConsumerWidget(
ActivityTextField(
onSubmit: (_) {},
likeId: '1',
),
overrides: overrides,
);
expect(
find.widgetWithIcon(IconButton, Icons.favorite_rounded),
findsOneWidget,
);
expect(
find.widgetWithIcon(IconButton, Icons.favorite_border_rounded),
findsNothing,
);
},
);
testWidgets('Bordered icon if likedId == null', (tester) async {
testWidgets('Filled icon if likedId != null', (tester) async {
await tester.pumpConsumerWidget(
ActivityTextField(
onSubmit: (_) {},
),
ActivityTextField(onSubmit: (_) {}, likeId: '1'),
overrides: overrides,
);
expect(
find.widgetWithIcon(IconButton, Icons.favorite_border_rounded),
findsOneWidget,
);
expect(
find.widgetWithIcon(IconButton, Icons.favorite_rounded),
findsNothing,
);
expect(find.widgetWithIcon(IconButton, Icons.favorite_rounded), findsOneWidget);
expect(find.widgetWithIcon(IconButton, Icons.favorite_border_rounded), findsNothing);
});
testWidgets('Bordered icon if likedId == null', (tester) async {
await tester.pumpConsumerWidget(ActivityTextField(onSubmit: (_) {}), overrides: overrides);
expect(find.widgetWithIcon(IconButton, Icons.favorite_border_rounded), findsOneWidget);
expect(find.widgetWithIcon(IconButton, Icons.favorite_rounded), findsNothing);
});
testWidgets('Adds new like', (tester) async {
await tester.pumpConsumerWidget(
ActivityTextField(
onSubmit: (_) {},
),
overrides: overrides,
);
await tester.pumpConsumerWidget(ActivityTextField(onSubmit: (_) {}), overrides: overrides);
when(() => activityMock.addLike()).thenAnswer((_) => Future.value());
@@ -144,10 +101,7 @@ void main() {
testWidgets('Removes like if already liked', (tester) async {
await tester.pumpConsumerWidget(
ActivityTextField(
onSubmit: (_) {},
likeId: 'test-suffix',
),
ActivityTextField(onSubmit: (_) {}, likeId: 'test-suffix'),
overrides: overrides,
);
@@ -163,10 +117,7 @@ void main() {
String? receivedText;
await tester.pumpConsumerWidget(
ActivityTextField(
onSubmit: (text) => receivedText = text,
likeId: 'test-suffix',
),
ActivityTextField(onSubmit: (text) => receivedText = text, likeId: 'test-suffix'),
overrides: overrides,
);
@@ -180,11 +131,7 @@ void main() {
String? receviedText;
await tester.pumpConsumerWidget(
ActivityTextField(
onSubmit: (text) => receviedText = text,
isEnabled: false,
likeId: 'test-suffix',
),
ActivityTextField(onSubmit: (text) => receviedText = text, isEnabled: false, likeId: 'test-suffix'),
overrides: overrides,
);
@@ -43,14 +43,7 @@ void main() {
testWidgets('Returns a ListTile', (tester) async {
await tester.pumpConsumerWidget(
ActivityTile(
Activity(
id: '1',
createdAt: DateTime(100),
type: ActivityType.like,
user: UserStub.admin,
),
),
ActivityTile(Activity(id: '1', createdAt: DateTime(100), type: ActivityType.like, user: UserStub.admin)),
overrides: overrides,
);
@@ -59,14 +52,7 @@ void main() {
testWidgets('No trailing widget when activity assetId == null', (tester) async {
await tester.pumpConsumerWidget(
ActivityTile(
Activity(
id: '1',
createdAt: DateTime(100),
type: ActivityType.like,
user: UserStub.admin,
),
),
ActivityTile(Activity(id: '1', createdAt: DateTime(100), type: ActivityType.like, user: UserStub.admin)),
overrides: overrides,
);
@@ -77,13 +63,7 @@ void main() {
testWidgets('Asset Thumbanil as trailing widget when activity assetId != null', (tester) async {
await tester.pumpConsumerWidget(
ActivityTile(
Activity(
id: '1',
createdAt: DateTime(100),
type: ActivityType.like,
user: UserStub.admin,
assetId: '1',
),
Activity(id: '1', createdAt: DateTime(100), type: ActivityType.like, user: UserStub.admin, assetId: '1'),
),
overrides: overrides,
);
@@ -96,13 +76,7 @@ void main() {
testWidgets('No trailing widget when current asset != null', (tester) async {
await tester.pumpConsumerWidget(
ActivityTile(
Activity(
id: '1',
createdAt: DateTime(100),
type: ActivityType.like,
user: UserStub.admin,
assetId: '1',
),
Activity(id: '1', createdAt: DateTime(100), type: ActivityType.like, user: UserStub.admin, assetId: '1'),
),
overrides: overrides,
);
@@ -115,37 +89,23 @@ void main() {
});
group('Like Activity', () {
final activity = Activity(
id: '1',
createdAt: DateTime(100),
type: ActivityType.like,
user: UserStub.admin,
);
final activity = Activity(id: '1', createdAt: DateTime(100), type: ActivityType.like, user: UserStub.admin);
testWidgets('Like contains filled heart as leading', (tester) async {
await tester.pumpConsumerWidget(
ActivityTile(activity),
overrides: overrides,
);
await tester.pumpConsumerWidget(ActivityTile(activity), overrides: overrides);
// Leading widget should not be null
final listTile = tester.widget<ListTile>(find.byType(ListTile));
expect(listTile.leading, isNotNull);
// And should have a favorite icon
final favoIconFinder = find.widgetWithIcon(
listTile.leading!.runtimeType,
Icons.favorite_rounded,
);
final favoIconFinder = find.widgetWithIcon(listTile.leading!.runtimeType, Icons.favorite_rounded);
expect(favoIconFinder, findsOneWidget);
});
testWidgets('Like title is center aligned', (tester) async {
await tester.pumpConsumerWidget(
ActivityTile(activity),
overrides: overrides,
);
await tester.pumpConsumerWidget(ActivityTile(activity), overrides: overrides);
final listTile = tester.widget<ListTile>(find.byType(ListTile));
@@ -153,10 +113,7 @@ void main() {
});
testWidgets('No subtitle for likes', (tester) async {
await tester.pumpConsumerWidget(
ActivityTile(activity),
overrides: overrides,
);
await tester.pumpConsumerWidget(ActivityTile(activity), overrides: overrides);
final listTile = tester.widget<ListTile>(find.byType(ListTile));
@@ -174,10 +131,7 @@ void main() {
);
testWidgets('Comment contains User Circle Avatar as leading', (tester) async {
await tester.pumpConsumerWidget(
ActivityTile(activity),
overrides: overrides,
);
await tester.pumpConsumerWidget(ActivityTile(activity), overrides: overrides);
final userAvatarFinder = find.byType(UserCircleAvatar);
expect(userAvatarFinder, findsOneWidget);
@@ -192,10 +146,7 @@ void main() {
});
testWidgets('Comment title is top aligned', (tester) async {
await tester.pumpConsumerWidget(
ActivityTile(activity),
overrides: overrides,
);
await tester.pumpConsumerWidget(ActivityTile(activity), overrides: overrides);
final listTile = tester.widget<ListTile>(find.byType(ListTile));
@@ -203,21 +154,12 @@ void main() {
});
testWidgets('Contains comment text as subtitle', (tester) async {
await tester.pumpConsumerWidget(
ActivityTile(activity),
overrides: overrides,
);
await tester.pumpConsumerWidget(ActivityTile(activity), overrides: overrides);
final listTile = tester.widget<ListTile>(find.byType(ListTile));
expect(listTile.subtitle, isNotNull);
expect(
find.descendant(
of: find.byType(ListTile),
matching: find.text(activity.comment!),
),
findsOneWidget,
);
expect(find.descendant(of: find.byType(ListTile), matching: find.text(activity.comment!)), findsOneWidget);
});
});
}
@@ -15,12 +15,7 @@ import '../../test_utils.dart';
import '../../widget_tester_extensions.dart';
import '../asset_viewer/asset_viewer_mocks.dart';
final activity = Activity(
id: '1',
createdAt: DateTime(100),
type: ActivityType.like,
user: UserStub.admin,
);
final activity = Activity(id: '1', createdAt: DateTime(100), type: ActivityType.like, user: UserStub.admin);
void main() {
late MockCurrentAssetProvider assetProvider;
@@ -34,10 +29,7 @@ void main() {
});
testWidgets('Returns a Dismissible', (tester) async {
await tester.pumpConsumerWidget(
DismissibleActivity('1', ActivityTile(activity)),
overrides: overrides,
);
await tester.pumpConsumerWidget(DismissibleActivity('1', ActivityTile(activity)), overrides: overrides);
expect(find.byType(Dismissible), findsOneWidget);
});
@@ -58,11 +50,7 @@ void main() {
testWidgets('Ok action in ConfirmDialog should call onDismiss with activityId', (tester) async {
String? receivedActivityId;
await tester.pumpConsumerWidget(
DismissibleActivity(
'1',
ActivityTile(activity),
onDismiss: (id) => receivedActivityId = id,
),
DismissibleActivity('1', ActivityTile(activity), onDismiss: (id) => receivedActivityId = id),
overrides: overrides,
);
@@ -91,10 +79,7 @@ void main() {
});
testWidgets('No delete dialog if onDismiss is not set', (tester) async {
await tester.pumpConsumerWidget(
DismissibleActivity('1', ActivityTile(activity)),
overrides: overrides,
);
await tester.pumpConsumerWidget(DismissibleActivity('1', ActivityTile(activity)), overrides: overrides);
final dismissible = find.byType(Dismissible);
await tester.drag(dismissible, const Offset(500, 0));
@@ -104,10 +89,7 @@ void main() {
});
testWidgets('No icon for background if onDismiss is not set', (tester) async {
await tester.pumpConsumerWidget(
DismissibleActivity('1', ActivityTile(activity)),
overrides: overrides,
);
await tester.pumpConsumerWidget(DismissibleActivity('1', ActivityTile(activity)), overrides: overrides);
final dismissible = find.byType(Dismissible);
await tester.drag(dismissible, const Offset(-500, 0));
@@ -22,12 +22,7 @@ void main() {
db = await TestUtils.initIsar();
});
final albums = [
AlbumStub.emptyAlbum,
AlbumStub.sharedWithUser,
AlbumStub.oneAsset,
AlbumStub.twoAsset,
];
final albums = [AlbumStub.emptyAlbum, AlbumStub.sharedWithUser, AlbumStub.oneAsset, AlbumStub.twoAsset];
setUp(() {
db.writeTxnSync(() {
@@ -48,23 +43,13 @@ void main() {
const created = AlbumSortMode.created;
test("Created time - ASC", () {
final sorted = created.sortFn(albums, false);
final sortedList = [
AlbumStub.emptyAlbum,
AlbumStub.twoAsset,
AlbumStub.oneAsset,
AlbumStub.sharedWithUser,
];
final sortedList = [AlbumStub.emptyAlbum, AlbumStub.twoAsset, AlbumStub.oneAsset, AlbumStub.sharedWithUser];
expect(sorted, orderedEquals(sortedList));
});
test("Created time - DESC", () {
final sorted = created.sortFn(albums, true);
final sortedList = [
AlbumStub.sharedWithUser,
AlbumStub.oneAsset,
AlbumStub.twoAsset,
AlbumStub.emptyAlbum,
];
final sortedList = [AlbumStub.sharedWithUser, AlbumStub.oneAsset, AlbumStub.twoAsset, AlbumStub.emptyAlbum];
expect(sorted, orderedEquals(sortedList));
});
});
@@ -73,23 +58,13 @@ void main() {
const assetCount = AlbumSortMode.assetCount;
test("Asset Count - ASC", () {
final sorted = assetCount.sortFn(albums, false);
final sortedList = [
AlbumStub.emptyAlbum,
AlbumStub.sharedWithUser,
AlbumStub.oneAsset,
AlbumStub.twoAsset,
];
final sortedList = [AlbumStub.emptyAlbum, AlbumStub.sharedWithUser, AlbumStub.oneAsset, AlbumStub.twoAsset];
expect(sorted, orderedEquals(sortedList));
});
test("Asset Count - DESC", () {
final sorted = assetCount.sortFn(albums, true);
final sortedList = [
AlbumStub.twoAsset,
AlbumStub.oneAsset,
AlbumStub.sharedWithUser,
AlbumStub.emptyAlbum,
];
final sortedList = [AlbumStub.twoAsset, AlbumStub.oneAsset, AlbumStub.sharedWithUser, AlbumStub.emptyAlbum];
expect(sorted, orderedEquals(sortedList));
});
});
@@ -98,23 +73,13 @@ void main() {
const lastModified = AlbumSortMode.lastModified;
test("Last modified - ASC", () {
final sorted = lastModified.sortFn(albums, false);
final sortedList = [
AlbumStub.twoAsset,
AlbumStub.emptyAlbum,
AlbumStub.sharedWithUser,
AlbumStub.oneAsset,
];
final sortedList = [AlbumStub.twoAsset, AlbumStub.emptyAlbum, AlbumStub.sharedWithUser, AlbumStub.oneAsset];
expect(sorted, orderedEquals(sortedList));
});
test("Last modified - DESC", () {
final sorted = lastModified.sortFn(albums, true);
final sortedList = [
AlbumStub.oneAsset,
AlbumStub.sharedWithUser,
AlbumStub.emptyAlbum,
AlbumStub.twoAsset,
];
final sortedList = [AlbumStub.oneAsset, AlbumStub.sharedWithUser, AlbumStub.emptyAlbum, AlbumStub.twoAsset];
expect(sorted, orderedEquals(sortedList));
});
});
@@ -123,23 +88,13 @@ void main() {
const created = AlbumSortMode.created;
test("Created - ASC", () {
final sorted = created.sortFn(albums, false);
final sortedList = [
AlbumStub.emptyAlbum,
AlbumStub.twoAsset,
AlbumStub.oneAsset,
AlbumStub.sharedWithUser,
];
final sortedList = [AlbumStub.emptyAlbum, AlbumStub.twoAsset, AlbumStub.oneAsset, AlbumStub.sharedWithUser];
expect(sorted, orderedEquals(sortedList));
});
test("Created - DESC", () {
final sorted = created.sortFn(albums, true);
final sortedList = [
AlbumStub.sharedWithUser,
AlbumStub.oneAsset,
AlbumStub.twoAsset,
AlbumStub.emptyAlbum,
];
final sortedList = [AlbumStub.sharedWithUser, AlbumStub.oneAsset, AlbumStub.twoAsset, AlbumStub.emptyAlbum];
expect(sorted, orderedEquals(sortedList));
});
});
@@ -148,15 +103,12 @@ void main() {
const mostRecent = AlbumSortMode.mostRecent;
test("Most Recent - DESC", () {
final sorted = mostRecent.sortFn(
[
AlbumStub.create2020end2020Album,
AlbumStub.create2020end2022Album,
AlbumStub.create2020end2024Album,
AlbumStub.create2020end2026Album,
],
false,
);
final sorted = mostRecent.sortFn([
AlbumStub.create2020end2020Album,
AlbumStub.create2020end2022Album,
AlbumStub.create2020end2024Album,
AlbumStub.create2020end2026Album,
], false);
final sortedList = [
AlbumStub.create2020end2026Album,
AlbumStub.create2020end2024Album,
@@ -167,15 +119,12 @@ void main() {
});
test("Most Recent - ASC", () {
final sorted = mostRecent.sortFn(
[
AlbumStub.create2020end2020Album,
AlbumStub.create2020end2022Album,
AlbumStub.create2020end2024Album,
AlbumStub.create2020end2026Album,
],
true,
);
final sorted = mostRecent.sortFn([
AlbumStub.create2020end2020Album,
AlbumStub.create2020end2022Album,
AlbumStub.create2020end2024Album,
AlbumStub.create2020end2026Album,
], true);
final sortedList = [
AlbumStub.create2020end2020Album,
AlbumStub.create2020end2022Album,
@@ -191,23 +140,13 @@ void main() {
test("Most Oldest - ASC", () {
final sorted = mostOldest.sortFn(albums, false);
final sortedList = [
AlbumStub.twoAsset,
AlbumStub.emptyAlbum,
AlbumStub.oneAsset,
AlbumStub.sharedWithUser,
];
final sortedList = [AlbumStub.twoAsset, AlbumStub.emptyAlbum, AlbumStub.oneAsset, AlbumStub.sharedWithUser];
expect(sorted, orderedEquals(sortedList));
});
test("Most Oldest - DESC", () {
final sorted = mostOldest.sortFn(albums, true);
final sortedList = [
AlbumStub.sharedWithUser,
AlbumStub.oneAsset,
AlbumStub.emptyAlbum,
AlbumStub.twoAsset,
];
final sortedList = [AlbumStub.sharedWithUser, AlbumStub.oneAsset, AlbumStub.emptyAlbum, AlbumStub.twoAsset];
expect(sorted, orderedEquals(sortedList));
});
});
@@ -221,67 +160,43 @@ void main() {
setUp(() async {
settingsMock = MockAppSettingsService();
container = TestUtils.createContainer(
overrides: [
appSettingsServiceProvider.overrideWith((ref) => settingsMock),
],
overrides: [appSettingsServiceProvider.overrideWith((ref) => settingsMock)],
);
when(
() => settingsMock.setSetting<bool>(
AppSettingsEnum.selectedAlbumSortReverse,
any(),
),
() => settingsMock.setSetting<bool>(AppSettingsEnum.selectedAlbumSortReverse, any()),
).thenAnswer((_) async => {});
when(
() => settingsMock.setSetting<int>(
AppSettingsEnum.selectedAlbumSortOrder,
any(),
),
() => settingsMock.setSetting<int>(AppSettingsEnum.selectedAlbumSortOrder, any()),
).thenAnswer((_) async => {});
});
test('Returns the default sort mode when none set', () {
// Returns the default value when nothing is set
when(
() => settingsMock.getSetting(AppSettingsEnum.selectedAlbumSortOrder),
).thenReturn(0);
when(() => settingsMock.getSetting(AppSettingsEnum.selectedAlbumSortOrder)).thenReturn(0);
expect(container.read(albumSortByOptionsProvider), AlbumSortMode.created);
});
test('Returns the correct sort mode with index from Store', () {
// Returns the default value when nothing is set
when(
() => settingsMock.getSetting(AppSettingsEnum.selectedAlbumSortOrder),
).thenReturn(3);
when(() => settingsMock.getSetting(AppSettingsEnum.selectedAlbumSortOrder)).thenReturn(3);
expect(
container.read(albumSortByOptionsProvider),
AlbumSortMode.lastModified,
);
expect(container.read(albumSortByOptionsProvider), AlbumSortMode.lastModified);
});
test('Properly saves the correct store index of sort mode', () {
container.read(albumSortByOptionsProvider.notifier).changeSortMode(AlbumSortMode.mostOldest);
verify(
() => settingsMock.setSetting(
AppSettingsEnum.selectedAlbumSortOrder,
AlbumSortMode.mostOldest.storeIndex,
),
() => settingsMock.setSetting(AppSettingsEnum.selectedAlbumSortOrder, AlbumSortMode.mostOldest.storeIndex),
);
});
test('Notifies listeners on state change', () {
when(
() => settingsMock.getSetting(AppSettingsEnum.selectedAlbumSortOrder),
).thenReturn(0);
when(() => settingsMock.getSetting(AppSettingsEnum.selectedAlbumSortOrder)).thenReturn(0);
final listener = ListenerMock<AlbumSortMode>();
container.listen(
albumSortByOptionsProvider,
listener.call,
fireImmediately: true,
);
container.listen(albumSortByOptionsProvider, listener.call, fireImmediately: true);
// Created -> Most Oldest
container.read(albumSortByOptionsProvider.notifier).changeSortMode(AlbumSortMode.mostOldest);
@@ -309,28 +224,18 @@ void main() {
setUp(() async {
settingsMock = MockAppSettingsService();
container = TestUtils.createContainer(
overrides: [
appSettingsServiceProvider.overrideWith((ref) => settingsMock),
],
overrides: [appSettingsServiceProvider.overrideWith((ref) => settingsMock)],
);
when(
() => settingsMock.setSetting<bool>(
AppSettingsEnum.selectedAlbumSortReverse,
any(),
),
() => settingsMock.setSetting<bool>(AppSettingsEnum.selectedAlbumSortReverse, any()),
).thenAnswer((_) async => {});
when(
() => settingsMock.setSetting<int>(
AppSettingsEnum.selectedAlbumSortOrder,
any(),
),
() => settingsMock.setSetting<int>(AppSettingsEnum.selectedAlbumSortOrder, any()),
).thenAnswer((_) async => {});
});
test('Returns the default sort order when none set - false', () {
when(
() => settingsMock.getSetting(AppSettingsEnum.selectedAlbumSortReverse),
).thenReturn(false);
when(() => settingsMock.getSetting(AppSettingsEnum.selectedAlbumSortReverse)).thenReturn(false);
expect(container.read(albumSortOrderProvider), isFalse);
});
@@ -338,25 +243,14 @@ void main() {
test('Properly saves the correct order', () {
container.read(albumSortOrderProvider.notifier).changeSortDirection(true);
verify(
() => settingsMock.setSetting(
AppSettingsEnum.selectedAlbumSortReverse,
true,
),
);
verify(() => settingsMock.setSetting(AppSettingsEnum.selectedAlbumSortReverse, true));
});
test('Notifies listeners on state change', () {
when(
() => settingsMock.getSetting(AppSettingsEnum.selectedAlbumSortReverse),
).thenReturn(false);
when(() => settingsMock.getSetting(AppSettingsEnum.selectedAlbumSortReverse)).thenReturn(false);
final listener = ListenerMock<bool>();
container.listen(
albumSortOrderProvider,
listener.call,
fireImmediately: true,
);
container.listen(albumSortOrderProvider, listener.call, fireImmediately: true);
// false -> true
container.read(albumSortOrderProvider.notifier).changeSortDirection(true);
@@ -5,21 +5,11 @@ import 'package:immich_mobile/extensions/asset_extensions.dart';
import 'package:timezone/data/latest.dart';
import 'package:timezone/timezone.dart';
ExifInfo makeExif({
DateTime? dateTimeOriginal,
String? timeZone,
}) {
return ExifInfo(
dateTimeOriginal: dateTimeOriginal,
timeZone: timeZone,
);
ExifInfo makeExif({DateTime? dateTimeOriginal, String? timeZone}) {
return ExifInfo(dateTimeOriginal: dateTimeOriginal, timeZone: timeZone);
}
Asset makeAsset({
required String id,
required DateTime createdAt,
ExifInfo? exifInfo,
}) {
Asset makeAsset({required String id, required DateTime createdAt, ExifInfo? exifInfo}) {
return Asset(
checksum: '',
localId: id,
@@ -79,10 +69,7 @@ void main() {
test('Returns dateTimeOriginal in UTC from exifInfo with invalid timezone', () {
final createdAt = DateTime.parse("2023-01-27T14:00:00-0500");
final dateTimeOriginal = DateTime.parse("2022-01-27T14:00:00+0530");
final e = makeExif(
dateTimeOriginal: dateTimeOriginal,
timeZone: "#_#",
); // Invalid timezone
final e = makeExif(dateTimeOriginal: dateTimeOriginal, timeZone: "#_#"); // Invalid timezone
final a = makeAsset(id: '1', createdAt: createdAt, exifInfo: e);
final (dt, tz) = a.getTZAdjustedTimeAndOffset();
@@ -5,10 +5,7 @@ import 'package:immich_mobile/extensions/string_extensions.dart';
void main() {
group('Test toDuration', () {
test('ok', () {
expect(
"1:02:33".toDuration(),
const Duration(hours: 1, minutes: 2, seconds: 33),
);
expect("1:02:33".toDuration(), const Duration(hours: 1, minutes: 2, seconds: 33));
});
test('malformed', () {
expect("".toDuration(), isNull);
@@ -45,9 +42,7 @@ void main() {
test('withKey', () {
final a = ["a", "bb", "cc", "ddd"];
expect(
a.uniqueConsecutive(
compare: (s1, s2) => s1.length.compareTo(s2.length),
),
a.uniqueConsecutive(compare: (s1, s2) => s1.length.compareTo(s2.length)),
orderedEquals(["a", "bb", "ddd"]),
);
});
@@ -58,10 +58,7 @@ void main() {
group('Test grouped', () {
test('test grouped check months', () async {
final renderList = await RenderList.fromAssets(
assets,
GroupAssetsBy.day,
);
final renderList = await RenderList.fromAssets(assets, GroupAssetsBy.day);
// Oct
// Day 1
@@ -75,33 +72,18 @@ void main() {
// Day 1
// 5 Assets => 2 Rows
expect(renderList.elements, hasLength(4));
expect(
renderList.elements[0].type,
RenderAssetGridElementType.monthTitle,
);
expect(renderList.elements[0].type, RenderAssetGridElementType.monthTitle);
expect(renderList.elements[0].date.month, 1);
expect(
renderList.elements[1].type,
RenderAssetGridElementType.groupDividerTitle,
);
expect(renderList.elements[1].type, RenderAssetGridElementType.groupDividerTitle);
expect(renderList.elements[1].date.month, 1);
expect(
renderList.elements[2].type,
RenderAssetGridElementType.monthTitle,
);
expect(renderList.elements[2].type, RenderAssetGridElementType.monthTitle);
expect(renderList.elements[2].date.month, 2);
expect(
renderList.elements[3].type,
RenderAssetGridElementType.monthTitle,
);
expect(renderList.elements[3].type, RenderAssetGridElementType.monthTitle);
expect(renderList.elements[3].date.month, 10);
});
test('test grouped check types', () async {
final renderList = await RenderList.fromAssets(
assets,
GroupAssetsBy.day,
);
final renderList = await RenderList.fromAssets(assets, GroupAssetsBy.day);
// Oct
// Day 1
@@ -67,9 +67,7 @@ void main() {
overrides: overrides,
);
mapStateNotifier.state = mapState.copyWith(
darkStyleFetched: const AsyncError("Error", StackTrace.empty),
);
mapStateNotifier.state = mapState.copyWith(darkStyleFetched: const AsyncError("Error", StackTrace.empty));
await tester.pumpAndSettle();
expect(mapStyle?.hasError, isTrue);
});
@@ -86,10 +84,7 @@ void main() {
overrides: overrides,
);
mapStateNotifier.state = mapState.copyWith(
themeMode: ThemeMode.light,
lightStyleFetched: const AsyncData("light"),
);
mapStateNotifier.state = mapState.copyWith(themeMode: ThemeMode.light, lightStyleFetched: const AsyncData("light"));
await tester.pumpAndSettle();
expect(mapStyle?.valueOrNull, "light");
});
@@ -66,13 +66,7 @@ void main() {
final MockPartnerRepository partnerRepository = MockPartnerRepository();
final MockUserService userService = MockUserService();
final owner = UserDto(
id: "1",
updatedAt: DateTime.now(),
email: "a@b.c",
name: "first last",
isAdmin: false,
);
final owner = UserDto(id: "1", updatedAt: DateTime.now(), email: "a@b.c", name: "first last", isAdmin: false);
late SyncService s;
setUpAll(() async {
WidgetsFlutterBinding.ensureInitialized();
@@ -81,10 +75,7 @@ void main() {
db.writeTxnSync(() => db.clearSync());
await StoreService.init(storeRepository: IsarStoreRepository(db));
await Store.put(StoreKey.currentUser, owner);
await LogService.init(
logRepository: IsarLogRepository(db),
storeRepository: IsarStoreRepository(db),
);
await LogService.init(logRepository: IsarLogRepository(db), storeRepository: IsarStoreRepository(db));
});
final List<Asset> initialAssets = [
makeAsset(checksum: "a", remoteId: "0-1"),
@@ -119,22 +110,20 @@ void main() {
when(() => userRepository.getAll(sortBy: SortUserBy.id)).thenAnswer((_) async => [owner]);
when(() => userRepository.getAll()).thenAnswer((_) async => [owner]);
when(
() => assetRepository.getAll(
ownerId: owner.id,
sortBy: AssetSort.checksum,
),
() => assetRepository.getAll(ownerId: owner.id, sortBy: AssetSort.checksum),
).thenAnswer((_) async => initialAssets);
when(() => assetRepository.getAllByOwnerIdChecksum(any(), any()))
.thenAnswer((_) async => [initialAssets[3], null, null]);
when(
() => assetRepository.getAllByOwnerIdChecksum(any(), any()),
).thenAnswer((_) async => [initialAssets[3], null, null]);
when(() => assetRepository.updateAll(any())).thenAnswer((_) async => []);
when(() => assetRepository.deleteByIds(any())).thenAnswer((_) async {});
when(() => exifInfoRepository.updateAll(any())).thenAnswer((_) async => []);
when(() => assetRepository.transaction<void>(any())).thenAnswer(
(call) => (call.positionalArguments.first as Function).call(),
);
when(() => assetRepository.transaction<Null>(any())).thenAnswer(
(call) => (call.positionalArguments.first as Function).call(),
);
when(
() => assetRepository.transaction<void>(any()),
).thenAnswer((call) => (call.positionalArguments.first as Function).call());
when(
() => assetRepository.transaction<Null>(any()),
).thenAnswer((call) => (call.positionalArguments.first as Function).call());
when(() => userApiRepository.getAll()).thenAnswer((_) async => [owner]);
registerFallbackValue(Direction.sharedByMe);
when(() => partnerApiRepository.getAll(any())).thenAnswer((_) async => []);
@@ -170,9 +159,7 @@ void main() {
);
expect(c1, isTrue);
final updatedAsset = initialAssets[3].updatedCopy(remoteAssets[3]);
verify(
() => assetRepository.updateAll([remoteAssets[4], remoteAssets[5], updatedAsset]),
);
verify(() => assetRepository.updateAll([remoteAssets[4], remoteAssets[5], updatedAsset]));
});
test('test syncing duplicate assets', () async {
@@ -191,10 +178,7 @@ void main() {
);
expect(c1, isTrue);
when(
() => assetRepository.getAll(
ownerId: owner.id,
sortBy: AssetSort.checksum,
),
() => assetRepository.getAll(ownerId: owner.id, sortBy: AssetSort.checksum),
).thenAnswer((_) async => remoteAssets);
final bool c2 = await s.syncRemoteAssetsToDb(
users: [owner],
@@ -204,10 +188,7 @@ void main() {
expect(c2, isFalse);
final currentState = [...remoteAssets];
when(
() => assetRepository.getAll(
ownerId: owner.id,
sortBy: AssetSort.checksum,
),
() => assetRepository.getAll(ownerId: owner.id, sortBy: AssetSort.checksum),
).thenAnswer((_) async => currentState);
remoteAssets.removeAt(4);
final bool c3 = await s.syncRemoteAssetsToDb(
@@ -228,18 +209,19 @@ void main() {
test('test efficient sync', () async {
when(
() => assetRepository.deleteAllByRemoteId(
[initialAssets[1].remoteId!, initialAssets[2].remoteId!],
state: AssetState.remote,
),
() => assetRepository.deleteAllByRemoteId([
initialAssets[1].remoteId!,
initialAssets[2].remoteId!,
], state: AssetState.remote),
).thenAnswer((_) async {
return;
});
when(
() => assetRepository.getAllByRemoteId(["2-1", "1-1"], state: AssetState.merged),
).thenAnswer((_) async => [initialAssets[2]]);
when(() => assetRepository.getAllByOwnerIdChecksum(any(), any()))
.thenAnswer((_) async => [initialAssets[0], null, null]); //afg
when(
() => assetRepository.getAllByOwnerIdChecksum(any(), any()),
).thenAnswer((_) async => [initialAssets[0], null, null]); //afg
final List<Asset> toUpsert = [
makeAsset(checksum: "a", remoteId: "0-1"), // changed
makeAsset(checksum: "f", remoteId: "0-2"), // new
@@ -262,18 +244,11 @@ void main() {
test('test upsert with EXIF data', () async {
final assets = [AssetStub.image1, AssetStub.image2];
expect(
assets.map((a) => a.exifInfo?.assetId),
List.filled(assets.length, null),
);
expect(assets.map((a) => a.exifInfo?.assetId), List.filled(assets.length, null));
await s.upsertAssetsWithExif(assets);
verify(
() => exifInfoRepository.updateAll(
any(
that: containsAll(
assets.map((a) => a.exifInfo!.copyWith(assetId: a.id)),
),
),
any(that: containsAll(assets.map((a) => a.exifInfo!.copyWith(assetId: a.id)))),
),
);
expect(assets.map((a) => a.exifInfo?.assetId), assets.map((a) => a.id));
@@ -282,8 +257,4 @@ void main() {
});
}
Future<(List<Asset>?, List<String>?)> _failDiff(
List<UserDto> user,
DateTime time,
) =>
Future.value((null, null));
Future<(List<Asset>?, List<String>?)> _failDiff(List<UserDto> user, DateTime time) => Future.value((null, null));
@@ -7,33 +7,13 @@ void main() {
AsyncMutex lock = AsyncMutex();
List<int> events = [];
expect(0, lock.enqueued);
lock.run(
() => Future.delayed(
const Duration(milliseconds: 10),
() => events.add(1),
),
);
lock.run(() => Future.delayed(const Duration(milliseconds: 10), () => events.add(1)));
expect(1, lock.enqueued);
lock.run(
() => Future.delayed(
const Duration(milliseconds: 3),
() => events.add(2),
),
);
lock.run(() => Future.delayed(const Duration(milliseconds: 3), () => events.add(2)));
expect(2, lock.enqueued);
lock.run(
() => Future.delayed(
const Duration(milliseconds: 1),
() => events.add(3),
),
);
lock.run(() => Future.delayed(const Duration(milliseconds: 1), () => events.add(3)));
expect(3, lock.enqueued);
await lock.run(
() => Future.delayed(
const Duration(milliseconds: 10),
() => events.add(4),
),
);
await lock.run(() => Future.delayed(const Duration(milliseconds: 10), () => events.add(4)));
expect(0, lock.enqueued);
expect(events, [1, 2, 3, 4]);
});
@@ -9,22 +9,12 @@ void main() {
final dateTimeString = DateFormat.yMMMMd().format(dateTime);
test('returns description if it has one', () {
final result = getAltText(
const ExifInfo(description: 'description'),
dateTime,
AssetType.image,
[],
);
final result = getAltText(const ExifInfo(description: 'description'), dateTime, AssetType.image, []);
expect(result, 'description');
});
test('returns image alt text with date if no location', () {
final (template, args) = getAltTextTemplate(
const ExifInfo(),
dateTime,
AssetType.image,
[],
);
final (template, args) = getAltTextTemplate(const ExifInfo(), dateTime, AssetType.image, []);
expect(template, "image_alt_text_date");
expect(args["isVideo"], "false");
expect(args["date"], dateTimeString);
@@ -45,12 +35,7 @@ void main() {
});
test('returns image alt text with date and some people', () {
final (template, args) = getAltTextTemplate(
const ExifInfo(),
dateTime,
AssetType.image,
["Alice", "Bob"],
);
final (template, args) = getAltTextTemplate(const ExifInfo(), dateTime, AssetType.image, ["Alice", "Bob"]);
expect(template, "image_alt_text_date_2_people");
expect(args["isVideo"], "false");
expect(args["date"], dateTimeString);
@@ -6,10 +6,7 @@ void main() {
String? result;
result = getVersionCompatibilityMessage(1, 0, 2, 0);
expect(
result,
'Your app major version is not compatible with the server!',
);
expect(result, 'Your app major version is not compatible with the server!');
result = getVersionCompatibilityMessage(1, 106, 1, 105);
expect(