From 8fdf9dbe320d77f28c68e81caf8e612116d7f68d Mon Sep 17 00:00:00 2001 From: Jean-Michel Joary Date: Tue, 7 Oct 2025 10:07:18 +0200 Subject: [PATCH 1/4] Test login with provider --- lib/src/directus_api.dart | 8 ++++++++ lib/src/directus_api_manager_base.dart | 11 +++++++++++ lib/src/idirectus_api_manager.dart | 2 ++ lib/test/mock_directus_api_manager.dart | 9 +++++++++ test/mock/mock_directus_api.dart | 7 +++++++ 5 files changed, 37 insertions(+) diff --git a/lib/src/directus_api.dart b/lib/src/directus_api.dart index 59c28a9..ed43a7d 100644 --- a/lib/src/directus_api.dart +++ b/lib/src/directus_api.dart @@ -70,6 +70,7 @@ abstract class IDirectusAPI { PreparedRequest prepareLoginRequest(String username, String password, {String? oneTimePassword}); + PreparedRequest prepareLoginRequestWithProvider({required String provider}); DirectusLoginResult parseLoginResponse(Response response); PreparedRequest prepareUserInviteRequest(String email, String roleId); @@ -633,6 +634,13 @@ class DirectusAPI implements IDirectusAPI { request.addJsonHeaders(); return PreparedRequest(request: request); } + + @override + PreparedRequest prepareLoginRequestWithProvider({required String provider}) { + final request = Request("GET", Uri.parse("$_baseURL/auth/login/$provider")); + + return PreparedRequest(request: request); + } } extension RequestJson on Request { diff --git a/lib/src/directus_api_manager_base.dart b/lib/src/directus_api_manager_base.dart index ca81f7d..e0da288 100644 --- a/lib/src/directus_api_manager_base.dart +++ b/lib/src/directus_api_manager_base.dart @@ -892,4 +892,15 @@ class DirectusApiManager implements IDirectusApiManager { startWebsocketSubscription(existingSubscription); } } + + @override + Future loginDirectusUserWithProvider( + {required String provider}) { + return _sendRequest( + prepareRequest: () => + _api.prepareLoginRequestWithProvider(provider: provider), + dependsOnToken: false, + canSaveResponseToCache: false, + parseResponse: (response) => _api.parseLoginResponse(response)); + } } diff --git a/lib/src/idirectus_api_manager.dart b/lib/src/idirectus_api_manager.dart index b14aae6..79c1c16 100644 --- a/lib/src/idirectus_api_manager.dart +++ b/lib/src/idirectus_api_manager.dart @@ -5,6 +5,8 @@ abstract class IDirectusApiManager { Future loginDirectusUser( String username, String password, {String? oneTimePassword}); + Future loginDirectusUserWithProvider( + {required String provider}); Future logoutDirectusUser(); Future registerDirectusUser( {required String email, diff --git a/lib/test/mock_directus_api_manager.dart b/lib/test/mock_directus_api_manager.dart index 4af4162..f429453 100644 --- a/lib/test/mock_directus_api_manager.dart +++ b/lib/test/mock_directus_api_manager.dart @@ -275,4 +275,13 @@ class MockDirectusApiManager extends IDirectusApiManager with MockMixin { void discardCurrentUserCache() { addCall(named: "discardCurrentUserCache"); } + + @override + Future loginDirectusUserWithProvider( + {required String provider}) { + addCall( + named: "loginDirectusUserWithProvider", + arguments: {"provider": provider}); + return Future.value(popNextReturnedObject()); + } } diff --git a/test/mock/mock_directus_api.dart b/test/mock/mock_directus_api.dart index 3225903..8ec288d 100644 --- a/test/mock/mock_directus_api.dart +++ b/test/mock/mock_directus_api.dart @@ -331,4 +331,11 @@ class MockDirectusApi with MockMixin implements IDirectusAPI { addReceivedObject(lastname, name: "lastname"); return nextReturnedRequest; } + + @override + PreparedRequest prepareLoginRequestWithProvider({required String provider}) { + addCalledFunction(named: "prepareLoginRequestWithProvider"); + addReceivedObject(provider, name: "provider"); + return nextReturnedRequest; + } } From 9e92a09bc7d440ec99c083acbac9ad0b219c0f67 Mon Sep 17 00:00:00 2001 From: Jean-Michel Joary Date: Wed, 8 Oct 2025 18:07:42 +0200 Subject: [PATCH 2/4] Allow to change access token --- lib/src/directus_api.dart | 13 +++++-------- lib/src/directus_api_manager_base.dart | 13 ++----------- lib/src/idirectus_api_manager.dart | 3 +-- lib/test/mock_directus_api_manager.dart | 5 +++++ test/directus_api_manager_base_test.dart | 6 ++++++ test/directus_api_test.dart | 9 +++++++++ test/mock/mock_directus_api.dart | 7 +++---- 7 files changed, 31 insertions(+), 25 deletions(-) diff --git a/lib/src/directus_api.dart b/lib/src/directus_api.dart index ed43a7d..d561680 100644 --- a/lib/src/directus_api.dart +++ b/lib/src/directus_api.dart @@ -8,7 +8,9 @@ abstract class IDirectusAPI { bool get hasLoggedInUser; bool get shouldRefreshToken; String? get accessToken; + set accessToken(String? value); String? get currentAuthToken; + String? get refreshToken; set refreshToken(String? value); String get baseUrl; @@ -70,7 +72,7 @@ abstract class IDirectusAPI { PreparedRequest prepareLoginRequest(String username, String password, {String? oneTimePassword}); - PreparedRequest prepareLoginRequestWithProvider({required String provider}); + DirectusLoginResult parseLoginResponse(Response response); PreparedRequest prepareUserInviteRequest(String email, String roleId); @@ -115,6 +117,8 @@ class DirectusAPI implements IDirectusAPI { String get baseUrl => _baseURL; String? _accessToken; + @override + set accessToken(String? value) => _accessToken = value; String? _refreshToken; @override set refreshToken(String? value) => _refreshToken = value; @@ -634,13 +638,6 @@ class DirectusAPI implements IDirectusAPI { request.addJsonHeaders(); return PreparedRequest(request: request); } - - @override - PreparedRequest prepareLoginRequestWithProvider({required String provider}) { - final request = Request("GET", Uri.parse("$_baseURL/auth/login/$provider")); - - return PreparedRequest(request: request); - } } extension RequestJson on Request { diff --git a/lib/src/directus_api_manager_base.dart b/lib/src/directus_api_manager_base.dart index e0da288..8ce2af6 100644 --- a/lib/src/directus_api_manager_base.dart +++ b/lib/src/directus_api_manager_base.dart @@ -61,6 +61,8 @@ class DirectusApiManager implements IDirectusApiManager { bool get shouldRefreshToken => _api.shouldRefreshToken; @override String? get accessToken => _api.accessToken; + @override + set accessToken(String? value) => _api.accessToken = value; @override String? get refreshToken => _api.refreshToken; @@ -892,15 +894,4 @@ class DirectusApiManager implements IDirectusApiManager { startWebsocketSubscription(existingSubscription); } } - - @override - Future loginDirectusUserWithProvider( - {required String provider}) { - return _sendRequest( - prepareRequest: () => - _api.prepareLoginRequestWithProvider(provider: provider), - dependsOnToken: false, - canSaveResponseToCache: false, - parseResponse: (response) => _api.parseLoginResponse(response)); - } } diff --git a/lib/src/idirectus_api_manager.dart b/lib/src/idirectus_api_manager.dart index 79c1c16..5cf23b0 100644 --- a/lib/src/idirectus_api_manager.dart +++ b/lib/src/idirectus_api_manager.dart @@ -5,8 +5,6 @@ abstract class IDirectusApiManager { Future loginDirectusUser( String username, String password, {String? oneTimePassword}); - Future loginDirectusUserWithProvider( - {required String provider}); Future logoutDirectusUser(); Future registerDirectusUser( {required String email, @@ -88,6 +86,7 @@ abstract class IDirectusApiManager { required T Function(Response) jsonConverter}); bool get shouldRefreshToken; String? get accessToken; + set accessToken(String? value); String? get refreshToken; Future tryAndRefreshToken(); String get webSocketBaseUrl; diff --git a/lib/test/mock_directus_api_manager.dart b/lib/test/mock_directus_api_manager.dart index f429453..69507b0 100644 --- a/lib/test/mock_directus_api_manager.dart +++ b/lib/test/mock_directus_api_manager.dart @@ -284,4 +284,9 @@ class MockDirectusApiManager extends IDirectusApiManager with MockMixin { arguments: {"provider": provider}); return Future.value(popNextReturnedObject()); } + + @override + set accessToken(String? value) { + addCall(named: "set accessToken", arguments: {"value": value}); + } } diff --git a/test/directus_api_manager_base_test.dart b/test/directus_api_manager_base_test.dart index 1e6d3a8..18533ce 100644 --- a/test/directus_api_manager_base_test.dart +++ b/test/directus_api_manager_base_test.dart @@ -28,6 +28,12 @@ void main() { ); }); + test("Set access token", () { + sut.accessToken = "NEW.ACCESS.TOKEN"; + expect(mockDirectusApi.calledFunctions, contains("set accessToken")); + expect(mockDirectusApi.receivedObjects["value"], "NEW.ACCESS.TOKEN"); + }); + test('Empty manager does not have a logged in user', () async { final mockClient = MockHTTPClient(); final sut = diff --git a/test/directus_api_test.dart b/test/directus_api_test.dart index 529d8b9..be92b71 100644 --- a/test/directus_api_test.dart +++ b/test/directus_api_test.dart @@ -32,6 +32,15 @@ void main() { }); }); + group("DirectusAPI Setter", () { + test("Set access token", () { + final sut = DirectusAPI("http://api.com"); + expect(sut.accessToken, isNull); + sut.accessToken = "NEW.ACCESS.TOKEN"; + expect(sut.accessToken, "NEW.ACCESS.TOKEN"); + }); + }); + group("DirectusAPI Data Management", () { test('Get list of items request', () { final sut = makeAuthenticatedDirectusAPI(); diff --git a/test/mock/mock_directus_api.dart b/test/mock/mock_directus_api.dart index 8ec288d..e9fd795 100644 --- a/test/mock/mock_directus_api.dart +++ b/test/mock/mock_directus_api.dart @@ -333,9 +333,8 @@ class MockDirectusApi with MockMixin implements IDirectusAPI { } @override - PreparedRequest prepareLoginRequestWithProvider({required String provider}) { - addCalledFunction(named: "prepareLoginRequestWithProvider"); - addReceivedObject(provider, name: "provider"); - return nextReturnedRequest; + set accessToken(String? value) { + addCalledFunction(named: "set accessToken"); + addReceivedObject(value, name: "value"); } } From 7b60f34be0a2b0b6e289043e04a462ab5d71b433 Mon Sep 17 00:00:00 2001 From: Jean-Michel Joary Date: Thu, 9 Oct 2025 10:16:59 +0200 Subject: [PATCH 3/4] Avoid refreshToken check --- lib/src/directus_api_manager_base.dart | 27 ++++++++++++-------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/lib/src/directus_api_manager_base.dart b/lib/src/directus_api_manager_base.dart index 8ce2af6..056c65a 100644 --- a/lib/src/directus_api_manager_base.dart +++ b/lib/src/directus_api_manager_base.dart @@ -259,21 +259,18 @@ class DirectusApiManager implements IDirectusApiManager { _currentUserLock = completer.future; try { - if (cachedCurrentUser == null && await hasLoggedInUser()) { - cachedCurrentUser = await _sendRequest( - requestIdentifier: _currentUserRequestIdentifier, - canSaveResponseToCache: canSaveResponseToCache, - canUseCacheForResponse: canUseCacheForResponse, - canUseOldCachedResponseAsFallback: - canUseOldCachedResponseAsFallback, - maxCacheAge: maxCacheAge, - prepareRequest: () => - _api.prepareGetCurrentUserRequest(fields: fields), - parseResponse: (response) { - final parsedJson = _api.parseGetSpecificItemResponse(response); - return DirectusUser(parsedJson); - }); - } + cachedCurrentUser ??= await _sendRequest( + requestIdentifier: _currentUserRequestIdentifier, + canSaveResponseToCache: canSaveResponseToCache, + canUseCacheForResponse: canUseCacheForResponse, + canUseOldCachedResponseAsFallback: canUseOldCachedResponseAsFallback, + maxCacheAge: maxCacheAge, + prepareRequest: () => + _api.prepareGetCurrentUserRequest(fields: fields), + parseResponse: (response) { + final parsedJson = _api.parseGetSpecificItemResponse(response); + return DirectusUser(parsedJson); + }); } catch (error) { print(error); } From 4ac1ccaecbb0fbd0f50dcd685f6c75b01f0e51f9 Mon Sep 17 00:00:00 2001 From: JM Admin Date: Fri, 21 Nov 2025 11:56:09 +0100 Subject: [PATCH 4/4] Donwgrade test dependencies I add to add reflectable_builder in dev dependencies in order to be able to generate *.reflectable.dart files. This brings a error when I got the dependancies. test>= 1.27.0 depends on analyzer >=8.0.0 <10.0.0 reflectable_builder depends on analyzer ^7.7.0 --- build.yaml | 10 ++++++++++ pubspec.yaml | 16 ++++------------ 2 files changed, 14 insertions(+), 12 deletions(-) create mode 100644 build.yaml diff --git a/build.yaml b/build.yaml new file mode 100644 index 0000000..8f44bc7 --- /dev/null +++ b/build.yaml @@ -0,0 +1,10 @@ +targets: + $default: + builders: + reflectable_builder: + generate_for: + - example/**.dart + - test/**.dart + - lib/**.dart + options: + formatted: true diff --git a/pubspec.yaml b/pubspec.yaml index 571efad..2de5edc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: directus_api_manager description: Communicate with a Directus server using its REST API. -version: 1.14.2 +version: 1.14.3 repository: https://github.com/maxbritto/directus_api_manager environment: @@ -9,22 +9,14 @@ environment: dependencies: http: ">=0.13.4 <2.0.0" http_parser: ^4.0.2 - reflectable: ">=4.0.1 <6.0.0" + reflectable: ">=4.0.1 <6.0.0" web_socket_channel: ^3.0.3 extension_dart_tools: ^1.4.1 meta: "^1.15.0" mutex: ^3.1.0 dev_dependencies: + reflectable_builder: any build_runner: any lints: ^6.0.0 - test: ^1.27.0 - -targets: - $default: - builders: - reflectable: - generate_for: - - example/directus_api_manager_example.dart - options: - formatted: true + test: ^1.26.3