Files
SpotiFLAC-Mobile/test/playback_automation_settings_test.dart
T

107 lines
3.8 KiB
Dart

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:spotiflac_android/l10n/l10n.dart';
import 'package:spotiflac_android/models/settings.dart';
import 'package:spotiflac_android/models/theme_settings.dart';
import 'package:spotiflac_android/providers/settings_provider.dart';
import 'package:spotiflac_android/screens/settings/playback_settings_page.dart';
import 'package:spotiflac_android/screens/settings/settings_search_catalog.dart';
import 'package:spotiflac_android/theme/app_theme.dart';
import 'package:spotiflac_android/theme/mornye_theme.dart';
import 'package:spotiflac_android/widgets/settings_group.dart';
void main() {
for (final mornye in [false, true]) {
testWidgets('automatic controls persist in both themes ($mornye)', (
tester,
) async {
SharedPreferences.setMockInitialValues({});
tester.view.physicalSize = const Size(390, 844);
tester.view.devicePixelRatio = 1;
addTearDown(tester.view.reset);
final container = ProviderContainer(
overrides: [
initialSettingsProvider.overrideWithValue(
const AppSettings(pauseOnMute: false),
),
],
);
addTearDown(container.dispose);
await tester.pumpWidget(
UncontrolledProviderScope(
container: container,
child: MaterialApp(
theme: mornye
? MornyeTheme.build(Brightness.dark, accent: MornyeAccent.blue)
: AppTheme.light(),
locale: const Locale('en'),
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
home: const PlaybackSettingsPage(),
),
),
);
final muted = find.text('Pause when muted');
final connected = find.text('Play when headphones connect');
await tester.scrollUntilVisible(
muted,
200,
scrollable: find.byType(Scrollable).first,
);
await tester.pumpAndSettle();
await tester.tap(muted);
await tester.pumpAndSettle();
await tester.ensureVisible(connected);
await tester.pumpAndSettle();
await tester.tap(connected);
await tester.pumpAndSettle();
expect(container.read(settingsProvider).pauseOnMute, isTrue);
expect(
container.read(settingsProvider).playOnHeadphonesConnected,
isTrue,
);
final prefs = await SharedPreferences.getInstance();
final saved = AppSettings.fromJson(
jsonDecode(prefs.getString('app_settings')!) as Map<String, dynamic>,
);
expect(saved.pauseOnMute, isTrue);
expect(saved.playOnHeadphonesConnected, isTrue);
container.read(settingsProvider.notifier).setPlayerMode('external');
await tester.pump();
final automationControls = tester.widgetList<SettingsSwitchItem>(
find.byWidgetPredicate(
(widget) =>
widget is SettingsSwitchItem &&
const [
'Pause when muted',
'Play when headphones connect',
].contains(widget.title),
),
);
expect(automationControls, hasLength(2));
expect(automationControls.every((widget) => !widget.enabled), isTrue);
expect(tester.takeException(), isNull);
final l10n = AppLocalizations.of(tester.element(connected));
final catalog = SettingsSearchCatalog(l10n);
expect(
catalog.playback.any(
(entry) => entry.matches(SettingsSearchQuery('mute')),
),
isTrue,
);
expect(
catalog.playback.any(
(entry) => entry.matches(SettingsSearchQuery('earphone')),
),
isTrue,
);
});
}
}