diff --git a/lib/services/api_service.dart b/lib/services/api_service.dart new file mode 100644 index 0000000..b57454e --- /dev/null +++ b/lib/services/api_service.dart @@ -0,0 +1,31 @@ +import 'dart:convert'; +import 'package:http/http.dart' as http; + +class ApiService { + final http.Client _client; + + ApiService({http.Client? client}) : _client = client ?? http.Client(); + + Future sendScanData( + String url, { + required String barcode, + required String codeType, + }) async { + try { + final response = await _client + .post( + Uri.parse(url), + headers: {'Content-Type': 'application/json'}, + body: jsonEncode({ + 'barcode': barcode, + 'code_type': codeType, + 'timestamp': DateTime.now().toUtc().toIso8601String(), + }), + ) + .timeout(const Duration(seconds: 5)); + return response.statusCode >= 200 && response.statusCode < 300; + } catch (_) { + return false; + } + } +} diff --git a/test/services/api_service_test.dart b/test/services/api_service_test.dart new file mode 100644 index 0000000..088a1ca --- /dev/null +++ b/test/services/api_service_test.dart @@ -0,0 +1,34 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:http/http.dart' as http; +import 'package:http/testing.dart'; +import 'package:pad_scanner/services/api_service.dart'; + +void main() { + group('ApiService', () { + test('sendScanData returns true on 200', () async { + final client = MockClient((request) async { + return http.Response('{"status":"ok"}', 200); + }); + final service = ApiService(client: client); + final result = await service.sendScanData( + 'http://localhost:8000/scan', + barcode: '123456', + codeType: 'CODE128', + ); + expect(result, isTrue); + }); + + test('sendScanData returns false on error', () async { + final client = MockClient((request) async { + return http.Response('error', 500); + }); + final service = ApiService(client: client); + final result = await service.sendScanData( + 'http://localhost:8000/scan', + barcode: '123456', + codeType: 'CODE128', + ); + expect(result, isFalse); + }); + }); +}