mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-10-21 15:02:21 +02:00
Replace 16 private SettingsNotifier fakes that only returned a fixed AppSettings with test/support/fixed_settings.dart. Mornye owner WIP tests and bespoke fakes are untouched.
146 lines
5.0 KiB
Dart
146 lines
5.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:spotiflac_android/l10n/app_localizations.dart';
|
|
import 'package:spotiflac_android/providers/extension_provider.dart';
|
|
import 'package:spotiflac_android/providers/settings_provider.dart';
|
|
import 'package:spotiflac_android/screens/settings/download_fallback_extensions_page.dart';
|
|
import 'package:spotiflac_android/screens/settings/extensions_page.dart';
|
|
import 'package:spotiflac_android/screens/settings/metadata_provider_priority_page.dart';
|
|
import 'package:spotiflac_android/screens/settings/provider_priority_page.dart';
|
|
import 'package:spotiflac_android/theme/mornye_theme.dart';
|
|
import 'package:spotiflac_android/widgets/settings_group.dart';
|
|
|
|
import 'support/fixed_settings.dart';
|
|
|
|
class _Extensions extends ExtensionNotifier {
|
|
_Extensions(this.extension);
|
|
final Extension extension;
|
|
|
|
@override
|
|
ExtensionState build() =>
|
|
ExtensionState(isInitialized: true, extensions: [extension]);
|
|
}
|
|
|
|
void main() {
|
|
const extension = Extension(
|
|
id: 'example.music',
|
|
name: 'example.music',
|
|
displayName: 'Example Music',
|
|
version: '1.0.0',
|
|
description: 'Example provider',
|
|
enabled: true,
|
|
status: 'loaded',
|
|
hasDownloadProvider: true,
|
|
hasMetadataProvider: true,
|
|
);
|
|
final rows = [
|
|
('Download Priority', 'Set download service order', ProviderPriorityPage),
|
|
(
|
|
'Metadata Priority',
|
|
'Set search & metadata source order',
|
|
MetadataProviderPriorityPage,
|
|
),
|
|
(
|
|
'Fallback Extensions',
|
|
'Choose which installed download extensions can be used as fallback',
|
|
DownloadFallbackExtensionsPage,
|
|
),
|
|
];
|
|
for (final mornye in [false, true]) {
|
|
for (final (enabled, download, metadata) in [
|
|
(true, true, true),
|
|
(false, true, true),
|
|
(true, false, true),
|
|
(true, true, false),
|
|
]) {
|
|
for (final (title, subtitle, destination) in rows) {
|
|
testWidgets('$title ($mornye, $enabled, $download, $metadata)', (
|
|
tester,
|
|
) async {
|
|
final available =
|
|
enabled &&
|
|
(destination == MetadataProviderPriorityPage
|
|
? metadata
|
|
: download);
|
|
await tester.pumpWidget(
|
|
ProviderScope(
|
|
overrides: [
|
|
settingsProvider.overrideWith(FixedSettingsNotifier.new),
|
|
extensionProvider.overrideWith(
|
|
() => _Extensions(
|
|
extension.copyWith(
|
|
enabled: enabled,
|
|
hasDownloadProvider: download,
|
|
hasMetadataProvider: metadata,
|
|
),
|
|
),
|
|
),
|
|
],
|
|
child: MaterialApp(
|
|
theme: mornye
|
|
? MornyeTheme.build(Brightness.dark)
|
|
: ThemeData(),
|
|
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
|
supportedLocales: AppLocalizations.supportedLocales,
|
|
home: SettingsSearchHighlightScope(
|
|
targetLabel: title,
|
|
child: const ExtensionsPage(),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
await tester.pumpAndSettle();
|
|
final target = find.byWidgetPredicate(
|
|
(widget) => widget is SettingsSearchTarget && widget.label == title,
|
|
);
|
|
expect(target, findsOneWidget);
|
|
expect(
|
|
find.byKey(ValueKey('settings-highlight:$title')),
|
|
findsOneWidget,
|
|
);
|
|
expect(find.text(title).hitTestable(), findsOneWidget);
|
|
expect(
|
|
find.descendant(
|
|
of: target,
|
|
matching: find.text(
|
|
available
|
|
? subtitle
|
|
: 'No extensions with ${destination == MetadataProviderPriorityPage ? 'metadata' : 'download'} provider',
|
|
),
|
|
),
|
|
findsOneWidget,
|
|
);
|
|
final settingsItem = find.ancestor(
|
|
of: target,
|
|
matching: find.byType(SettingsItem),
|
|
);
|
|
expect(settingsItem, mornye ? findsOneWidget : findsNothing);
|
|
if (mornye) {
|
|
final opacity = find.ancestor(
|
|
of: settingsItem,
|
|
matching: find.byType(Opacity),
|
|
);
|
|
expect(
|
|
tester.widget<Opacity>(opacity.first).opacity,
|
|
available ? 1 : 0.5,
|
|
);
|
|
}
|
|
await tester.tap(find.text(title));
|
|
await tester.pumpAndSettle();
|
|
expect(
|
|
find.byType(destination),
|
|
available ? findsOneWidget : findsNothing,
|
|
);
|
|
expect(
|
|
find.byType(ExtensionsPage),
|
|
available ? findsNothing : findsOneWidget,
|
|
);
|
|
expect(tester.takeException(), isNull);
|
|
await tester.pumpWidget(const SizedBox.shrink());
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|