Compare commits

...

5 commits

Author SHA1 Message Date
Vadim
b3989219a2 Merge branch 'main' of https://github.com/vodemn/m3_lightmeter into feature/ML-248 2025-08-11 23:59:33 +02:00
Vadim
3be2b9b715
ML-251 Use Xcode 16.2 (#252)
* select xcode version

* select xcode version
2025-08-11 23:59:13 +02:00
Vadim
ba3c08bb16 macos-latest 2025-08-11 22:10:15 +02:00
Vadim
109cb9db8d removed settings screen checks 2025-08-11 21:31:28 +02:00
Vadim
2369b1a3d7 typo 2025-08-11 21:31:07 +02:00
4 changed files with 10 additions and 43 deletions

View file

@ -60,9 +60,8 @@ jobs:
with: with:
submodules: recursive submodules: recursive
- uses: maxim-lobanov/setup-xcode@v1 - name: Select Xcode version
with: run: sudo xcode-select -s '/Applications/Xcode_16.2.app/Contents/Developer'
xcode-version: '16.2'
- name: Connect private iap package - name: Connect private iap package
uses: webfactory/ssh-agent@v0.8.0 uses: webfactory/ssh-agent@v0.8.0

View file

@ -13,8 +13,11 @@ jobs:
run-integration-tests: run-integration-tests:
name: Run integration tests name: Run integration tests
timeout-minutes: 90 timeout-minutes: 90
runs-on: macos-13 runs-on: macos-14
steps: steps:
- name: Select Xcode version
run: sudo xcode-select -s '/Applications/Xcode_16.2.app/Contents/Developer'
- uses: actions/checkout@v3 - uses: actions/checkout@v3
with: with:
submodules: recursive submodules: recursive

View file

@ -5,15 +5,12 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:lightmeter/data/models/ev_source_type.dart'; import 'package:lightmeter/data/models/ev_source_type.dart';
import 'package:lightmeter/data/models/metering_screen_layout_config.dart'; import 'package:lightmeter/data/models/metering_screen_layout_config.dart';
import 'package:lightmeter/data/shared_prefs_service.dart'; import 'package:lightmeter/data/shared_prefs_service.dart';
import 'package:lightmeter/generated/l10n.dart';
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/equipment_profile_picker/widget_picker_equipment_profiles.dart'; import 'package:lightmeter/screens/metering/components/shared/readings_container/components/equipment_profile_picker/widget_picker_equipment_profiles.dart';
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/extreme_exposure_pairs_container/widget_container_extreme_exposure_pairs.dart'; import 'package:lightmeter/screens/metering/components/shared/readings_container/components/extreme_exposure_pairs_container/widget_container_extreme_exposure_pairs.dart';
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/film_picker/widget_picker_film.dart'; import 'package:lightmeter/screens/metering/components/shared/readings_container/components/film_picker/widget_picker_film.dart';
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/iso_picker/widget_picker_iso.dart'; import 'package:lightmeter/screens/metering/components/shared/readings_container/components/iso_picker/widget_picker_iso.dart';
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/lightmeter_pro_badge/widget_badge_lightmeter_pro.dart'; import 'package:lightmeter/screens/metering/components/shared/readings_container/components/lightmeter_pro_badge/widget_badge_lightmeter_pro.dart';
import 'package:lightmeter/screens/metering/components/shared/readings_container/components/nd_picker/widget_picker_nd.dart'; import 'package:lightmeter/screens/metering/components/shared/readings_container/components/nd_picker/widget_picker_nd.dart';
import 'package:lightmeter/screens/settings/components/shared/disable/widget_disable.dart';
import 'package:lightmeter/screens/settings/screen_settings.dart';
import 'package:lightmeter/utils/platform_utils.dart'; import 'package:lightmeter/utils/platform_utils.dart';
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
@ -47,19 +44,10 @@ void testPurchases(String description) {
/// Expect the bare minimum free functionallity /// Expect the bare minimum free functionallity
_expectProMeteringScreen(enabled: false); _expectProMeteringScreen(enabled: false);
/// Check, that premium settings are disabled
await tester.openSettings();
await _expectProSettingsScreen(tester, enabled: false);
/// Make purchase /// Make purchase
(tester.state(find.byType(MockIAPProductsProvider)) as MockIAPProductsProviderState).buy(); (tester.state(find.byType(MockIAPProductsProvider)) as MockIAPProductsProviderState).buy();
await tester.pumpAndSettle(); await tester.pumpAndSettle();
/// Check, that premium settings are enabled
await _expectProSettingsScreen(tester, enabled: true);
/// Expect, that all the premium controls are now available to user
await tester.navigatorPop();
_expectProMeteringScreen(enabled: true); _expectProMeteringScreen(enabled: true);
/// Refund /// Refund
@ -68,19 +56,15 @@ void testPurchases(String description) {
/// Expect the bare minimum free functionallity /// Expect the bare minimum free functionallity
_expectProMeteringScreen(enabled: false); _expectProMeteringScreen(enabled: false);
/// Check, that premium settings are disabled
await tester.openSettings();
await _expectProSettingsScreen(tester, enabled: false);
}, },
); );
} }
void _expectProMeteringScreen({required bool enabled}) { void _expectProMeteringScreen({required bool enabled}) {
expect(find.byType(LightmeterProBadge), !enabled ? findsOneWidget : findsNothing); expect(find.byType(LightmeterProBadge), !enabled ? findsOneWidget : findsNothing);
expect(find.byType(EquipmentProfilePicker), enabled ? findsOneWidget : findsNothing); expect(find.byType(EquipmentProfilePicker), findsOneWidget);
expect(find.byType(ExtremeExposurePairsContainer), findsOneWidget); expect(find.byType(ExtremeExposurePairsContainer), findsOneWidget);
expect(find.byType(FilmPicker), enabled ? findsOneWidget : findsNothing); expect(find.byType(FilmPicker), findsOneWidget);
expect(find.byType(IsoValuePicker), findsOneWidget); expect(find.byType(IsoValuePicker), findsOneWidget);
expect(find.byType(NdValuePicker), findsOneWidget); expect(find.byType(NdValuePicker), findsOneWidget);
expect( expect(
@ -88,25 +72,6 @@ void _expectProMeteringScreen({required bool enabled}) {
of: find.measureButton(), of: find.measureButton(),
matching: find.byWidgetPredicate((widget) => widget is Text && widget.data!.contains('\u2081\u2080\u2080')), matching: find.byWidgetPredicate((widget) => widget is Text && widget.data!.contains('\u2081\u2080\u2080')),
), ),
enabled ? findsOneWidget : findsNothing, findsOneWidget,
); );
} }
Future<void> _expectProSettingsScreen(WidgetTester tester, {required bool enabled}) async {
void expectDisabled(String title, bool disabled) {
find.ancestor(
of: find.text(title),
matching: find.byWidgetPredicate((widget) => widget is Disable && widget.disable == disabled),
);
}
expectDisabled(S.current.showEv100, !enabled);
expectDisabled(S.current.equipmentProfiles, !enabled);
expectDisabled(S.current.filmsInUse, !enabled);
expectDisabled(S.current.cameraFeatures, !enabled);
await tester.tapDescendantTextOf<SettingsScreen>(S.current.meteringScreenLayout);
expectDisabled(S.current.meteringScreenLayoutHintEquipmentProfiles, !enabled);
expectDisabled(S.current.meteringScreenFeatureExtremeExposurePairs, false); // must be always enabled
expectDisabled(S.current.meteringScreenFeatureFilmPicker, !enabled);
await tester.tapCancelButton();
}

View file

@ -37,7 +37,7 @@ class _LogbookPhotosScreenState extends State<LogbookPhotosScreen> with SingleTi
guardProTap( guardProTap(
context, context,
() { () {
Navigator.of(context).pushNamed(NavigationRoutes.proFeaturesScreen.name); LogbookPhotosProvider.of(context).saveLogbookPhotos(value);
}, },
); );
}, },