From 972f6a50af02cb7d12a7ecaa435370b1afb46210 Mon Sep 17 00:00:00 2001 From: Sebastian Jeltsch Date: Wed, 1 Oct 2025 14:32:17 +0200 Subject: [PATCH] Dart client: test addFilterParams and simplify token constructor. --- client/dart/lib/src/client.dart | 37 +++++++++++++--------------- client/dart/pubspec.yaml | 1 + client/dart/test/trailbase_test.dart | 14 +++++++++++ 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/client/dart/lib/src/client.dart b/client/dart/lib/src/client.dart index fa1c6a01..7d96a6a0 100644 --- a/client/dart/lib/src/client.dart +++ b/client/dart/lib/src/client.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:convert'; +import 'package:meta/meta.dart'; import 'package:jwt_decoder/jwt_decoder.dart'; import 'package:logging/logging.dart'; import 'package:http/http.dart' as http; @@ -244,7 +245,7 @@ class RecordApi { if (expand != null) params['expand'] = expand.join(','); for (final filter in filters ?? []) { - _addFiltersToParams(params, 'filter', filter); + addFiltersToParams(params, 'filter', filter); } final response = await _client.fetch( @@ -322,7 +323,7 @@ class RecordApi { }) async { final params = {}; for (final filter in filters ?? []) { - _addFiltersToParams(params, 'filter', filter); + addFiltersToParams(params, 'filter', filter); } final refreshToken = _client._tokenState._shouldRefresh(); @@ -391,19 +392,14 @@ class Client { {void Function(Client, Tokens?)? onAuthChange}) async { final client = Client(site, onAuthChange: onAuthChange); - try { - final uri = client.site().replace(path: '${_authApi}/status'); - final statusResponse = - await client._http.get(uri, headers: _buildHeaders(tokens)); - - final newTokens = Tokens.fromJson(jsonDecode(statusResponse.body)); - - client._tokenState = _TokenState.build(newTokens); - client._authChange?.call(client, newTokens); - } catch (err) { - // Do nothing - _logger.warning(err); - } + // Initial check if tokens are valid and potentially refresh auth token. + // Do not use _updateToken to not call [onAuthChange] on intial tokens. + client._tokenState = _TokenState.build(tokens); + await client.refreshAuthToken(); + // final uri = client.site().replace(path: '${_authApi}/status'); + // final statusResponse = + // await client._http.get(uri, headers: _buildHeaders(tokens)); + // client._updateTokens(Tokens.fromJson(jsonDecode(statusResponse.body))); return client; } @@ -498,7 +494,7 @@ class Client { String path, { Method method = Method.get, String? data, - Map? queryParams, + Map? queryParams, bool throwOnError = true, }) async { final refreshToken = _tokenState._shouldRefresh(); @@ -640,8 +636,9 @@ class _TokenState { } } -void _addFiltersToParams( - Map params, String path, FilterBase filter) { +@visibleForTesting +void addFiltersToParams( + Map params, String path, FilterBase filter) { final _ = switch (filter) { Filter(column: final c, op: final op, value: final v) => () { if (op != null) { @@ -652,12 +649,12 @@ void _addFiltersToParams( }(), And(filters: final filters) => () { filters.asMap().forEach((index, filter) { - _addFiltersToParams(params, '${path}[\$and][${index}]', filter); + addFiltersToParams(params, '${path}[\$and][${index}]', filter); }); }(), Or(filters: final filters) => () { filters.asMap().forEach((index, filter) { - _addFiltersToParams(params, '${path}[\$or][${index}]', filter); + addFiltersToParams(params, '${path}[\$or][${index}]', filter); }); }(), }; diff --git a/client/dart/pubspec.yaml b/client/dart/pubspec.yaml index 9f3c2148..3b2848f0 100644 --- a/client/dart/pubspec.yaml +++ b/client/dart/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: http: ^1.5.0 jwt_decoder: ^2.0.1 logging: ^1.3.0 + meta: ^1.16.0 dev_dependencies: lints: ^6.0.0 diff --git a/client/dart/test/trailbase_test.dart b/client/dart/test/trailbase_test.dart index 032cf185..ac031579 100644 --- a/client/dart/test/trailbase_test.dart +++ b/client/dart/test/trailbase_test.dart @@ -219,6 +219,20 @@ Future main() async { // await process.stdout.forEach(stdout.add); }); + test('filter', () { + final params = {}; + final filters = [ + Filter(column: 'col0', value: '0', op: CompareOp.greaterThan), + Filter(column: 'col0', value: '5', op: CompareOp.lessThan), + ]; + + for (final filter in filters) { + addFiltersToParams(params, 'filter', filter); + } + + expect(params.length, 2); + }); + group('client tests', () { test('auth', () async { final client = await connect();