Files
reelbox/test/api_iran_backend_test.dart

87 lines
3.3 KiB
Dart

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<ApiException>()));
final adapter = fixtures.StubAdapter((_) => fixtures.jsonBody([]));
final api = ApiService(dio: Dio()..httpClientAdapter = adapter);
await expectLater(api.setBaseUrl(original), throwsA(isA<ApiException>()));
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<ApiException>()));
}
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');
},
);
}