import 'package:dio/dio.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:reelbox/data/api_service.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'api_service_test.dart' as fixtures; void main() { TestWidgetsFlutterBinding.ensureInitialized(); setUp(() => SharedPreferences.setMockInitialValues({})); for (final key in ['reelbox.api-selection.v1', 'reelbox.trusted-api.v1']) { for (final initializeFirst in [true, false]) { test( 'migrates $key before ${initializeFirst ? 'initialization' : 'first request'} without touching local data', () async { const library = '{"saved":[{"id":7}],"locale":"fa","unknown":"keep exactly"}'; SharedPreferences.setMockInitialValues({ key: 'https://ninwinios.info/api/', 'reelbox.local.v1': library, 'unrelated-setting': 'keep', }); String? valueAtRequest; final adapter = fixtures.StubAdapter((request) async { final prefs = await SharedPreferences.getInstance(); valueAtRequest = prefs.getString(key); return fixtures.jsonBody([]); }); final api = ApiService(dio: Dio()..httpClientAdapter = adapter); if (initializeFirst) { await api.initialize(); expect(adapter.requests, isEmpty); } await api.genres(); expect( valueAtRequest, key == 'reelbox.api-selection.v1' ? 'primary' : isNull, ); expect( adapter.requests.single.uri.origin, 'https://reelbox.dartty.top', ); expect(api.baseUrl, ApiService.iranBaseUrl); final prefs = await SharedPreferences.getInstance(); expect(prefs.getString('reelbox.api-selection.v1'), 'primary'); expect(prefs.getString('reelbox.local.v1'), library); expect(prefs.getString('unrelated-setting'), 'keep'); }, ); } } test( 'Original API cannot be selected or injected as a production backend', () async { const original = 'https://ninwinios.info/api/'; expect(() => ApiService(baseUrl: original), throwsA(isA())); final adapter = fixtures.StubAdapter((_) => fixtures.jsonBody([])); final api = ApiService(dio: Dio()..httpClientAdapter = adapter); await expectLater(api.setBaseUrl(original), throwsA(isA())); expect(api.baseUrl, ApiService.iranBaseUrl); for (final url in [ '${original}genre/all/public/', 'https://ninnies-server.info/api-user/newapi/config-server186.txt', ]) { await expectLater(api.get(url), throwsA(isA())); } expect(adapter.requests, isEmpty); }, ); test( 'production starts on Iran without configuration discovery traffic', () async { final adapter = fixtures.StubAdapter((_) => fixtures.jsonBody([])); final api = ApiService(dio: Dio()..httpClientAdapter = adapter); await api.initialize(); expect(api.baseUrl, ApiService.iranBaseUrl); expect(ApiService.defaultBaseUrl, ApiService.iranBaseUrl); expect(adapter.requests, isEmpty); await api.genres(); expect(adapter.requests.single.uri.origin, 'https://reelbox.dartty.top'); }, ); }