import 'dart:async'; import 'package:dio/dio.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:reelbox/data/api_service.dart'; import 'api_service_test.dart' show StubAdapter, jsonBody; void main() { test('reopening genre and country menus reuses only those successful lists', () async { final adapter = StubAdapter((_) => jsonBody([{'id': 1, 'title': 'Tag'}])); final api = ApiService(dio: Dio()..httpClientAdapter = adapter, baseUrl: 'http://localhost/api/'); final first = await api.genres(); first.clear(); for (var i = 0; i < 8; i++) { expect((await api.genres()).single.id, 1); expect((await api.countries()).single.id, 1); } expect(adapter.requests, hasLength(2)); }); test('concurrent identical metadata reads perform one transport operation', () async { final gate = Completer(); final entered = Completer(); final adapter = StubAdapter((request) async { if (!entered.isCompleted) entered.complete(); await gate.future; return jsonBody({'id': 1, 'title': 'Film', 'nested': {'items': [1]}}); }); final api = ApiService( dio: Dio()..httpClientAdapter = adapter, baseUrl: 'http://localhost/api/', ); final reads = List.generate(12, (_) => api.get('movie/by/1/public/')); await entered.future; // Drain dispatch microtasks while all response bodies remain gated. await Future.delayed(Duration.zero); gate.complete(); final results = await Future.wait(reads); expect(adapter.requests, hasLength(1)); results.first['nested']['items'].add(2); expect(results.last['nested']['items'], [1]); await api.get('movie/by/1/public/'); expect(adapter.requests, hasLength(2), reason: 'completed detail reads stay fresh'); }); }