import 'dart:async'; import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:yx_tracking_flutter/src/config/analytics_config.dart'; import 'package:yx_tracking_flutter/src/network/http_client.dart'; class _FakeAdapter implements HttpClientAdapter { RequestOptions? lastOptions; Object? lastData; @override void close({bool force = false}) {} @override Future fetch( RequestOptions options, Stream>? requestStream, Future? cancelFuture, ) async { lastOptions = options; lastData = options.data; return ResponseBody.fromString( jsonEncode({'ok': true}), 200, headers: >{ Headers.contentTypeHeader: [Headers.jsonContentType], }, ); } } AnalyticsConfig _config(String baseUrl) { return AnalyticsConfig( systemCode: 'SYS', endpointBaseUrl: baseUrl, ); } void main() { group('HttpClient', () { test('会规范化 baseUrl 并使用自定义 adapter', () async { final adapter = _FakeAdapter(); final client = HttpClient( _config('https://example.com/'), httpClientAdapter: adapter, ); expect(client.dio.options.baseUrl, 'https://example.com'); final response = await client.get>('/ping'); expect(response.statusCode, 200); expect(adapter.lastOptions?.path, '/ping'); }); test('headers 为空时不会创建 Options', () async { final adapter = _FakeAdapter(); final client = HttpClient( _config('https://example.com'), httpClientAdapter: adapter, ); await client.post('/no-headers', data: {}); expect(adapter.lastOptions?.headers, isNot(contains('x-test'))); }); test('会把 headers 透传到请求', () async { final adapter = _FakeAdapter(); final client = HttpClient( _config('https://example.com'), httpClientAdapter: adapter, ); await client.post( '/with-headers', data: {'a': 1}, headers: {'x-test': '1'}, ); expect(adapter.lastOptions?.headers['x-test'], '1'); expect(adapter.lastData, {'a': 1}); }); }); }