From 115cddb198a435e3f8d174bf84dc2d18af795953 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Tue, 20 Oct 2026 20:38:55 +1300 Subject: [PATCH 1/5] chore: update Flutter SDK to 28.1.0 --- CHANGELOG.md | 8 + README.md | 2 +- android/build.gradle | 2 +- docs/examples/account/create-push-target.md | 2 + docs/examples/account/list-memberships.md | 15 ++ docs/examples/account/update-push-target.md | 2 + docs/examples/analytics/create-event.md | 2 +- docs/examples/avatars/update-photo.md | 1 - docs/examples/databases/create-document.md | 2 - docs/examples/databases/create-query.md | 19 +++ docs/examples/databases/update-document.md | 2 - docs/examples/databases/upsert-document.md | 2 - docs/examples/documentsdb/create-document.md | 2 - docs/examples/documentsdb/create-query.md | 19 +++ docs/examples/documentsdb/update-document.md | 2 - docs/examples/documentsdb/upsert-document.md | 2 - docs/examples/graphql/mutation.md | 3 +- docs/examples/graphql/query.md | 3 +- docs/examples/oauth2/logout-post.md | 2 +- docs/examples/oauth2/logout.md | 2 +- docs/examples/oauth2/revoke.md | 2 +- docs/examples/presences/update.md | 2 - docs/examples/presences/upsert.md | 2 - docs/examples/storage/create-file.md | 3 - docs/examples/storage/update-file.md | 2 - docs/examples/tablesdb/create-query.md | 19 +++ docs/examples/tablesdb/create-row.md | 2 - docs/examples/tablesdb/update-row.md | 2 - docs/examples/tablesdb/upsert-row.md | 2 - docs/examples/vectorsdb/create-document.md | 2 - docs/examples/vectorsdb/update-document.md | 2 - docs/examples/vectorsdb/upsert-document.md | 2 - lib/query.dart | 14 +- lib/services/account.dart | 51 ++++++ lib/services/databases.dart | 69 ++++++++ lib/services/documents_db.dart | 58 +++++++ lib/services/tables_db.dart | 64 +++++++ lib/src/client_browser.dart | 2 +- lib/src/client_io.dart | 171 +++++++++++++------ pubspec.yaml | 2 +- test/query_test.dart | 17 ++ test/services/account_test.dart | 14 ++ test/services/databases_test.dart | 17 ++ test/services/documents_db_test.dart | 17 ++ test/services/tables_db_test.dart | 17 ++ test/src/client_io_test.dart | 157 +++++++++++++++++ 46 files changed, 698 insertions(+), 108 deletions(-) create mode 100644 docs/examples/account/list-memberships.md create mode 100644 docs/examples/databases/create-query.md create mode 100644 docs/examples/documentsdb/create-query.md create mode 100644 docs/examples/tablesdb/create-query.md create mode 100644 test/src/client_io_test.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index f247af67..7ee8ed70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 28.1.0 + +* Added: `createQuery` on `databases`, `documentsDB` and `tablesDB` to send list queries in the request body +* Added: `account.listMemberships` +* Added: `bundleId` and `environment` on `account.createPushTarget` and `account.updatePushTarget` for APNs routing +* Fixed: OAuth2 sign-in on Windows and Linux returns through a loopback callback and creates the session +* Fixed: saving the OAuth2 session waits for client initialisation already in progress + ## 28.0.0 * Breaking: requests send `X-Appwrite-Response-Format: 2.5.0`; responses follow the 2.5 shapes diff --git a/README.md b/README.md index 99066c04..0cca741c 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Or add it to your app's `pubspec.yaml` file and run `flutter pub get`: ```yaml dependencies: - appwrite: ^28.0.0 + appwrite: ^28.1.0 ``` ### Android requirements diff --git a/android/build.gradle b/android/build.gradle index 2be87ea4..5d77d97e 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,7 +1,7 @@ // The native half of Push on Android: background delivery that survives the process being // killed, a reboot and an app update, shared with the Appwrite Android SDK. group = "io.appwrite.flutter" -version = "28.0.0" +version = "28.1.0" buildscript { ext.kotlin_version = "2.1.0" diff --git a/docs/examples/account/create-push-target.md b/docs/examples/account/create-push-target.md index 250cd4db..a8368084 100644 --- a/docs/examples/account/create-push-target.md +++ b/docs/examples/account/create-push-target.md @@ -12,5 +12,7 @@ models.Target result = await account.createPushTarget( targetId: '', identifier: '', providerId: '', // optional + bundleId: '', // optional + environment: 'sandbox', // optional ); ``` diff --git a/docs/examples/account/list-memberships.md b/docs/examples/account/list-memberships.md new file mode 100644 index 00000000..92a436f8 --- /dev/null +++ b/docs/examples/account/list-memberships.md @@ -0,0 +1,15 @@ +```dart +import 'package:appwrite/appwrite.dart'; +import 'package:appwrite/models.dart' as models; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Account account = Account(client); + +models.MembershipList result = await account.listMemberships( + queries: [], // optional + total: false, // optional +); +``` diff --git a/docs/examples/account/update-push-target.md b/docs/examples/account/update-push-target.md index 49429983..d7466119 100644 --- a/docs/examples/account/update-push-target.md +++ b/docs/examples/account/update-push-target.md @@ -11,5 +11,7 @@ Account account = Account(client); models.Target result = await account.updatePushTarget( targetId: '', identifier: '', + bundleId: '', // optional + environment: 'sandbox', // optional ); ``` diff --git a/docs/examples/analytics/create-event.md b/docs/examples/analytics/create-event.md index d88e257b..af3b50f5 100644 --- a/docs/examples/analytics/create-event.md +++ b/docs/examples/analytics/create-event.md @@ -7,7 +7,7 @@ Client client = Client() Analytics analytics = Analytics(client); -models. result = await analytics.createEvent( +await analytics.createEvent( propertyId: '', name: '', url: 'https://example.com', diff --git a/docs/examples/avatars/update-photo.md b/docs/examples/avatars/update-photo.md index e667a94a..f980ade9 100644 --- a/docs/examples/avatars/update-photo.md +++ b/docs/examples/avatars/update-photo.md @@ -1,5 +1,4 @@ ```dart -import 'dart:io'; import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; diff --git a/docs/examples/databases/create-document.md b/docs/examples/databases/create-document.md index ade4f576..fe143b0e 100644 --- a/docs/examples/databases/create-document.md +++ b/docs/examples/databases/create-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/databases/create-query.md b/docs/examples/databases/create-query.md new file mode 100644 index 00000000..4411715c --- /dev/null +++ b/docs/examples/databases/create-query.md @@ -0,0 +1,19 @@ +```dart +import 'package:appwrite/appwrite.dart'; +import 'package:appwrite/models.dart' as models; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Databases databases = Databases(client); + +models.DocumentList result = await databases.createQuery( + databaseId: '', + collectionId: '', + queries: [], // optional + transactionId: '', // optional + total: false, // optional + ttl: 0, // optional +); +``` diff --git a/docs/examples/databases/update-document.md b/docs/examples/databases/update-document.md index cf6d599c..e62a15e7 100644 --- a/docs/examples/databases/update-document.md +++ b/docs/examples/databases/update-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/databases/upsert-document.md b/docs/examples/databases/upsert-document.md index 1cd30f25..fe658e8f 100644 --- a/docs/examples/databases/upsert-document.md +++ b/docs/examples/databases/upsert-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/documentsdb/create-document.md b/docs/examples/documentsdb/create-document.md index 5ed989ad..9bbe1838 100644 --- a/docs/examples/documentsdb/create-document.md +++ b/docs/examples/documentsdb/create-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/documentsdb/create-query.md b/docs/examples/documentsdb/create-query.md new file mode 100644 index 00000000..ef70c189 --- /dev/null +++ b/docs/examples/documentsdb/create-query.md @@ -0,0 +1,19 @@ +```dart +import 'package:appwrite/appwrite.dart'; +import 'package:appwrite/models.dart' as models; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +DocumentsDB documentsDB = DocumentsDB(client); + +models.DocumentList result = await documentsDB.createQuery( + databaseId: '', + collectionId: '', + queries: [], // optional + transactionId: '', // optional + total: false, // optional + ttl: 0, // optional +); +``` diff --git a/docs/examples/documentsdb/update-document.md b/docs/examples/documentsdb/update-document.md index ec752959..3b85281e 100644 --- a/docs/examples/documentsdb/update-document.md +++ b/docs/examples/documentsdb/update-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/documentsdb/upsert-document.md b/docs/examples/documentsdb/upsert-document.md index 61baa69d..fed1ac5a 100644 --- a/docs/examples/documentsdb/upsert-document.md +++ b/docs/examples/documentsdb/upsert-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/graphql/mutation.md b/docs/examples/graphql/mutation.md index e9632b86..e84cad35 100644 --- a/docs/examples/graphql/mutation.md +++ b/docs/examples/graphql/mutation.md @@ -1,6 +1,5 @@ ```dart import 'package:appwrite/appwrite.dart'; -import 'package:appwrite/models.dart' as models; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint @@ -8,7 +7,7 @@ Client client = Client() Graphql graphql = Graphql(client); -models.Any result = await graphql.mutation( +dynamic result = await graphql.mutation( query: { "query": "mutation { accountUpdateName(name: \"Walter\") { name } }" }, diff --git a/docs/examples/graphql/query.md b/docs/examples/graphql/query.md index de938d4a..10a16be0 100644 --- a/docs/examples/graphql/query.md +++ b/docs/examples/graphql/query.md @@ -1,6 +1,5 @@ ```dart import 'package:appwrite/appwrite.dart'; -import 'package:appwrite/models.dart' as models; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint @@ -8,7 +7,7 @@ Client client = Client() Graphql graphql = Graphql(client); -models.Any result = await graphql.query( +dynamic result = await graphql.query( query: { "query": "query { localeGet { ip } }" }, diff --git a/docs/examples/oauth2/logout-post.md b/docs/examples/oauth2/logout-post.md index 3d163784..dc077108 100644 --- a/docs/examples/oauth2/logout-post.md +++ b/docs/examples/oauth2/logout-post.md @@ -7,7 +7,7 @@ Client client = Client() Oauth2 oauth2 = Oauth2(client); -models. result = await oauth2.logoutPost( +await oauth2.logoutPost( idTokenHint: '', // optional logoutHint: '', // optional clientId: '', // optional diff --git a/docs/examples/oauth2/logout.md b/docs/examples/oauth2/logout.md index 3892325e..640642d6 100644 --- a/docs/examples/oauth2/logout.md +++ b/docs/examples/oauth2/logout.md @@ -7,7 +7,7 @@ Client client = Client() Oauth2 oauth2 = Oauth2(client); -models. result = await oauth2.logout( +await oauth2.logout( idTokenHint: '', // optional logoutHint: '', // optional clientId: '', // optional diff --git a/docs/examples/oauth2/revoke.md b/docs/examples/oauth2/revoke.md index 777340f7..a34d5421 100644 --- a/docs/examples/oauth2/revoke.md +++ b/docs/examples/oauth2/revoke.md @@ -7,7 +7,7 @@ Client client = Client() Oauth2 oauth2 = Oauth2(client); -models. result = await oauth2.revoke( +await oauth2.revoke( token: '', tokenTypeHint: 'access_token', // optional clientId: '', // optional diff --git a/docs/examples/presences/update.md b/docs/examples/presences/update.md index ed52a7b0..0fabdf5a 100644 --- a/docs/examples/presences/update.md +++ b/docs/examples/presences/update.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/presences/upsert.md b/docs/examples/presences/upsert.md index 1620ff55..0d17fb12 100644 --- a/docs/examples/presences/upsert.md +++ b/docs/examples/presences/upsert.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/storage/create-file.md b/docs/examples/storage/create-file.md index f7267340..fa7bc9c7 100644 --- a/docs/examples/storage/create-file.md +++ b/docs/examples/storage/create-file.md @@ -1,9 +1,6 @@ ```dart -import 'dart:io'; import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/storage/update-file.md b/docs/examples/storage/update-file.md index fe33f0bf..6ddd4920 100644 --- a/docs/examples/storage/update-file.md +++ b/docs/examples/storage/update-file.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/tablesdb/create-query.md b/docs/examples/tablesdb/create-query.md new file mode 100644 index 00000000..1878b678 --- /dev/null +++ b/docs/examples/tablesdb/create-query.md @@ -0,0 +1,19 @@ +```dart +import 'package:appwrite/appwrite.dart'; +import 'package:appwrite/models.dart' as models; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +TablesDB tablesDB = TablesDB(client); + +models.RowList result = await tablesDB.createQuery( + databaseId: '', + tableId: '', + queries: [], // optional + transactionId: '', // optional + total: false, // optional + ttl: 0, // optional +); +``` diff --git a/docs/examples/tablesdb/create-row.md b/docs/examples/tablesdb/create-row.md index e3b639c7..ff1969bb 100644 --- a/docs/examples/tablesdb/create-row.md +++ b/docs/examples/tablesdb/create-row.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/tablesdb/update-row.md b/docs/examples/tablesdb/update-row.md index 1d42d637..9440e37c 100644 --- a/docs/examples/tablesdb/update-row.md +++ b/docs/examples/tablesdb/update-row.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/tablesdb/upsert-row.md b/docs/examples/tablesdb/upsert-row.md index a9df95fb..e590764a 100644 --- a/docs/examples/tablesdb/upsert-row.md +++ b/docs/examples/tablesdb/upsert-row.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/vectorsdb/create-document.md b/docs/examples/vectorsdb/create-document.md index ecc02176..4a4ce765 100644 --- a/docs/examples/vectorsdb/create-document.md +++ b/docs/examples/vectorsdb/create-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/vectorsdb/update-document.md b/docs/examples/vectorsdb/update-document.md index 0457e855..27e37e8d 100644 --- a/docs/examples/vectorsdb/update-document.md +++ b/docs/examples/vectorsdb/update-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/vectorsdb/upsert-document.md b/docs/examples/vectorsdb/upsert-document.md index de7503fb..e5c7c189 100644 --- a/docs/examples/vectorsdb/upsert-document.md +++ b/docs/examples/vectorsdb/upsert-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/lib/query.dart b/lib/query.dart index 33541de0..38e158c0 100644 --- a/lib/query.dart +++ b/lib/query.dart @@ -353,7 +353,7 @@ class Query { static String max(String attribute, [String alias = '']) => Query._('max', attribute, alias.isNotEmpty ? alias : null).toString(); - /// Standard deviation of [attribute], optionally aliased. + /// Population standard deviation of [attribute] (the same as stddevPop), optionally aliased. static String stddev(String attribute, [String alias = '']) => Query._('stddev', attribute, alias.isNotEmpty ? alias : null).toString(); @@ -367,7 +367,7 @@ class Query { Query._('stddevSamp', attribute, alias.isNotEmpty ? alias : null) .toString(); - /// Variance of [attribute], optionally aliased. + /// Population variance of [attribute] (the same as varPop), optionally aliased. static String variance(String attribute, [String alias = '']) => Query._('variance', attribute, alias.isNotEmpty ? alias : null) .toString(); @@ -410,7 +410,7 @@ class Query { static String on(String left, String right, [String operator = '=']) => Query._('on', null, [left, operator, right]).toString(); - /// Inner join. [table] is the joined collection/table ID. + /// Inner join. [table] is the joined collection/table ID; without an alias the server names the join after it, if the ID is a valid alias, and otherwise rejects the query. static String join( String table, Object leftOrAliasOrOn, [ @@ -420,7 +420,7 @@ class Query { ]) => Query._createJoin('join', table, leftOrAliasOrOn, rightOrOn, operator, alias); - /// Left join. [table] is the joined collection/table ID. + /// Left join. [table] is the joined collection/table ID; without an alias the server names the join after it, if the ID is a valid alias, and otherwise rejects the query. static String leftJoin( String table, Object leftOrAliasOrOn, [ @@ -430,7 +430,7 @@ class Query { ]) => Query._createJoin('leftJoin', table, leftOrAliasOrOn, rightOrOn, operator, alias); - /// Right join. [table] is the joined collection/table ID. + /// Right join. [table] is the joined collection/table ID; without an alias the server names the join after it, if the ID is a valid alias, and otherwise rejects the query. static String rightJoin( String table, Object leftOrAliasOrOn, [ @@ -440,7 +440,7 @@ class Query { ]) => Query._createJoin('rightJoin', table, leftOrAliasOrOn, rightOrOn, operator, alias); - /// Full outer join. [table] is the joined collection/table ID. + /// Full outer join. [table] is the joined collection/table ID; without an alias the server names the join after it, if the ID is a valid alias, and otherwise rejects the query. static String fullOuterJoin( String table, Object leftOrAliasOrOn, [ @@ -450,7 +450,7 @@ class Query { ]) => Query._createJoin('fullOuterJoin', table, leftOrAliasOrOn, rightOrOn, operator, alias); - /// Cross join. [table] is the joined collection/table ID. + /// Cross join. [table] is the joined collection/table ID; without an alias the server names the join after it, if the ID is a valid alias, and otherwise rejects the query. static String crossJoin(String table, [String alias = '']) => Query._('crossJoin', table, alias.isNotEmpty ? alias : null).toString(); diff --git a/lib/services/account.dart b/lib/services/account.dart index d805b833..3e6de0d8 100644 --- a/lib/services/account.dart +++ b/lib/services/account.dart @@ -415,6 +415,33 @@ class Account extends Service { return models.Jwt.fromMap(res.data); } + /// Get the team memberships of the currently logged in user. + Future listMemberships({ + List? queries, + bool? total, + }) async { + final String apiPath = '/account/memberships'; + + final Map apiParams = { + if (queries != null) 'queries': queries, + if (total != null) 'total': total, + }; + + final Map apiHeaders = { + 'X-Appwrite-Project': client.config['project'] ?? '', + 'accept': 'application/json', + }; + + final res = await client.call( + HttpMethod.get, + path: apiPath, + params: apiParams, + headers: apiHeaders, + ); + + return models.MembershipList.fromMap(res.data); + } + /// Enable or disable MFA on an account. Future updateMFA({ required bool mfa, @@ -1348,6 +1375,14 @@ class Account extends Service { /// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) /// the only valid redirect URLs are the ones from domains you have set when /// adding your platforms in the console interface. + /// + /// The new password must satisfy the project's enabled password policies, + /// including custom deny lists. Dictionary entries match the entire password + /// case-sensitively; personal-data terms match substrings case-insensitively. + /// Personal-data validation runs after token verification against the + /// recovered user's ID, name, email, and phone, closing the previous recovery + /// gap for profile-based checks. A rejected password leaves the existing + /// credentials unchanged and the recovery token usable. Future updateRecovery({ required String userId, required String secret, @@ -1423,6 +1458,14 @@ class Account extends Service { /// Pass the **userId** of the user along with the **secret** code from the /// email and the new **password** to set. If confirmed, this route will return /// a 200 status code, the code is consumed and the user's password is updated. + /// + /// The new password must satisfy the project's enabled password policies, + /// including custom deny lists. Dictionary entries match the entire password + /// case-sensitively; personal-data terms match substrings case-insensitively. + /// Personal-data validation runs after token verification against the + /// recovered user's ID, name, email, and phone, closing the previous recovery + /// gap for profile-based checks. A rejected password leaves the existing + /// credentials unchanged and the recovery token usable. Future updateRecoveryOTP({ required String userId, required String secret, @@ -1946,6 +1989,8 @@ class Account extends Service { required String targetId, required String identifier, String? providerId, + String? bundleId, + String? environment, }) async { final String apiPath = '/account/targets/push'; @@ -1953,6 +1998,8 @@ class Account extends Service { 'targetId': targetId, 'identifier': identifier, if (providerId != null) 'providerId': providerId, + if (bundleId != null) 'bundleId': bundleId, + if (environment != null) 'environment': environment, }; final Map apiHeaders = { @@ -1979,6 +2026,8 @@ class Account extends Service { Future updatePushTarget({ required String targetId, required String identifier, + String? bundleId, + String? environment, }) async { if (targetId.isEmpty) { throw AppwriteException( @@ -1993,6 +2042,8 @@ class Account extends Service { final Map apiParams = { 'identifier': identifier, + if (bundleId != null) 'bundleId': bundleId, + if (environment != null) 'environment': environment, }; final Map apiHeaders = { diff --git a/lib/services/databases.dart b/lib/services/databases.dart index 96fed789..3d893ec8 100644 --- a/lib/services/databases.dart +++ b/lib/services/databases.dart @@ -219,6 +219,14 @@ class Databases extends Service { /// Get a list of all the user's documents in a given collection. You can use /// the query params to filter your results. + /// + /// Documents returned by aggregate, groupBy or distinct queries hold only the + /// attributes they select, group or aggregate, typed as a document types them, + /// with a joined attribute named by its join alias (`alias.attribute`). They + /// have no `$id`, `$sequence`, `$createdAt`, `$updatedAt`, `$permissions`, + /// `$databaseId` or `$collectionId` unless they select or group it, and + /// neither does a right or full join document that no document of this + /// collection matched. @Deprecated( 'This API has been deprecated since 1.8.0. Please use `TablesDB.listRows` instead.', ) @@ -336,6 +344,67 @@ class Databases extends Service { return models.Document.fromMap(res.data); } + /// Get a list of all the user's documents in a given collection using a POST + /// request. This behaves identically to the list documents endpoint but + /// accepts the queries in the request body, allowing much larger `queries` + /// arrays than can fit in a URL query string. + @Deprecated( + 'This API has been deprecated since 1.8.0. Please use `TablesDB.createQuery` instead.', + ) + Future createQuery({ + required String databaseId, + required String collectionId, + List? queries, + String? transactionId, + bool? total, + int? ttl, + }) async { + if (databaseId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "databaseId"', + ); + } + + if (collectionId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "collectionId"', + ); + } + + final String apiPath = + '/databases/{databaseId}/collections/{collectionId}/documents/query' + .replaceAll( + '{databaseId}', + databaseId, + ) + .replaceAll( + '{collectionId}', + collectionId, + ); + + final Map apiParams = { + if (queries != null) 'queries': queries, + if (transactionId != null) 'transactionId': transactionId, + if (total != null) 'total': total, + if (ttl != null) 'ttl': ttl, + }; + + final Map apiHeaders = { + 'X-Appwrite-Project': client.config['project'] ?? '', + 'content-type': 'application/json', + 'accept': 'application/json', + }; + + final res = await client.call( + HttpMethod.post, + path: apiPath, + params: apiParams, + headers: apiHeaders, + ); + + return models.DocumentList.fromMap(res.data); + } + /// Get a document by its unique ID. This endpoint response returns a JSON /// object with the document data. @Deprecated( diff --git a/lib/services/documents_db.dart b/lib/services/documents_db.dart index 1d04aa9c..93ef8712 100644 --- a/lib/services/documents_db.dart +++ b/lib/services/documents_db.dart @@ -367,6 +367,64 @@ class DocumentsDB extends Service { return models.DocumentList.fromMap(res.data); } + /// Get a list of all the user's documents in a given collection using a POST + /// request. This behaves identically to the list documents endpoint but + /// accepts the queries in the request body, allowing much larger `queries` + /// arrays than can fit in a URL query string. + Future createQuery({ + required String databaseId, + required String collectionId, + List? queries, + String? transactionId, + bool? total, + int? ttl, + }) async { + if (databaseId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "databaseId"', + ); + } + + if (collectionId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "collectionId"', + ); + } + + final String apiPath = + '/documentsdb/{databaseId}/collections/{collectionId}/documents/query' + .replaceAll( + '{databaseId}', + databaseId, + ) + .replaceAll( + '{collectionId}', + collectionId, + ); + + final Map apiParams = { + if (queries != null) 'queries': queries, + if (transactionId != null) 'transactionId': transactionId, + if (total != null) 'total': total, + if (ttl != null) 'ttl': ttl, + }; + + final Map apiHeaders = { + 'X-Appwrite-Project': client.config['project'] ?? '', + 'content-type': 'application/json', + 'accept': 'application/json', + }; + + final res = await client.call( + HttpMethod.post, + path: apiPath, + params: apiParams, + headers: apiHeaders, + ); + + return models.DocumentList.fromMap(res.data); + } + /// Get a document by its unique ID. This endpoint response returns a JSON /// object with the document data. Future getDocument({ diff --git a/lib/services/tables_db.dart b/lib/services/tables_db.dart index e7a5d4a3..b896f6b4 100644 --- a/lib/services/tables_db.dart +++ b/lib/services/tables_db.dart @@ -201,6 +201,13 @@ class TablesDB extends Service { /// Get a list of all the user's rows in a given table. You can use the query /// params to filter your results. + /// + /// Rows returned by aggregate, groupBy or distinct queries hold only the + /// columns they select, group or aggregate, typed as a row types them, with a + /// joined column named by its join alias (`alias.column`). They have no `$id`, + /// `$sequence`, `$createdAt`, `$updatedAt`, `$permissions`, `$databaseId` or + /// `$tableId` unless they select or group it, and neither does a right or full + /// join row that no row of this table matched. Future listRows({ required String databaseId, required String tableId, @@ -310,6 +317,63 @@ class TablesDB extends Service { return models.Row.fromMap(res.data); } + /// Get a list of all the user's rows in a given table using a POST request. + /// This behaves identically to the list rows endpoint but accepts the queries + /// in the request body, allowing much larger `queries` arrays than can fit in + /// a URL query string. + Future createQuery({ + required String databaseId, + required String tableId, + List? queries, + String? transactionId, + bool? total, + int? ttl, + }) async { + if (databaseId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "databaseId"', + ); + } + + if (tableId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "tableId"', + ); + } + + final String apiPath = '/tablesdb/{databaseId}/tables/{tableId}/rows/query' + .replaceAll( + '{databaseId}', + databaseId, + ) + .replaceAll( + '{tableId}', + tableId, + ); + + final Map apiParams = { + if (queries != null) 'queries': queries, + if (transactionId != null) 'transactionId': transactionId, + if (total != null) 'total': total, + if (ttl != null) 'ttl': ttl, + }; + + final Map apiHeaders = { + 'X-Appwrite-Project': client.config['project'] ?? '', + 'content-type': 'application/json', + 'accept': 'application/json', + }; + + final res = await client.call( + HttpMethod.post, + path: apiPath, + params: apiParams, + headers: apiHeaders, + ); + + return models.RowList.fromMap(res.data); + } + /// Get a row by its unique ID. This endpoint response returns a JSON object /// with the row data. Future getRow({ diff --git a/lib/src/client_browser.dart b/lib/src/client_browser.dart index 7488458c..ab689f04 100644 --- a/lib/src/client_browser.dart +++ b/lib/src/client_browser.dart @@ -40,7 +40,7 @@ class ClientBrowser extends ClientBase with ClientMixin { 'x-sdk-name': 'Flutter', 'x-sdk-platform': 'client', 'x-sdk-language': 'flutter', - 'x-sdk-version': '28.0.0', + 'x-sdk-version': '28.1.0', 'X-Appwrite-Response-Format': '2.5.0', }; diff --git a/lib/src/client_io.dart b/lib/src/client_io.dart index af5ed1f3..e348030a 100644 --- a/lib/src/client_io.dart +++ b/lib/src/client_io.dart @@ -59,7 +59,7 @@ class ClientIO extends ClientBase with ClientMixin { 'x-sdk-name': 'Flutter', 'x-sdk-platform': 'client', 'x-sdk-language': 'flutter', - 'x-sdk-version': '28.0.0', + 'x-sdk-version': '28.1.0', 'X-Appwrite-Response-Format': '2.5.0', }; @@ -261,6 +261,15 @@ class ClientIO extends ClientBase with ClientMixin { _initProgress = false; } + Future _ready() async { + while (!_initialized && _initProgress) { + await Future.delayed(Duration(milliseconds: 10)); + } + if (!_initialized) { + await init(); + } + } + Future _interceptRequest(http.BaseRequest request) async { final body = (request is http.Request) ? request.body : ''; for (final i in _interceptors) { @@ -499,59 +508,116 @@ class ClientIO extends ClientBase with ClientMixin { return finalResponse ?? lastResponse; } - bool get _customSchemeAllowed => Platform.isWindows || Platform.isLinux; + bool get _loopbackCallback => + defaultTargetPlatform == TargetPlatform.windows || + defaultTargetPlatform == TargetPlatform.linux; @override - Future webAuth(Uri url, {String? callbackUrlScheme}) { - return FlutterWebAuth2.authenticate( - url: url.toString(), - callbackUrlScheme: callbackUrlScheme != null && _customSchemeAllowed - ? callbackUrlScheme - : "appwrite-callback-${config['project']!}", - options: const FlutterWebAuth2Options( - useWebview: false, + Future webAuth(Uri url, {String? callbackUrlScheme}) async { + if (!_loopbackCallback) { + return _saveSession( + await _authenticate( + url, + "appwrite-callback-${config['project']!}", + ), + ); + } + + final callback = callbackUrlScheme ?? await _loopbackUrl(); + final exchange = url.path.contains(_sessionOAuth2Path); + final result = await _authenticate( + url.replace( + path: exchange + ? url.path.replaceFirst(_sessionOAuth2Path, _tokenOAuth2Path) + : url.path, + queryParameters: { + ...url.queryParametersAll, + 'success': [callback], + 'failure': url.queryParametersAll['failure'] ?? [callback], + }, ), - ).then((value) async { - Uri url = Uri.parse(value); - final key = url.queryParameters['key']; - final secret = url.queryParameters['secret']; - if (key == null || secret == null) { - final error = url.queryParameters['error']; - if (error != null && error.isNotEmpty) { - try { - final parsed = jsonDecode(error); - if (parsed is Map) { - final codeValue = parsed['code']; - final int? code = codeValue is int - ? codeValue - : int.tryParse('${codeValue ?? ''}'); - throw AppwriteException( - parsed['message']?.toString() ?? error, - code, - parsed['type']?.toString(), - error, - ); - } - } on AppwriteException { - rethrow; - } catch (_) { - // Fall through to a plain-string error when JSON is malformed. - } - throw AppwriteException(error); + callback, + ); + if (!exchange) { + return _saveSession(result); + } + + final userId = result.queryParameters['userId']; + final secret = result.queryParameters['secret']; + if (userId == null || secret == null) { + _throwCallbackError(result); + } + await call( + HttpMethod.post, + path: _tokenSessionPath, + params: {'userId': userId, 'secret': secret}, + ); + } + + static const String _sessionOAuth2Path = '/account/sessions/oauth2/'; + static const String _tokenOAuth2Path = '/account/tokens/oauth2/'; + static const String _tokenSessionPath = '/account/sessions/token'; + + Future _loopbackUrl() async { + final socket = await ServerSocket.bind(InternetAddress.loopbackIPv4, 0); + final port = socket.port; + await socket.close(); + return 'http://localhost:$port/'; + } + + Future _authenticate(Uri url, String callbackUrlScheme) async { + return Uri.parse( + await FlutterWebAuth2.authenticate( + url: url.toString(), + callbackUrlScheme: callbackUrlScheme, + options: const FlutterWebAuth2Options(useWebview: false), + ), + ); + } + + Future _saveSession(Uri url) async { + final key = url.queryParameters['key']; + final secret = url.queryParameters['secret']; + if (key == null || secret == null) { + _throwCallbackError(url); + } + Cookie cookie = Cookie(key, secret); + cookie.domain = Uri.parse(_endPoint).host; + cookie.httpOnly = true; + cookie.path = '/'; + List cookies = [cookie]; + await _ready(); + await _cookieJar.saveFromResponse(Uri.parse(_endPoint), cookies); + } + + Never _throwCallbackError(Uri url) { + final error = url.queryParameters['error']; + if (error != null && error.isNotEmpty) { + try { + final parsed = jsonDecode(error); + if (parsed is Map) { + final codeValue = parsed['code']; + final int? code = codeValue is int + ? codeValue + : int.tryParse('${codeValue ?? ''}'); + throw AppwriteException( + parsed['message']?.toString() ?? error, + code, + parsed['type']?.toString(), + error, + ); } - throw AppwriteException( - "Invalid OAuth2 Response. Key and Secret not available.", - 500, - ); + } on AppwriteException { + rethrow; + } catch (_) { + // Fall through to a plain-string error when JSON is malformed. } - Cookie cookie = Cookie(key, secret); - cookie.domain = Uri.parse(_endPoint).host; - cookie.httpOnly = true; - cookie.path = '/'; - List cookies = [cookie]; - await init(); - _cookieJar.saveFromResponse(Uri.parse(_endPoint), cookies); - }); + throw AppwriteException(error); + } + throw AppwriteException( + "Invalid OAuth2 Response. Key and Secret not available.", + 500, + ); } @override @@ -562,12 +628,7 @@ class ClientIO extends ClientBase with ClientMixin { Map params = const {}, ResponseType? responseType, }) async { - while (!_initialized && _initProgress) { - await Future.delayed(Duration(milliseconds: 10)); - } - if (!_initialized) { - await init(); - } + await _ready(); late http.Response res; http.BaseRequest request = prepareRequest( diff --git a/pubspec.yaml b/pubspec.yaml index 08a46375..2147f32e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: appwrite -version: 28.0.0 +version: 28.1.0 description: Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API homepage: https://appwrite.io repository: https://github.com/appwrite/sdk-for-flutter diff --git a/test/query_test.dart b/test/query_test.dart index fad7f352..6ab76a8c 100644 --- a/test/query_test.dart +++ b/test/query_test.dart @@ -511,6 +511,23 @@ void main() { expect(query['values'], ['ord']); }); + test('returns nested join without alias, leaving the alias to the server', + () { + final query = + jsonDecode(Query.join('orders', [Query.on('\$id', 'customerId')])); + expect(query['method'], 'join'); + expect(query['attribute'], 'orders'); + expect(query['values'].length, 1); + expect(query['values'][0]['method'], 'on'); + }); + + test('returns crossJoin without alias, leaving the alias to the server', () { + final query = jsonDecode(Query.crossJoin('orders')); + expect(query['method'], 'crossJoin'); + expect(query['attribute'], 'orders'); + expect(query['values'] ?? [], isEmpty); + }); + test('returns vectorDot', () { final query = jsonDecode(Query.vectorDot('embedding', [0.1, 0.2])); expect(query['method'], 'vectorDot'); diff --git a/test/services/account_test.dart b/test/services/account_test.dart index a904822d..0210868c 100644 --- a/test/services/account_test.dart +++ b/test/services/account_test.dart @@ -305,6 +305,20 @@ void main() { expect(response, isA()); }); + test('test method listMemberships()', () async { + final Map data = { + 'total': 5, + 'memberships': [], + }; + + when( + client.call(HttpMethod.get), + ).thenAnswer((_) async => Response(data: data)); + + final response = await account.listMemberships(); + expect(response, isA()); + }); + test('test method updateMFA()', () async { final Map data = { '\$id': "5e5ea5c16897e", diff --git a/test/services/databases_test.dart b/test/services/databases_test.dart index eb03954a..95eb1d7b 100644 --- a/test/services/databases_test.dart +++ b/test/services/databases_test.dart @@ -212,6 +212,23 @@ void main() { expect(response, isA()); }); + test('test method createQuery()', () async { + final Map data = { + 'total': 5, + 'documents': [], + }; + + when( + client.call(HttpMethod.post), + ).thenAnswer((_) async => Response(data: data)); + + final response = await databases.createQuery( + databaseId: "", + collectionId: "", + ); + expect(response, isA()); + }); + test('test method getDocument()', () async { final Map data = { '\$id': "5e5ea5c16897e", diff --git a/test/services/documents_db_test.dart b/test/services/documents_db_test.dart index 4312cced..10260b69 100644 --- a/test/services/documents_db_test.dart +++ b/test/services/documents_db_test.dart @@ -230,6 +230,23 @@ void main() { expect(response, isA()); }); + test('test method createQuery()', () async { + final Map data = { + 'total': 5, + 'documents': [], + }; + + when( + client.call(HttpMethod.post), + ).thenAnswer((_) async => Response(data: data)); + + final response = await documentsDB.createQuery( + databaseId: "", + collectionId: "", + ); + expect(response, isA()); + }); + test('test method getDocument()', () async { final Map data = { '\$id': "5e5ea5c16897e", diff --git a/test/services/tables_db_test.dart b/test/services/tables_db_test.dart index 90a55af7..72e85ab7 100644 --- a/test/services/tables_db_test.dart +++ b/test/services/tables_db_test.dart @@ -212,6 +212,23 @@ void main() { expect(response, isA()); }); + test('test method createQuery()', () async { + final Map data = { + 'total': 5, + 'rows': [], + }; + + when( + client.call(HttpMethod.post), + ).thenAnswer((_) async => Response(data: data)); + + final response = await tablesDB.createQuery( + databaseId: "", + tableId: "", + ); + expect(response, isA()); + }); + test('test method getRow()', () async { final Map data = { '\$id': "5e5ea5c16897e", diff --git a/test/src/client_io_test.dart b/test/src/client_io_test.dart new file mode 100644 index 00000000..c81a649e --- /dev/null +++ b/test/src/client_io_test.dart @@ -0,0 +1,157 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:appwrite/src/client_io.dart'; +import 'package:appwrite/src/exception.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final messenger = + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger; + + late HttpServer server; + late Directory documents; + late ClientIO client; + late List> authentications; + late List requests; + late String Function(String callback) respond; + + setUp(() async { + HttpOverrides.global = null; + documents = await Directory.systemTemp.createTemp(); + messenger.setMockMethodCallHandler( + const MethodChannel('plugins.flutter.io/path_provider'), + (call) async => documents.path, + ); + authentications = []; + messenger.setMockMethodCallHandler( + const MethodChannel('flutter_web_auth_2'), + (call) async { + final arguments = Map.from(call.arguments as Map); + authentications.add(arguments); + return respond(arguments['callbackUrlScheme'] as String); + }, + ); + + requests = []; + server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0); + server.listen((request) async { + requests.add( + '${request.method} ${request.uri.path} ${await utf8.decoder.bind(request).join()}', + ); + request.response + ..headers.contentType = ContentType.json + ..cookies.add(Cookie('a_session_project', 'session')) + ..write('{}'); + await request.response.close(); + }); + + client = ClientIO(endPoint: 'http://127.0.0.1:${server.port}/v1'); + client.config['project'] = 'project'; + }); + + tearDown(() async { + debugDefaultTargetPlatformOverride = null; + messenger.setMockMethodCallHandler( + const MethodChannel('plugins.flutter.io/path_provider'), + null, + ); + messenger.setMockMethodCallHandler( + const MethodChannel('flutter_web_auth_2'), + null, + ); + await server.close(force: true); + await documents.delete(recursive: true); + }); + + Uri authorization() => Uri.parse( + 'http://127.0.0.1:${server.port}/v1/account/sessions/oauth2/github?scopes%5B%5D=user&scopes%5B%5D=repo&project=project', + ); + + Future> cookies() async => + (await client.cookieJar.loadForRequest( + Uri.parse('http://127.0.0.1:${server.port}/v1'), + )).map((cookie) => '${cookie.name}=${cookie.value}').toList(); + + for (final platform in [TargetPlatform.linux, TargetPlatform.windows]) { + group('webAuth on ${platform.name}', () { + setUp(() => debugDefaultTargetPlatformOverride = platform); + + test('signs in through a loopback token callback', () async { + respond = (callback) => '$callback?userId=user&secret=token'; + + await client.webAuth(authorization()); + + final callback = authentications.single['callbackUrlScheme'] as String; + expect(callback, matches(RegExp(r'^http://localhost:\d+/$'))); + final url = Uri.parse(authentications.single['url'] as String); + expect(url.path, '/v1/account/tokens/oauth2/github'); + expect(url.queryParametersAll['scopes[]'], ['user', 'repo']); + expect(url.queryParameters['project'], 'project'); + expect(url.queryParameters['success'], callback); + expect(url.queryParameters['failure'], callback); + expect(requests, [ + 'POST /v1/account/sessions/token {"userId":"user","secret":"token"}', + ]); + expect(await cookies(), ['a_session_project=session']); + }); + + test('keeps the success and failure URLs it is given', () async { + respond = (callback) => '$callback?userId=user&secret=token'; + + await client.webAuth( + authorization().replace( + queryParameters: { + ...authorization().queryParametersAll, + 'success': 'http://localhost:4000/auth', + 'failure': 'http://localhost:4000/failed', + }, + ), + callbackUrlScheme: 'http://localhost:4000/auth', + ); + + expect( + authentications.single['callbackUrlScheme'], + 'http://localhost:4000/auth', + ); + final url = Uri.parse(authentications.single['url'] as String); + expect(url.queryParameters['success'], 'http://localhost:4000/auth'); + expect(url.queryParameters['failure'], 'http://localhost:4000/failed'); + expect(requests, hasLength(1)); + }); + + test('throws the error the callback carries', () async { + respond = (callback) => + '$callback?error=${Uri.encodeComponent('{"message":"Denied","code":401,"type":"user_oauth2_unauthorized"}')}'; + + await expectLater( + client.webAuth(authorization()), + throwsA( + isA() + .having((error) => error.message, 'message', 'Denied') + .having((error) => error.code, 'code', 401), + ), + ); + expect(requests, isEmpty); + }); + }); + } + + test('webAuth on android saves the session from the app callback', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + respond = (callback) => '$callback://?key=a_session_project&secret=session'; + + await client.webAuth(authorization()); + + expect( + authentications.single['callbackUrlScheme'], + 'appwrite-callback-project', + ); + expect(authentications.single['url'], authorization().toString()); + expect(requests, isEmpty); + expect(await cookies(), ['a_session_project=session']); + }); +} From 1bb7711d2d8d5d62ae65ee885bdd7d558ce0fe5e Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 21 Oct 2026 12:39:33 +1300 Subject: [PATCH 2/5] chore: update Flutter SDK to 28.1.0 --- CHANGELOG.md | 8 + README.md | 2 +- android/build.gradle | 2 +- docs/examples/account/create-push-target.md | 2 + docs/examples/account/list-memberships.md | 15 ++ docs/examples/account/update-push-target.md | 2 + docs/examples/analytics/create-event.md | 2 +- docs/examples/avatars/update-photo.md | 1 - docs/examples/databases/create-document.md | 2 - docs/examples/databases/create-query.md | 19 +++ docs/examples/databases/update-document.md | 2 - docs/examples/databases/upsert-document.md | 2 - docs/examples/documentsdb/create-document.md | 2 - docs/examples/documentsdb/create-query.md | 19 +++ docs/examples/documentsdb/update-document.md | 2 - docs/examples/documentsdb/upsert-document.md | 2 - docs/examples/graphql/mutation.md | 3 +- docs/examples/graphql/query.md | 3 +- docs/examples/oauth2/logout-post.md | 2 +- docs/examples/oauth2/logout.md | 2 +- docs/examples/oauth2/revoke.md | 2 +- docs/examples/presences/update.md | 2 - docs/examples/presences/upsert.md | 2 - docs/examples/storage/create-file.md | 3 - docs/examples/storage/update-file.md | 2 - docs/examples/tablesdb/create-query.md | 19 +++ docs/examples/tablesdb/create-row.md | 2 - docs/examples/tablesdb/update-row.md | 2 - docs/examples/tablesdb/upsert-row.md | 2 - docs/examples/vectorsdb/create-document.md | 2 - docs/examples/vectorsdb/update-document.md | 2 - docs/examples/vectorsdb/upsert-document.md | 2 - lib/query.dart | 14 +- lib/services/account.dart | 51 ++++++ lib/services/databases.dart | 70 ++++++++ lib/services/documents_db.dart | 58 +++++++ lib/services/tables_db.dart | 65 +++++++ lib/src/client_browser.dart | 2 +- lib/src/client_io.dart | 171 +++++++++++++------ pubspec.yaml | 2 +- test/query_test.dart | 17 ++ test/services/account_test.dart | 14 ++ test/services/databases_test.dart | 17 ++ test/services/documents_db_test.dart | 17 ++ test/services/tables_db_test.dart | 17 ++ test/src/client_io_test.dart | 157 +++++++++++++++++ 46 files changed, 700 insertions(+), 108 deletions(-) create mode 100644 docs/examples/account/list-memberships.md create mode 100644 docs/examples/databases/create-query.md create mode 100644 docs/examples/documentsdb/create-query.md create mode 100644 docs/examples/tablesdb/create-query.md create mode 100644 test/src/client_io_test.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index f247af67..7ee8ed70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 28.1.0 + +* Added: `createQuery` on `databases`, `documentsDB` and `tablesDB` to send list queries in the request body +* Added: `account.listMemberships` +* Added: `bundleId` and `environment` on `account.createPushTarget` and `account.updatePushTarget` for APNs routing +* Fixed: OAuth2 sign-in on Windows and Linux returns through a loopback callback and creates the session +* Fixed: saving the OAuth2 session waits for client initialisation already in progress + ## 28.0.0 * Breaking: requests send `X-Appwrite-Response-Format: 2.5.0`; responses follow the 2.5 shapes diff --git a/README.md b/README.md index 99066c04..0cca741c 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Or add it to your app's `pubspec.yaml` file and run `flutter pub get`: ```yaml dependencies: - appwrite: ^28.0.0 + appwrite: ^28.1.0 ``` ### Android requirements diff --git a/android/build.gradle b/android/build.gradle index 2be87ea4..5d77d97e 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,7 +1,7 @@ // The native half of Push on Android: background delivery that survives the process being // killed, a reboot and an app update, shared with the Appwrite Android SDK. group = "io.appwrite.flutter" -version = "28.0.0" +version = "28.1.0" buildscript { ext.kotlin_version = "2.1.0" diff --git a/docs/examples/account/create-push-target.md b/docs/examples/account/create-push-target.md index 250cd4db..a8368084 100644 --- a/docs/examples/account/create-push-target.md +++ b/docs/examples/account/create-push-target.md @@ -12,5 +12,7 @@ models.Target result = await account.createPushTarget( targetId: '', identifier: '', providerId: '', // optional + bundleId: '', // optional + environment: 'sandbox', // optional ); ``` diff --git a/docs/examples/account/list-memberships.md b/docs/examples/account/list-memberships.md new file mode 100644 index 00000000..92a436f8 --- /dev/null +++ b/docs/examples/account/list-memberships.md @@ -0,0 +1,15 @@ +```dart +import 'package:appwrite/appwrite.dart'; +import 'package:appwrite/models.dart' as models; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Account account = Account(client); + +models.MembershipList result = await account.listMemberships( + queries: [], // optional + total: false, // optional +); +``` diff --git a/docs/examples/account/update-push-target.md b/docs/examples/account/update-push-target.md index 49429983..d7466119 100644 --- a/docs/examples/account/update-push-target.md +++ b/docs/examples/account/update-push-target.md @@ -11,5 +11,7 @@ Account account = Account(client); models.Target result = await account.updatePushTarget( targetId: '', identifier: '', + bundleId: '', // optional + environment: 'sandbox', // optional ); ``` diff --git a/docs/examples/analytics/create-event.md b/docs/examples/analytics/create-event.md index d88e257b..af3b50f5 100644 --- a/docs/examples/analytics/create-event.md +++ b/docs/examples/analytics/create-event.md @@ -7,7 +7,7 @@ Client client = Client() Analytics analytics = Analytics(client); -models. result = await analytics.createEvent( +await analytics.createEvent( propertyId: '', name: '', url: 'https://example.com', diff --git a/docs/examples/avatars/update-photo.md b/docs/examples/avatars/update-photo.md index e667a94a..f980ade9 100644 --- a/docs/examples/avatars/update-photo.md +++ b/docs/examples/avatars/update-photo.md @@ -1,5 +1,4 @@ ```dart -import 'dart:io'; import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; diff --git a/docs/examples/databases/create-document.md b/docs/examples/databases/create-document.md index ade4f576..fe143b0e 100644 --- a/docs/examples/databases/create-document.md +++ b/docs/examples/databases/create-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/databases/create-query.md b/docs/examples/databases/create-query.md new file mode 100644 index 00000000..4411715c --- /dev/null +++ b/docs/examples/databases/create-query.md @@ -0,0 +1,19 @@ +```dart +import 'package:appwrite/appwrite.dart'; +import 'package:appwrite/models.dart' as models; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Databases databases = Databases(client); + +models.DocumentList result = await databases.createQuery( + databaseId: '', + collectionId: '', + queries: [], // optional + transactionId: '', // optional + total: false, // optional + ttl: 0, // optional +); +``` diff --git a/docs/examples/databases/update-document.md b/docs/examples/databases/update-document.md index cf6d599c..e62a15e7 100644 --- a/docs/examples/databases/update-document.md +++ b/docs/examples/databases/update-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/databases/upsert-document.md b/docs/examples/databases/upsert-document.md index 1cd30f25..fe658e8f 100644 --- a/docs/examples/databases/upsert-document.md +++ b/docs/examples/databases/upsert-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/documentsdb/create-document.md b/docs/examples/documentsdb/create-document.md index 5ed989ad..9bbe1838 100644 --- a/docs/examples/documentsdb/create-document.md +++ b/docs/examples/documentsdb/create-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/documentsdb/create-query.md b/docs/examples/documentsdb/create-query.md new file mode 100644 index 00000000..ef70c189 --- /dev/null +++ b/docs/examples/documentsdb/create-query.md @@ -0,0 +1,19 @@ +```dart +import 'package:appwrite/appwrite.dart'; +import 'package:appwrite/models.dart' as models; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +DocumentsDB documentsDB = DocumentsDB(client); + +models.DocumentList result = await documentsDB.createQuery( + databaseId: '', + collectionId: '', + queries: [], // optional + transactionId: '', // optional + total: false, // optional + ttl: 0, // optional +); +``` diff --git a/docs/examples/documentsdb/update-document.md b/docs/examples/documentsdb/update-document.md index ec752959..3b85281e 100644 --- a/docs/examples/documentsdb/update-document.md +++ b/docs/examples/documentsdb/update-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/documentsdb/upsert-document.md b/docs/examples/documentsdb/upsert-document.md index 61baa69d..fed1ac5a 100644 --- a/docs/examples/documentsdb/upsert-document.md +++ b/docs/examples/documentsdb/upsert-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/graphql/mutation.md b/docs/examples/graphql/mutation.md index e9632b86..e84cad35 100644 --- a/docs/examples/graphql/mutation.md +++ b/docs/examples/graphql/mutation.md @@ -1,6 +1,5 @@ ```dart import 'package:appwrite/appwrite.dart'; -import 'package:appwrite/models.dart' as models; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint @@ -8,7 +7,7 @@ Client client = Client() Graphql graphql = Graphql(client); -models.Any result = await graphql.mutation( +dynamic result = await graphql.mutation( query: { "query": "mutation { accountUpdateName(name: \"Walter\") { name } }" }, diff --git a/docs/examples/graphql/query.md b/docs/examples/graphql/query.md index de938d4a..10a16be0 100644 --- a/docs/examples/graphql/query.md +++ b/docs/examples/graphql/query.md @@ -1,6 +1,5 @@ ```dart import 'package:appwrite/appwrite.dart'; -import 'package:appwrite/models.dart' as models; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint @@ -8,7 +7,7 @@ Client client = Client() Graphql graphql = Graphql(client); -models.Any result = await graphql.query( +dynamic result = await graphql.query( query: { "query": "query { localeGet { ip } }" }, diff --git a/docs/examples/oauth2/logout-post.md b/docs/examples/oauth2/logout-post.md index 3d163784..dc077108 100644 --- a/docs/examples/oauth2/logout-post.md +++ b/docs/examples/oauth2/logout-post.md @@ -7,7 +7,7 @@ Client client = Client() Oauth2 oauth2 = Oauth2(client); -models. result = await oauth2.logoutPost( +await oauth2.logoutPost( idTokenHint: '', // optional logoutHint: '', // optional clientId: '', // optional diff --git a/docs/examples/oauth2/logout.md b/docs/examples/oauth2/logout.md index 3892325e..640642d6 100644 --- a/docs/examples/oauth2/logout.md +++ b/docs/examples/oauth2/logout.md @@ -7,7 +7,7 @@ Client client = Client() Oauth2 oauth2 = Oauth2(client); -models. result = await oauth2.logout( +await oauth2.logout( idTokenHint: '', // optional logoutHint: '', // optional clientId: '', // optional diff --git a/docs/examples/oauth2/revoke.md b/docs/examples/oauth2/revoke.md index 777340f7..a34d5421 100644 --- a/docs/examples/oauth2/revoke.md +++ b/docs/examples/oauth2/revoke.md @@ -7,7 +7,7 @@ Client client = Client() Oauth2 oauth2 = Oauth2(client); -models. result = await oauth2.revoke( +await oauth2.revoke( token: '', tokenTypeHint: 'access_token', // optional clientId: '', // optional diff --git a/docs/examples/presences/update.md b/docs/examples/presences/update.md index ed52a7b0..0fabdf5a 100644 --- a/docs/examples/presences/update.md +++ b/docs/examples/presences/update.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/presences/upsert.md b/docs/examples/presences/upsert.md index 1620ff55..0d17fb12 100644 --- a/docs/examples/presences/upsert.md +++ b/docs/examples/presences/upsert.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/storage/create-file.md b/docs/examples/storage/create-file.md index f7267340..fa7bc9c7 100644 --- a/docs/examples/storage/create-file.md +++ b/docs/examples/storage/create-file.md @@ -1,9 +1,6 @@ ```dart -import 'dart:io'; import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/storage/update-file.md b/docs/examples/storage/update-file.md index fe33f0bf..6ddd4920 100644 --- a/docs/examples/storage/update-file.md +++ b/docs/examples/storage/update-file.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/tablesdb/create-query.md b/docs/examples/tablesdb/create-query.md new file mode 100644 index 00000000..1878b678 --- /dev/null +++ b/docs/examples/tablesdb/create-query.md @@ -0,0 +1,19 @@ +```dart +import 'package:appwrite/appwrite.dart'; +import 'package:appwrite/models.dart' as models; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +TablesDB tablesDB = TablesDB(client); + +models.RowList result = await tablesDB.createQuery( + databaseId: '', + tableId: '', + queries: [], // optional + transactionId: '', // optional + total: false, // optional + ttl: 0, // optional +); +``` diff --git a/docs/examples/tablesdb/create-row.md b/docs/examples/tablesdb/create-row.md index e3b639c7..ff1969bb 100644 --- a/docs/examples/tablesdb/create-row.md +++ b/docs/examples/tablesdb/create-row.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/tablesdb/update-row.md b/docs/examples/tablesdb/update-row.md index 1d42d637..9440e37c 100644 --- a/docs/examples/tablesdb/update-row.md +++ b/docs/examples/tablesdb/update-row.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/tablesdb/upsert-row.md b/docs/examples/tablesdb/upsert-row.md index a9df95fb..e590764a 100644 --- a/docs/examples/tablesdb/upsert-row.md +++ b/docs/examples/tablesdb/upsert-row.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/vectorsdb/create-document.md b/docs/examples/vectorsdb/create-document.md index ecc02176..4a4ce765 100644 --- a/docs/examples/vectorsdb/create-document.md +++ b/docs/examples/vectorsdb/create-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/vectorsdb/update-document.md b/docs/examples/vectorsdb/update-document.md index 0457e855..27e37e8d 100644 --- a/docs/examples/vectorsdb/update-document.md +++ b/docs/examples/vectorsdb/update-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/vectorsdb/upsert-document.md b/docs/examples/vectorsdb/upsert-document.md index de7503fb..e5c7c189 100644 --- a/docs/examples/vectorsdb/upsert-document.md +++ b/docs/examples/vectorsdb/upsert-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/lib/query.dart b/lib/query.dart index 33541de0..38e158c0 100644 --- a/lib/query.dart +++ b/lib/query.dart @@ -353,7 +353,7 @@ class Query { static String max(String attribute, [String alias = '']) => Query._('max', attribute, alias.isNotEmpty ? alias : null).toString(); - /// Standard deviation of [attribute], optionally aliased. + /// Population standard deviation of [attribute] (the same as stddevPop), optionally aliased. static String stddev(String attribute, [String alias = '']) => Query._('stddev', attribute, alias.isNotEmpty ? alias : null).toString(); @@ -367,7 +367,7 @@ class Query { Query._('stddevSamp', attribute, alias.isNotEmpty ? alias : null) .toString(); - /// Variance of [attribute], optionally aliased. + /// Population variance of [attribute] (the same as varPop), optionally aliased. static String variance(String attribute, [String alias = '']) => Query._('variance', attribute, alias.isNotEmpty ? alias : null) .toString(); @@ -410,7 +410,7 @@ class Query { static String on(String left, String right, [String operator = '=']) => Query._('on', null, [left, operator, right]).toString(); - /// Inner join. [table] is the joined collection/table ID. + /// Inner join. [table] is the joined collection/table ID; without an alias the server names the join after it, if the ID is a valid alias, and otherwise rejects the query. static String join( String table, Object leftOrAliasOrOn, [ @@ -420,7 +420,7 @@ class Query { ]) => Query._createJoin('join', table, leftOrAliasOrOn, rightOrOn, operator, alias); - /// Left join. [table] is the joined collection/table ID. + /// Left join. [table] is the joined collection/table ID; without an alias the server names the join after it, if the ID is a valid alias, and otherwise rejects the query. static String leftJoin( String table, Object leftOrAliasOrOn, [ @@ -430,7 +430,7 @@ class Query { ]) => Query._createJoin('leftJoin', table, leftOrAliasOrOn, rightOrOn, operator, alias); - /// Right join. [table] is the joined collection/table ID. + /// Right join. [table] is the joined collection/table ID; without an alias the server names the join after it, if the ID is a valid alias, and otherwise rejects the query. static String rightJoin( String table, Object leftOrAliasOrOn, [ @@ -440,7 +440,7 @@ class Query { ]) => Query._createJoin('rightJoin', table, leftOrAliasOrOn, rightOrOn, operator, alias); - /// Full outer join. [table] is the joined collection/table ID. + /// Full outer join. [table] is the joined collection/table ID; without an alias the server names the join after it, if the ID is a valid alias, and otherwise rejects the query. static String fullOuterJoin( String table, Object leftOrAliasOrOn, [ @@ -450,7 +450,7 @@ class Query { ]) => Query._createJoin('fullOuterJoin', table, leftOrAliasOrOn, rightOrOn, operator, alias); - /// Cross join. [table] is the joined collection/table ID. + /// Cross join. [table] is the joined collection/table ID; without an alias the server names the join after it, if the ID is a valid alias, and otherwise rejects the query. static String crossJoin(String table, [String alias = '']) => Query._('crossJoin', table, alias.isNotEmpty ? alias : null).toString(); diff --git a/lib/services/account.dart b/lib/services/account.dart index d805b833..3e6de0d8 100644 --- a/lib/services/account.dart +++ b/lib/services/account.dart @@ -415,6 +415,33 @@ class Account extends Service { return models.Jwt.fromMap(res.data); } + /// Get the team memberships of the currently logged in user. + Future listMemberships({ + List? queries, + bool? total, + }) async { + final String apiPath = '/account/memberships'; + + final Map apiParams = { + if (queries != null) 'queries': queries, + if (total != null) 'total': total, + }; + + final Map apiHeaders = { + 'X-Appwrite-Project': client.config['project'] ?? '', + 'accept': 'application/json', + }; + + final res = await client.call( + HttpMethod.get, + path: apiPath, + params: apiParams, + headers: apiHeaders, + ); + + return models.MembershipList.fromMap(res.data); + } + /// Enable or disable MFA on an account. Future updateMFA({ required bool mfa, @@ -1348,6 +1375,14 @@ class Account extends Service { /// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) /// the only valid redirect URLs are the ones from domains you have set when /// adding your platforms in the console interface. + /// + /// The new password must satisfy the project's enabled password policies, + /// including custom deny lists. Dictionary entries match the entire password + /// case-sensitively; personal-data terms match substrings case-insensitively. + /// Personal-data validation runs after token verification against the + /// recovered user's ID, name, email, and phone, closing the previous recovery + /// gap for profile-based checks. A rejected password leaves the existing + /// credentials unchanged and the recovery token usable. Future updateRecovery({ required String userId, required String secret, @@ -1423,6 +1458,14 @@ class Account extends Service { /// Pass the **userId** of the user along with the **secret** code from the /// email and the new **password** to set. If confirmed, this route will return /// a 200 status code, the code is consumed and the user's password is updated. + /// + /// The new password must satisfy the project's enabled password policies, + /// including custom deny lists. Dictionary entries match the entire password + /// case-sensitively; personal-data terms match substrings case-insensitively. + /// Personal-data validation runs after token verification against the + /// recovered user's ID, name, email, and phone, closing the previous recovery + /// gap for profile-based checks. A rejected password leaves the existing + /// credentials unchanged and the recovery token usable. Future updateRecoveryOTP({ required String userId, required String secret, @@ -1946,6 +1989,8 @@ class Account extends Service { required String targetId, required String identifier, String? providerId, + String? bundleId, + String? environment, }) async { final String apiPath = '/account/targets/push'; @@ -1953,6 +1998,8 @@ class Account extends Service { 'targetId': targetId, 'identifier': identifier, if (providerId != null) 'providerId': providerId, + if (bundleId != null) 'bundleId': bundleId, + if (environment != null) 'environment': environment, }; final Map apiHeaders = { @@ -1979,6 +2026,8 @@ class Account extends Service { Future updatePushTarget({ required String targetId, required String identifier, + String? bundleId, + String? environment, }) async { if (targetId.isEmpty) { throw AppwriteException( @@ -1993,6 +2042,8 @@ class Account extends Service { final Map apiParams = { 'identifier': identifier, + if (bundleId != null) 'bundleId': bundleId, + if (environment != null) 'environment': environment, }; final Map apiHeaders = { diff --git a/lib/services/databases.dart b/lib/services/databases.dart index 96fed789..11959bf9 100644 --- a/lib/services/databases.dart +++ b/lib/services/databases.dart @@ -219,6 +219,15 @@ class Databases extends Service { /// Get a list of all the user's documents in a given collection. You can use /// the query params to filter your results. + /// + /// Documents returned by aggregate, groupBy or distinct queries hold only the + /// attributes they select, group or aggregate, typed as a document types them, + /// with a joined attribute named by its join alias (`alias.attribute`). The + /// response omits their `$id`, `$sequence`, `$createdAt`, `$updatedAt`, + /// `$permissions`, `$databaseId` and `$collectionId` unless they select or + /// group it, and those of a right or full join document that no document of + /// this collection matched. SDK document models fill omitted system attributes + /// with empty values. @Deprecated( 'This API has been deprecated since 1.8.0. Please use `TablesDB.listRows` instead.', ) @@ -336,6 +345,67 @@ class Databases extends Service { return models.Document.fromMap(res.data); } + /// Get a list of all the user's documents in a given collection using a POST + /// request. This behaves identically to the list documents endpoint but + /// accepts the queries in the request body, allowing much larger `queries` + /// arrays than can fit in a URL query string. + @Deprecated( + 'This API has been deprecated since 1.8.0. Please use `TablesDB.createQuery` instead.', + ) + Future createQuery({ + required String databaseId, + required String collectionId, + List? queries, + String? transactionId, + bool? total, + int? ttl, + }) async { + if (databaseId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "databaseId"', + ); + } + + if (collectionId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "collectionId"', + ); + } + + final String apiPath = + '/databases/{databaseId}/collections/{collectionId}/documents/query' + .replaceAll( + '{databaseId}', + databaseId, + ) + .replaceAll( + '{collectionId}', + collectionId, + ); + + final Map apiParams = { + if (queries != null) 'queries': queries, + if (transactionId != null) 'transactionId': transactionId, + if (total != null) 'total': total, + if (ttl != null) 'ttl': ttl, + }; + + final Map apiHeaders = { + 'X-Appwrite-Project': client.config['project'] ?? '', + 'content-type': 'application/json', + 'accept': 'application/json', + }; + + final res = await client.call( + HttpMethod.post, + path: apiPath, + params: apiParams, + headers: apiHeaders, + ); + + return models.DocumentList.fromMap(res.data); + } + /// Get a document by its unique ID. This endpoint response returns a JSON /// object with the document data. @Deprecated( diff --git a/lib/services/documents_db.dart b/lib/services/documents_db.dart index 1d04aa9c..93ef8712 100644 --- a/lib/services/documents_db.dart +++ b/lib/services/documents_db.dart @@ -367,6 +367,64 @@ class DocumentsDB extends Service { return models.DocumentList.fromMap(res.data); } + /// Get a list of all the user's documents in a given collection using a POST + /// request. This behaves identically to the list documents endpoint but + /// accepts the queries in the request body, allowing much larger `queries` + /// arrays than can fit in a URL query string. + Future createQuery({ + required String databaseId, + required String collectionId, + List? queries, + String? transactionId, + bool? total, + int? ttl, + }) async { + if (databaseId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "databaseId"', + ); + } + + if (collectionId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "collectionId"', + ); + } + + final String apiPath = + '/documentsdb/{databaseId}/collections/{collectionId}/documents/query' + .replaceAll( + '{databaseId}', + databaseId, + ) + .replaceAll( + '{collectionId}', + collectionId, + ); + + final Map apiParams = { + if (queries != null) 'queries': queries, + if (transactionId != null) 'transactionId': transactionId, + if (total != null) 'total': total, + if (ttl != null) 'ttl': ttl, + }; + + final Map apiHeaders = { + 'X-Appwrite-Project': client.config['project'] ?? '', + 'content-type': 'application/json', + 'accept': 'application/json', + }; + + final res = await client.call( + HttpMethod.post, + path: apiPath, + params: apiParams, + headers: apiHeaders, + ); + + return models.DocumentList.fromMap(res.data); + } + /// Get a document by its unique ID. This endpoint response returns a JSON /// object with the document data. Future getDocument({ diff --git a/lib/services/tables_db.dart b/lib/services/tables_db.dart index e7a5d4a3..3ad93e30 100644 --- a/lib/services/tables_db.dart +++ b/lib/services/tables_db.dart @@ -201,6 +201,14 @@ class TablesDB extends Service { /// Get a list of all the user's rows in a given table. You can use the query /// params to filter your results. + /// + /// Rows returned by aggregate, groupBy or distinct queries hold only the + /// columns they select, group or aggregate, typed as a row types them, with a + /// joined column named by its join alias (`alias.column`). The response omits + /// their `$id`, `$sequence`, `$createdAt`, `$updatedAt`, `$permissions`, + /// `$databaseId` and `$tableId` unless they select or group it, and those of a + /// right or full join row that no row of this table matched. SDK row models + /// fill omitted system columns with empty values. Future listRows({ required String databaseId, required String tableId, @@ -310,6 +318,63 @@ class TablesDB extends Service { return models.Row.fromMap(res.data); } + /// Get a list of all the user's rows in a given table using a POST request. + /// This behaves identically to the list rows endpoint but accepts the queries + /// in the request body, allowing much larger `queries` arrays than can fit in + /// a URL query string. + Future createQuery({ + required String databaseId, + required String tableId, + List? queries, + String? transactionId, + bool? total, + int? ttl, + }) async { + if (databaseId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "databaseId"', + ); + } + + if (tableId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "tableId"', + ); + } + + final String apiPath = '/tablesdb/{databaseId}/tables/{tableId}/rows/query' + .replaceAll( + '{databaseId}', + databaseId, + ) + .replaceAll( + '{tableId}', + tableId, + ); + + final Map apiParams = { + if (queries != null) 'queries': queries, + if (transactionId != null) 'transactionId': transactionId, + if (total != null) 'total': total, + if (ttl != null) 'ttl': ttl, + }; + + final Map apiHeaders = { + 'X-Appwrite-Project': client.config['project'] ?? '', + 'content-type': 'application/json', + 'accept': 'application/json', + }; + + final res = await client.call( + HttpMethod.post, + path: apiPath, + params: apiParams, + headers: apiHeaders, + ); + + return models.RowList.fromMap(res.data); + } + /// Get a row by its unique ID. This endpoint response returns a JSON object /// with the row data. Future getRow({ diff --git a/lib/src/client_browser.dart b/lib/src/client_browser.dart index 7488458c..ab689f04 100644 --- a/lib/src/client_browser.dart +++ b/lib/src/client_browser.dart @@ -40,7 +40,7 @@ class ClientBrowser extends ClientBase with ClientMixin { 'x-sdk-name': 'Flutter', 'x-sdk-platform': 'client', 'x-sdk-language': 'flutter', - 'x-sdk-version': '28.0.0', + 'x-sdk-version': '28.1.0', 'X-Appwrite-Response-Format': '2.5.0', }; diff --git a/lib/src/client_io.dart b/lib/src/client_io.dart index af5ed1f3..e348030a 100644 --- a/lib/src/client_io.dart +++ b/lib/src/client_io.dart @@ -59,7 +59,7 @@ class ClientIO extends ClientBase with ClientMixin { 'x-sdk-name': 'Flutter', 'x-sdk-platform': 'client', 'x-sdk-language': 'flutter', - 'x-sdk-version': '28.0.0', + 'x-sdk-version': '28.1.0', 'X-Appwrite-Response-Format': '2.5.0', }; @@ -261,6 +261,15 @@ class ClientIO extends ClientBase with ClientMixin { _initProgress = false; } + Future _ready() async { + while (!_initialized && _initProgress) { + await Future.delayed(Duration(milliseconds: 10)); + } + if (!_initialized) { + await init(); + } + } + Future _interceptRequest(http.BaseRequest request) async { final body = (request is http.Request) ? request.body : ''; for (final i in _interceptors) { @@ -499,59 +508,116 @@ class ClientIO extends ClientBase with ClientMixin { return finalResponse ?? lastResponse; } - bool get _customSchemeAllowed => Platform.isWindows || Platform.isLinux; + bool get _loopbackCallback => + defaultTargetPlatform == TargetPlatform.windows || + defaultTargetPlatform == TargetPlatform.linux; @override - Future webAuth(Uri url, {String? callbackUrlScheme}) { - return FlutterWebAuth2.authenticate( - url: url.toString(), - callbackUrlScheme: callbackUrlScheme != null && _customSchemeAllowed - ? callbackUrlScheme - : "appwrite-callback-${config['project']!}", - options: const FlutterWebAuth2Options( - useWebview: false, + Future webAuth(Uri url, {String? callbackUrlScheme}) async { + if (!_loopbackCallback) { + return _saveSession( + await _authenticate( + url, + "appwrite-callback-${config['project']!}", + ), + ); + } + + final callback = callbackUrlScheme ?? await _loopbackUrl(); + final exchange = url.path.contains(_sessionOAuth2Path); + final result = await _authenticate( + url.replace( + path: exchange + ? url.path.replaceFirst(_sessionOAuth2Path, _tokenOAuth2Path) + : url.path, + queryParameters: { + ...url.queryParametersAll, + 'success': [callback], + 'failure': url.queryParametersAll['failure'] ?? [callback], + }, ), - ).then((value) async { - Uri url = Uri.parse(value); - final key = url.queryParameters['key']; - final secret = url.queryParameters['secret']; - if (key == null || secret == null) { - final error = url.queryParameters['error']; - if (error != null && error.isNotEmpty) { - try { - final parsed = jsonDecode(error); - if (parsed is Map) { - final codeValue = parsed['code']; - final int? code = codeValue is int - ? codeValue - : int.tryParse('${codeValue ?? ''}'); - throw AppwriteException( - parsed['message']?.toString() ?? error, - code, - parsed['type']?.toString(), - error, - ); - } - } on AppwriteException { - rethrow; - } catch (_) { - // Fall through to a plain-string error when JSON is malformed. - } - throw AppwriteException(error); + callback, + ); + if (!exchange) { + return _saveSession(result); + } + + final userId = result.queryParameters['userId']; + final secret = result.queryParameters['secret']; + if (userId == null || secret == null) { + _throwCallbackError(result); + } + await call( + HttpMethod.post, + path: _tokenSessionPath, + params: {'userId': userId, 'secret': secret}, + ); + } + + static const String _sessionOAuth2Path = '/account/sessions/oauth2/'; + static const String _tokenOAuth2Path = '/account/tokens/oauth2/'; + static const String _tokenSessionPath = '/account/sessions/token'; + + Future _loopbackUrl() async { + final socket = await ServerSocket.bind(InternetAddress.loopbackIPv4, 0); + final port = socket.port; + await socket.close(); + return 'http://localhost:$port/'; + } + + Future _authenticate(Uri url, String callbackUrlScheme) async { + return Uri.parse( + await FlutterWebAuth2.authenticate( + url: url.toString(), + callbackUrlScheme: callbackUrlScheme, + options: const FlutterWebAuth2Options(useWebview: false), + ), + ); + } + + Future _saveSession(Uri url) async { + final key = url.queryParameters['key']; + final secret = url.queryParameters['secret']; + if (key == null || secret == null) { + _throwCallbackError(url); + } + Cookie cookie = Cookie(key, secret); + cookie.domain = Uri.parse(_endPoint).host; + cookie.httpOnly = true; + cookie.path = '/'; + List cookies = [cookie]; + await _ready(); + await _cookieJar.saveFromResponse(Uri.parse(_endPoint), cookies); + } + + Never _throwCallbackError(Uri url) { + final error = url.queryParameters['error']; + if (error != null && error.isNotEmpty) { + try { + final parsed = jsonDecode(error); + if (parsed is Map) { + final codeValue = parsed['code']; + final int? code = codeValue is int + ? codeValue + : int.tryParse('${codeValue ?? ''}'); + throw AppwriteException( + parsed['message']?.toString() ?? error, + code, + parsed['type']?.toString(), + error, + ); } - throw AppwriteException( - "Invalid OAuth2 Response. Key and Secret not available.", - 500, - ); + } on AppwriteException { + rethrow; + } catch (_) { + // Fall through to a plain-string error when JSON is malformed. } - Cookie cookie = Cookie(key, secret); - cookie.domain = Uri.parse(_endPoint).host; - cookie.httpOnly = true; - cookie.path = '/'; - List cookies = [cookie]; - await init(); - _cookieJar.saveFromResponse(Uri.parse(_endPoint), cookies); - }); + throw AppwriteException(error); + } + throw AppwriteException( + "Invalid OAuth2 Response. Key and Secret not available.", + 500, + ); } @override @@ -562,12 +628,7 @@ class ClientIO extends ClientBase with ClientMixin { Map params = const {}, ResponseType? responseType, }) async { - while (!_initialized && _initProgress) { - await Future.delayed(Duration(milliseconds: 10)); - } - if (!_initialized) { - await init(); - } + await _ready(); late http.Response res; http.BaseRequest request = prepareRequest( diff --git a/pubspec.yaml b/pubspec.yaml index 08a46375..2147f32e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: appwrite -version: 28.0.0 +version: 28.1.0 description: Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API homepage: https://appwrite.io repository: https://github.com/appwrite/sdk-for-flutter diff --git a/test/query_test.dart b/test/query_test.dart index fad7f352..6ab76a8c 100644 --- a/test/query_test.dart +++ b/test/query_test.dart @@ -511,6 +511,23 @@ void main() { expect(query['values'], ['ord']); }); + test('returns nested join without alias, leaving the alias to the server', + () { + final query = + jsonDecode(Query.join('orders', [Query.on('\$id', 'customerId')])); + expect(query['method'], 'join'); + expect(query['attribute'], 'orders'); + expect(query['values'].length, 1); + expect(query['values'][0]['method'], 'on'); + }); + + test('returns crossJoin without alias, leaving the alias to the server', () { + final query = jsonDecode(Query.crossJoin('orders')); + expect(query['method'], 'crossJoin'); + expect(query['attribute'], 'orders'); + expect(query['values'] ?? [], isEmpty); + }); + test('returns vectorDot', () { final query = jsonDecode(Query.vectorDot('embedding', [0.1, 0.2])); expect(query['method'], 'vectorDot'); diff --git a/test/services/account_test.dart b/test/services/account_test.dart index a904822d..0210868c 100644 --- a/test/services/account_test.dart +++ b/test/services/account_test.dart @@ -305,6 +305,20 @@ void main() { expect(response, isA()); }); + test('test method listMemberships()', () async { + final Map data = { + 'total': 5, + 'memberships': [], + }; + + when( + client.call(HttpMethod.get), + ).thenAnswer((_) async => Response(data: data)); + + final response = await account.listMemberships(); + expect(response, isA()); + }); + test('test method updateMFA()', () async { final Map data = { '\$id': "5e5ea5c16897e", diff --git a/test/services/databases_test.dart b/test/services/databases_test.dart index eb03954a..95eb1d7b 100644 --- a/test/services/databases_test.dart +++ b/test/services/databases_test.dart @@ -212,6 +212,23 @@ void main() { expect(response, isA()); }); + test('test method createQuery()', () async { + final Map data = { + 'total': 5, + 'documents': [], + }; + + when( + client.call(HttpMethod.post), + ).thenAnswer((_) async => Response(data: data)); + + final response = await databases.createQuery( + databaseId: "", + collectionId: "", + ); + expect(response, isA()); + }); + test('test method getDocument()', () async { final Map data = { '\$id': "5e5ea5c16897e", diff --git a/test/services/documents_db_test.dart b/test/services/documents_db_test.dart index 4312cced..10260b69 100644 --- a/test/services/documents_db_test.dart +++ b/test/services/documents_db_test.dart @@ -230,6 +230,23 @@ void main() { expect(response, isA()); }); + test('test method createQuery()', () async { + final Map data = { + 'total': 5, + 'documents': [], + }; + + when( + client.call(HttpMethod.post), + ).thenAnswer((_) async => Response(data: data)); + + final response = await documentsDB.createQuery( + databaseId: "", + collectionId: "", + ); + expect(response, isA()); + }); + test('test method getDocument()', () async { final Map data = { '\$id': "5e5ea5c16897e", diff --git a/test/services/tables_db_test.dart b/test/services/tables_db_test.dart index 90a55af7..72e85ab7 100644 --- a/test/services/tables_db_test.dart +++ b/test/services/tables_db_test.dart @@ -212,6 +212,23 @@ void main() { expect(response, isA()); }); + test('test method createQuery()', () async { + final Map data = { + 'total': 5, + 'rows': [], + }; + + when( + client.call(HttpMethod.post), + ).thenAnswer((_) async => Response(data: data)); + + final response = await tablesDB.createQuery( + databaseId: "", + tableId: "", + ); + expect(response, isA()); + }); + test('test method getRow()', () async { final Map data = { '\$id': "5e5ea5c16897e", diff --git a/test/src/client_io_test.dart b/test/src/client_io_test.dart new file mode 100644 index 00000000..c81a649e --- /dev/null +++ b/test/src/client_io_test.dart @@ -0,0 +1,157 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:appwrite/src/client_io.dart'; +import 'package:appwrite/src/exception.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final messenger = + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger; + + late HttpServer server; + late Directory documents; + late ClientIO client; + late List> authentications; + late List requests; + late String Function(String callback) respond; + + setUp(() async { + HttpOverrides.global = null; + documents = await Directory.systemTemp.createTemp(); + messenger.setMockMethodCallHandler( + const MethodChannel('plugins.flutter.io/path_provider'), + (call) async => documents.path, + ); + authentications = []; + messenger.setMockMethodCallHandler( + const MethodChannel('flutter_web_auth_2'), + (call) async { + final arguments = Map.from(call.arguments as Map); + authentications.add(arguments); + return respond(arguments['callbackUrlScheme'] as String); + }, + ); + + requests = []; + server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0); + server.listen((request) async { + requests.add( + '${request.method} ${request.uri.path} ${await utf8.decoder.bind(request).join()}', + ); + request.response + ..headers.contentType = ContentType.json + ..cookies.add(Cookie('a_session_project', 'session')) + ..write('{}'); + await request.response.close(); + }); + + client = ClientIO(endPoint: 'http://127.0.0.1:${server.port}/v1'); + client.config['project'] = 'project'; + }); + + tearDown(() async { + debugDefaultTargetPlatformOverride = null; + messenger.setMockMethodCallHandler( + const MethodChannel('plugins.flutter.io/path_provider'), + null, + ); + messenger.setMockMethodCallHandler( + const MethodChannel('flutter_web_auth_2'), + null, + ); + await server.close(force: true); + await documents.delete(recursive: true); + }); + + Uri authorization() => Uri.parse( + 'http://127.0.0.1:${server.port}/v1/account/sessions/oauth2/github?scopes%5B%5D=user&scopes%5B%5D=repo&project=project', + ); + + Future> cookies() async => + (await client.cookieJar.loadForRequest( + Uri.parse('http://127.0.0.1:${server.port}/v1'), + )).map((cookie) => '${cookie.name}=${cookie.value}').toList(); + + for (final platform in [TargetPlatform.linux, TargetPlatform.windows]) { + group('webAuth on ${platform.name}', () { + setUp(() => debugDefaultTargetPlatformOverride = platform); + + test('signs in through a loopback token callback', () async { + respond = (callback) => '$callback?userId=user&secret=token'; + + await client.webAuth(authorization()); + + final callback = authentications.single['callbackUrlScheme'] as String; + expect(callback, matches(RegExp(r'^http://localhost:\d+/$'))); + final url = Uri.parse(authentications.single['url'] as String); + expect(url.path, '/v1/account/tokens/oauth2/github'); + expect(url.queryParametersAll['scopes[]'], ['user', 'repo']); + expect(url.queryParameters['project'], 'project'); + expect(url.queryParameters['success'], callback); + expect(url.queryParameters['failure'], callback); + expect(requests, [ + 'POST /v1/account/sessions/token {"userId":"user","secret":"token"}', + ]); + expect(await cookies(), ['a_session_project=session']); + }); + + test('keeps the success and failure URLs it is given', () async { + respond = (callback) => '$callback?userId=user&secret=token'; + + await client.webAuth( + authorization().replace( + queryParameters: { + ...authorization().queryParametersAll, + 'success': 'http://localhost:4000/auth', + 'failure': 'http://localhost:4000/failed', + }, + ), + callbackUrlScheme: 'http://localhost:4000/auth', + ); + + expect( + authentications.single['callbackUrlScheme'], + 'http://localhost:4000/auth', + ); + final url = Uri.parse(authentications.single['url'] as String); + expect(url.queryParameters['success'], 'http://localhost:4000/auth'); + expect(url.queryParameters['failure'], 'http://localhost:4000/failed'); + expect(requests, hasLength(1)); + }); + + test('throws the error the callback carries', () async { + respond = (callback) => + '$callback?error=${Uri.encodeComponent('{"message":"Denied","code":401,"type":"user_oauth2_unauthorized"}')}'; + + await expectLater( + client.webAuth(authorization()), + throwsA( + isA() + .having((error) => error.message, 'message', 'Denied') + .having((error) => error.code, 'code', 401), + ), + ); + expect(requests, isEmpty); + }); + }); + } + + test('webAuth on android saves the session from the app callback', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + respond = (callback) => '$callback://?key=a_session_project&secret=session'; + + await client.webAuth(authorization()); + + expect( + authentications.single['callbackUrlScheme'], + 'appwrite-callback-project', + ); + expect(authentications.single['url'], authorization().toString()); + expect(requests, isEmpty); + expect(await cookies(), ['a_session_project=session']); + }); +} From 13fc028e4467f5eddbea9fa8b84ded5c16e2ed6c Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 21 Oct 2026 13:23:54 +1300 Subject: [PATCH 3/5] chore: update Flutter SDK to 28.1.0 --- CHANGELOG.md | 8 + README.md | 2 +- android/build.gradle | 2 +- docs/examples/account/create-push-target.md | 2 + docs/examples/account/list-memberships.md | 15 + docs/examples/account/update-push-target.md | 2 + docs/examples/analytics/create-event.md | 2 +- docs/examples/avatars/update-photo.md | 1 - docs/examples/databases/create-document.md | 2 - docs/examples/databases/create-query.md | 19 + docs/examples/databases/update-document.md | 2 - docs/examples/databases/upsert-document.md | 2 - docs/examples/documentsdb/create-document.md | 2 - docs/examples/documentsdb/create-query.md | 19 + docs/examples/documentsdb/update-document.md | 2 - docs/examples/documentsdb/upsert-document.md | 2 - docs/examples/graphql/mutation.md | 3 +- docs/examples/graphql/query.md | 3 +- docs/examples/oauth2/logout-post.md | 2 +- docs/examples/oauth2/logout.md | 2 +- docs/examples/oauth2/revoke.md | 2 +- docs/examples/presences/update.md | 2 - docs/examples/presences/upsert.md | 2 - docs/examples/storage/create-file.md | 3 - docs/examples/storage/update-file.md | 2 - docs/examples/tablesdb/create-query.md | 19 + docs/examples/tablesdb/create-row.md | 2 - docs/examples/tablesdb/update-row.md | 2 - docs/examples/tablesdb/upsert-row.md | 2 - docs/examples/vectorsdb/create-document.md | 2 - docs/examples/vectorsdb/update-document.md | 2 - docs/examples/vectorsdb/upsert-document.md | 2 - lib/query.dart | 14 +- lib/services/account.dart | 51 + lib/services/databases.dart | 70 + lib/services/documents_db.dart | 58 + lib/services/tables_db.dart | 65 + lib/src/client_browser.dart | 2 +- lib/src/client_io.dart | 171 ++- pubspec.yaml | 2 +- test/query_test.dart | 17 + test/services/account_test.dart | 1396 ++++++++++++++++-- test/services/analytics_test.dart | 48 +- test/services/apps_test.dart | 408 ++++- test/services/avatars_test.dart | 232 ++- test/services/databases_test.dart | 315 +++- test/services/documents_db_test.dart | 333 ++++- test/services/functions_test.dart | 84 +- test/services/graphql_test.dart | 66 +- test/services/locale_test.dart | 174 ++- test/services/messaging_test.dart | 66 +- test/services/oauth2_test.dart | 282 +++- test/services/organization_test.dart | 120 +- test/services/presences_test.dart | 120 +- test/services/storage_test.dart | 178 ++- test/services/tables_db_test.dart | 315 +++- test/services/teams_test.dart | 354 ++++- test/services/vectors_db_test.dart | 264 +++- test/src/client_io_test.dart | 202 +++ 59 files changed, 4995 insertions(+), 548 deletions(-) create mode 100644 docs/examples/account/list-memberships.md create mode 100644 docs/examples/databases/create-query.md create mode 100644 docs/examples/documentsdb/create-query.md create mode 100644 docs/examples/tablesdb/create-query.md create mode 100644 test/src/client_io_test.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index f247af67..6362da7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 28.1.0 + +* Added: `createQuery` on `databases`, `documentsDB` and `tablesDB` to send list queries in the request body +* Added: `account.listMemberships` +* Added: `bundleId` and `environment` on `account.createPushTarget` and `account.updatePushTarget` for APNs routing +* Fixed: OAuth2 sign-in on Windows and Linux returns through a loopback callback and creates the session; a denied sign-in throws its error instead of opening the `failure` URL +* Fixed: saving the OAuth2 session waits for client initialisation already in progress + ## 28.0.0 * Breaking: requests send `X-Appwrite-Response-Format: 2.5.0`; responses follow the 2.5 shapes diff --git a/README.md b/README.md index 99066c04..0cca741c 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Or add it to your app's `pubspec.yaml` file and run `flutter pub get`: ```yaml dependencies: - appwrite: ^28.0.0 + appwrite: ^28.1.0 ``` ### Android requirements diff --git a/android/build.gradle b/android/build.gradle index 2be87ea4..5d77d97e 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,7 +1,7 @@ // The native half of Push on Android: background delivery that survives the process being // killed, a reboot and an app update, shared with the Appwrite Android SDK. group = "io.appwrite.flutter" -version = "28.0.0" +version = "28.1.0" buildscript { ext.kotlin_version = "2.1.0" diff --git a/docs/examples/account/create-push-target.md b/docs/examples/account/create-push-target.md index 250cd4db..a8368084 100644 --- a/docs/examples/account/create-push-target.md +++ b/docs/examples/account/create-push-target.md @@ -12,5 +12,7 @@ models.Target result = await account.createPushTarget( targetId: '', identifier: '', providerId: '', // optional + bundleId: '', // optional + environment: 'sandbox', // optional ); ``` diff --git a/docs/examples/account/list-memberships.md b/docs/examples/account/list-memberships.md new file mode 100644 index 00000000..92a436f8 --- /dev/null +++ b/docs/examples/account/list-memberships.md @@ -0,0 +1,15 @@ +```dart +import 'package:appwrite/appwrite.dart'; +import 'package:appwrite/models.dart' as models; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Account account = Account(client); + +models.MembershipList result = await account.listMemberships( + queries: [], // optional + total: false, // optional +); +``` diff --git a/docs/examples/account/update-push-target.md b/docs/examples/account/update-push-target.md index 49429983..d7466119 100644 --- a/docs/examples/account/update-push-target.md +++ b/docs/examples/account/update-push-target.md @@ -11,5 +11,7 @@ Account account = Account(client); models.Target result = await account.updatePushTarget( targetId: '', identifier: '', + bundleId: '', // optional + environment: 'sandbox', // optional ); ``` diff --git a/docs/examples/analytics/create-event.md b/docs/examples/analytics/create-event.md index d88e257b..af3b50f5 100644 --- a/docs/examples/analytics/create-event.md +++ b/docs/examples/analytics/create-event.md @@ -7,7 +7,7 @@ Client client = Client() Analytics analytics = Analytics(client); -models. result = await analytics.createEvent( +await analytics.createEvent( propertyId: '', name: '', url: 'https://example.com', diff --git a/docs/examples/avatars/update-photo.md b/docs/examples/avatars/update-photo.md index e667a94a..f980ade9 100644 --- a/docs/examples/avatars/update-photo.md +++ b/docs/examples/avatars/update-photo.md @@ -1,5 +1,4 @@ ```dart -import 'dart:io'; import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; diff --git a/docs/examples/databases/create-document.md b/docs/examples/databases/create-document.md index ade4f576..fe143b0e 100644 --- a/docs/examples/databases/create-document.md +++ b/docs/examples/databases/create-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/databases/create-query.md b/docs/examples/databases/create-query.md new file mode 100644 index 00000000..4411715c --- /dev/null +++ b/docs/examples/databases/create-query.md @@ -0,0 +1,19 @@ +```dart +import 'package:appwrite/appwrite.dart'; +import 'package:appwrite/models.dart' as models; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +Databases databases = Databases(client); + +models.DocumentList result = await databases.createQuery( + databaseId: '', + collectionId: '', + queries: [], // optional + transactionId: '', // optional + total: false, // optional + ttl: 0, // optional +); +``` diff --git a/docs/examples/databases/update-document.md b/docs/examples/databases/update-document.md index cf6d599c..e62a15e7 100644 --- a/docs/examples/databases/update-document.md +++ b/docs/examples/databases/update-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/databases/upsert-document.md b/docs/examples/databases/upsert-document.md index 1cd30f25..fe658e8f 100644 --- a/docs/examples/databases/upsert-document.md +++ b/docs/examples/databases/upsert-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/documentsdb/create-document.md b/docs/examples/documentsdb/create-document.md index 5ed989ad..9bbe1838 100644 --- a/docs/examples/documentsdb/create-document.md +++ b/docs/examples/documentsdb/create-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/documentsdb/create-query.md b/docs/examples/documentsdb/create-query.md new file mode 100644 index 00000000..ef70c189 --- /dev/null +++ b/docs/examples/documentsdb/create-query.md @@ -0,0 +1,19 @@ +```dart +import 'package:appwrite/appwrite.dart'; +import 'package:appwrite/models.dart' as models; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +DocumentsDB documentsDB = DocumentsDB(client); + +models.DocumentList result = await documentsDB.createQuery( + databaseId: '', + collectionId: '', + queries: [], // optional + transactionId: '', // optional + total: false, // optional + ttl: 0, // optional +); +``` diff --git a/docs/examples/documentsdb/update-document.md b/docs/examples/documentsdb/update-document.md index ec752959..3b85281e 100644 --- a/docs/examples/documentsdb/update-document.md +++ b/docs/examples/documentsdb/update-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/documentsdb/upsert-document.md b/docs/examples/documentsdb/upsert-document.md index 61baa69d..fed1ac5a 100644 --- a/docs/examples/documentsdb/upsert-document.md +++ b/docs/examples/documentsdb/upsert-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/graphql/mutation.md b/docs/examples/graphql/mutation.md index e9632b86..e84cad35 100644 --- a/docs/examples/graphql/mutation.md +++ b/docs/examples/graphql/mutation.md @@ -1,6 +1,5 @@ ```dart import 'package:appwrite/appwrite.dart'; -import 'package:appwrite/models.dart' as models; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint @@ -8,7 +7,7 @@ Client client = Client() Graphql graphql = Graphql(client); -models.Any result = await graphql.mutation( +dynamic result = await graphql.mutation( query: { "query": "mutation { accountUpdateName(name: \"Walter\") { name } }" }, diff --git a/docs/examples/graphql/query.md b/docs/examples/graphql/query.md index de938d4a..10a16be0 100644 --- a/docs/examples/graphql/query.md +++ b/docs/examples/graphql/query.md @@ -1,6 +1,5 @@ ```dart import 'package:appwrite/appwrite.dart'; -import 'package:appwrite/models.dart' as models; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint @@ -8,7 +7,7 @@ Client client = Client() Graphql graphql = Graphql(client); -models.Any result = await graphql.query( +dynamic result = await graphql.query( query: { "query": "query { localeGet { ip } }" }, diff --git a/docs/examples/oauth2/logout-post.md b/docs/examples/oauth2/logout-post.md index 3d163784..dc077108 100644 --- a/docs/examples/oauth2/logout-post.md +++ b/docs/examples/oauth2/logout-post.md @@ -7,7 +7,7 @@ Client client = Client() Oauth2 oauth2 = Oauth2(client); -models. result = await oauth2.logoutPost( +await oauth2.logoutPost( idTokenHint: '', // optional logoutHint: '', // optional clientId: '', // optional diff --git a/docs/examples/oauth2/logout.md b/docs/examples/oauth2/logout.md index 3892325e..640642d6 100644 --- a/docs/examples/oauth2/logout.md +++ b/docs/examples/oauth2/logout.md @@ -7,7 +7,7 @@ Client client = Client() Oauth2 oauth2 = Oauth2(client); -models. result = await oauth2.logout( +await oauth2.logout( idTokenHint: '', // optional logoutHint: '', // optional clientId: '', // optional diff --git a/docs/examples/oauth2/revoke.md b/docs/examples/oauth2/revoke.md index 777340f7..a34d5421 100644 --- a/docs/examples/oauth2/revoke.md +++ b/docs/examples/oauth2/revoke.md @@ -7,7 +7,7 @@ Client client = Client() Oauth2 oauth2 = Oauth2(client); -models. result = await oauth2.revoke( +await oauth2.revoke( token: '', tokenTypeHint: 'access_token', // optional clientId: '', // optional diff --git a/docs/examples/presences/update.md b/docs/examples/presences/update.md index ed52a7b0..0fabdf5a 100644 --- a/docs/examples/presences/update.md +++ b/docs/examples/presences/update.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/presences/upsert.md b/docs/examples/presences/upsert.md index 1620ff55..0d17fb12 100644 --- a/docs/examples/presences/upsert.md +++ b/docs/examples/presences/upsert.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/storage/create-file.md b/docs/examples/storage/create-file.md index f7267340..fa7bc9c7 100644 --- a/docs/examples/storage/create-file.md +++ b/docs/examples/storage/create-file.md @@ -1,9 +1,6 @@ ```dart -import 'dart:io'; import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/storage/update-file.md b/docs/examples/storage/update-file.md index fe33f0bf..6ddd4920 100644 --- a/docs/examples/storage/update-file.md +++ b/docs/examples/storage/update-file.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/tablesdb/create-query.md b/docs/examples/tablesdb/create-query.md new file mode 100644 index 00000000..1878b678 --- /dev/null +++ b/docs/examples/tablesdb/create-query.md @@ -0,0 +1,19 @@ +```dart +import 'package:appwrite/appwrite.dart'; +import 'package:appwrite/models.dart' as models; + +Client client = Client() + .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint + .setProject(''); // Your project ID + +TablesDB tablesDB = TablesDB(client); + +models.RowList result = await tablesDB.createQuery( + databaseId: '', + tableId: '', + queries: [], // optional + transactionId: '', // optional + total: false, // optional + ttl: 0, // optional +); +``` diff --git a/docs/examples/tablesdb/create-row.md b/docs/examples/tablesdb/create-row.md index e3b639c7..ff1969bb 100644 --- a/docs/examples/tablesdb/create-row.md +++ b/docs/examples/tablesdb/create-row.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/tablesdb/update-row.md b/docs/examples/tablesdb/update-row.md index 1d42d637..9440e37c 100644 --- a/docs/examples/tablesdb/update-row.md +++ b/docs/examples/tablesdb/update-row.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/tablesdb/upsert-row.md b/docs/examples/tablesdb/upsert-row.md index a9df95fb..e590764a 100644 --- a/docs/examples/tablesdb/upsert-row.md +++ b/docs/examples/tablesdb/upsert-row.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/vectorsdb/create-document.md b/docs/examples/vectorsdb/create-document.md index ecc02176..4a4ce765 100644 --- a/docs/examples/vectorsdb/create-document.md +++ b/docs/examples/vectorsdb/create-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/vectorsdb/update-document.md b/docs/examples/vectorsdb/update-document.md index 0457e855..27e37e8d 100644 --- a/docs/examples/vectorsdb/update-document.md +++ b/docs/examples/vectorsdb/update-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/docs/examples/vectorsdb/upsert-document.md b/docs/examples/vectorsdb/upsert-document.md index de7503fb..e5c7c189 100644 --- a/docs/examples/vectorsdb/upsert-document.md +++ b/docs/examples/vectorsdb/upsert-document.md @@ -1,8 +1,6 @@ ```dart import 'package:appwrite/appwrite.dart'; import 'package:appwrite/models.dart' as models; -import 'package:appwrite/permission.dart'; -import 'package:appwrite/role.dart'; Client client = Client() .setEndpoint('https://.cloud.appwrite.io/v1') // Your API Endpoint diff --git a/lib/query.dart b/lib/query.dart index 33541de0..38e158c0 100644 --- a/lib/query.dart +++ b/lib/query.dart @@ -353,7 +353,7 @@ class Query { static String max(String attribute, [String alias = '']) => Query._('max', attribute, alias.isNotEmpty ? alias : null).toString(); - /// Standard deviation of [attribute], optionally aliased. + /// Population standard deviation of [attribute] (the same as stddevPop), optionally aliased. static String stddev(String attribute, [String alias = '']) => Query._('stddev', attribute, alias.isNotEmpty ? alias : null).toString(); @@ -367,7 +367,7 @@ class Query { Query._('stddevSamp', attribute, alias.isNotEmpty ? alias : null) .toString(); - /// Variance of [attribute], optionally aliased. + /// Population variance of [attribute] (the same as varPop), optionally aliased. static String variance(String attribute, [String alias = '']) => Query._('variance', attribute, alias.isNotEmpty ? alias : null) .toString(); @@ -410,7 +410,7 @@ class Query { static String on(String left, String right, [String operator = '=']) => Query._('on', null, [left, operator, right]).toString(); - /// Inner join. [table] is the joined collection/table ID. + /// Inner join. [table] is the joined collection/table ID; without an alias the server names the join after it, if the ID is a valid alias, and otherwise rejects the query. static String join( String table, Object leftOrAliasOrOn, [ @@ -420,7 +420,7 @@ class Query { ]) => Query._createJoin('join', table, leftOrAliasOrOn, rightOrOn, operator, alias); - /// Left join. [table] is the joined collection/table ID. + /// Left join. [table] is the joined collection/table ID; without an alias the server names the join after it, if the ID is a valid alias, and otherwise rejects the query. static String leftJoin( String table, Object leftOrAliasOrOn, [ @@ -430,7 +430,7 @@ class Query { ]) => Query._createJoin('leftJoin', table, leftOrAliasOrOn, rightOrOn, operator, alias); - /// Right join. [table] is the joined collection/table ID. + /// Right join. [table] is the joined collection/table ID; without an alias the server names the join after it, if the ID is a valid alias, and otherwise rejects the query. static String rightJoin( String table, Object leftOrAliasOrOn, [ @@ -440,7 +440,7 @@ class Query { ]) => Query._createJoin('rightJoin', table, leftOrAliasOrOn, rightOrOn, operator, alias); - /// Full outer join. [table] is the joined collection/table ID. + /// Full outer join. [table] is the joined collection/table ID; without an alias the server names the join after it, if the ID is a valid alias, and otherwise rejects the query. static String fullOuterJoin( String table, Object leftOrAliasOrOn, [ @@ -450,7 +450,7 @@ class Query { ]) => Query._createJoin('fullOuterJoin', table, leftOrAliasOrOn, rightOrOn, operator, alias); - /// Cross join. [table] is the joined collection/table ID. + /// Cross join. [table] is the joined collection/table ID; without an alias the server names the join after it, if the ID is a valid alias, and otherwise rejects the query. static String crossJoin(String table, [String alias = '']) => Query._('crossJoin', table, alias.isNotEmpty ? alias : null).toString(); diff --git a/lib/services/account.dart b/lib/services/account.dart index d805b833..3e6de0d8 100644 --- a/lib/services/account.dart +++ b/lib/services/account.dart @@ -415,6 +415,33 @@ class Account extends Service { return models.Jwt.fromMap(res.data); } + /// Get the team memberships of the currently logged in user. + Future listMemberships({ + List? queries, + bool? total, + }) async { + final String apiPath = '/account/memberships'; + + final Map apiParams = { + if (queries != null) 'queries': queries, + if (total != null) 'total': total, + }; + + final Map apiHeaders = { + 'X-Appwrite-Project': client.config['project'] ?? '', + 'accept': 'application/json', + }; + + final res = await client.call( + HttpMethod.get, + path: apiPath, + params: apiParams, + headers: apiHeaders, + ); + + return models.MembershipList.fromMap(res.data); + } + /// Enable or disable MFA on an account. Future updateMFA({ required bool mfa, @@ -1348,6 +1375,14 @@ class Account extends Service { /// Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) /// the only valid redirect URLs are the ones from domains you have set when /// adding your platforms in the console interface. + /// + /// The new password must satisfy the project's enabled password policies, + /// including custom deny lists. Dictionary entries match the entire password + /// case-sensitively; personal-data terms match substrings case-insensitively. + /// Personal-data validation runs after token verification against the + /// recovered user's ID, name, email, and phone, closing the previous recovery + /// gap for profile-based checks. A rejected password leaves the existing + /// credentials unchanged and the recovery token usable. Future updateRecovery({ required String userId, required String secret, @@ -1423,6 +1458,14 @@ class Account extends Service { /// Pass the **userId** of the user along with the **secret** code from the /// email and the new **password** to set. If confirmed, this route will return /// a 200 status code, the code is consumed and the user's password is updated. + /// + /// The new password must satisfy the project's enabled password policies, + /// including custom deny lists. Dictionary entries match the entire password + /// case-sensitively; personal-data terms match substrings case-insensitively. + /// Personal-data validation runs after token verification against the + /// recovered user's ID, name, email, and phone, closing the previous recovery + /// gap for profile-based checks. A rejected password leaves the existing + /// credentials unchanged and the recovery token usable. Future updateRecoveryOTP({ required String userId, required String secret, @@ -1946,6 +1989,8 @@ class Account extends Service { required String targetId, required String identifier, String? providerId, + String? bundleId, + String? environment, }) async { final String apiPath = '/account/targets/push'; @@ -1953,6 +1998,8 @@ class Account extends Service { 'targetId': targetId, 'identifier': identifier, if (providerId != null) 'providerId': providerId, + if (bundleId != null) 'bundleId': bundleId, + if (environment != null) 'environment': environment, }; final Map apiHeaders = { @@ -1979,6 +2026,8 @@ class Account extends Service { Future updatePushTarget({ required String targetId, required String identifier, + String? bundleId, + String? environment, }) async { if (targetId.isEmpty) { throw AppwriteException( @@ -1993,6 +2042,8 @@ class Account extends Service { final Map apiParams = { 'identifier': identifier, + if (bundleId != null) 'bundleId': bundleId, + if (environment != null) 'environment': environment, }; final Map apiHeaders = { diff --git a/lib/services/databases.dart b/lib/services/databases.dart index 96fed789..11959bf9 100644 --- a/lib/services/databases.dart +++ b/lib/services/databases.dart @@ -219,6 +219,15 @@ class Databases extends Service { /// Get a list of all the user's documents in a given collection. You can use /// the query params to filter your results. + /// + /// Documents returned by aggregate, groupBy or distinct queries hold only the + /// attributes they select, group or aggregate, typed as a document types them, + /// with a joined attribute named by its join alias (`alias.attribute`). The + /// response omits their `$id`, `$sequence`, `$createdAt`, `$updatedAt`, + /// `$permissions`, `$databaseId` and `$collectionId` unless they select or + /// group it, and those of a right or full join document that no document of + /// this collection matched. SDK document models fill omitted system attributes + /// with empty values. @Deprecated( 'This API has been deprecated since 1.8.0. Please use `TablesDB.listRows` instead.', ) @@ -336,6 +345,67 @@ class Databases extends Service { return models.Document.fromMap(res.data); } + /// Get a list of all the user's documents in a given collection using a POST + /// request. This behaves identically to the list documents endpoint but + /// accepts the queries in the request body, allowing much larger `queries` + /// arrays than can fit in a URL query string. + @Deprecated( + 'This API has been deprecated since 1.8.0. Please use `TablesDB.createQuery` instead.', + ) + Future createQuery({ + required String databaseId, + required String collectionId, + List? queries, + String? transactionId, + bool? total, + int? ttl, + }) async { + if (databaseId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "databaseId"', + ); + } + + if (collectionId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "collectionId"', + ); + } + + final String apiPath = + '/databases/{databaseId}/collections/{collectionId}/documents/query' + .replaceAll( + '{databaseId}', + databaseId, + ) + .replaceAll( + '{collectionId}', + collectionId, + ); + + final Map apiParams = { + if (queries != null) 'queries': queries, + if (transactionId != null) 'transactionId': transactionId, + if (total != null) 'total': total, + if (ttl != null) 'ttl': ttl, + }; + + final Map apiHeaders = { + 'X-Appwrite-Project': client.config['project'] ?? '', + 'content-type': 'application/json', + 'accept': 'application/json', + }; + + final res = await client.call( + HttpMethod.post, + path: apiPath, + params: apiParams, + headers: apiHeaders, + ); + + return models.DocumentList.fromMap(res.data); + } + /// Get a document by its unique ID. This endpoint response returns a JSON /// object with the document data. @Deprecated( diff --git a/lib/services/documents_db.dart b/lib/services/documents_db.dart index 1d04aa9c..93ef8712 100644 --- a/lib/services/documents_db.dart +++ b/lib/services/documents_db.dart @@ -367,6 +367,64 @@ class DocumentsDB extends Service { return models.DocumentList.fromMap(res.data); } + /// Get a list of all the user's documents in a given collection using a POST + /// request. This behaves identically to the list documents endpoint but + /// accepts the queries in the request body, allowing much larger `queries` + /// arrays than can fit in a URL query string. + Future createQuery({ + required String databaseId, + required String collectionId, + List? queries, + String? transactionId, + bool? total, + int? ttl, + }) async { + if (databaseId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "databaseId"', + ); + } + + if (collectionId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "collectionId"', + ); + } + + final String apiPath = + '/documentsdb/{databaseId}/collections/{collectionId}/documents/query' + .replaceAll( + '{databaseId}', + databaseId, + ) + .replaceAll( + '{collectionId}', + collectionId, + ); + + final Map apiParams = { + if (queries != null) 'queries': queries, + if (transactionId != null) 'transactionId': transactionId, + if (total != null) 'total': total, + if (ttl != null) 'ttl': ttl, + }; + + final Map apiHeaders = { + 'X-Appwrite-Project': client.config['project'] ?? '', + 'content-type': 'application/json', + 'accept': 'application/json', + }; + + final res = await client.call( + HttpMethod.post, + path: apiPath, + params: apiParams, + headers: apiHeaders, + ); + + return models.DocumentList.fromMap(res.data); + } + /// Get a document by its unique ID. This endpoint response returns a JSON /// object with the document data. Future getDocument({ diff --git a/lib/services/tables_db.dart b/lib/services/tables_db.dart index e7a5d4a3..3ad93e30 100644 --- a/lib/services/tables_db.dart +++ b/lib/services/tables_db.dart @@ -201,6 +201,14 @@ class TablesDB extends Service { /// Get a list of all the user's rows in a given table. You can use the query /// params to filter your results. + /// + /// Rows returned by aggregate, groupBy or distinct queries hold only the + /// columns they select, group or aggregate, typed as a row types them, with a + /// joined column named by its join alias (`alias.column`). The response omits + /// their `$id`, `$sequence`, `$createdAt`, `$updatedAt`, `$permissions`, + /// `$databaseId` and `$tableId` unless they select or group it, and those of a + /// right or full join row that no row of this table matched. SDK row models + /// fill omitted system columns with empty values. Future listRows({ required String databaseId, required String tableId, @@ -310,6 +318,63 @@ class TablesDB extends Service { return models.Row.fromMap(res.data); } + /// Get a list of all the user's rows in a given table using a POST request. + /// This behaves identically to the list rows endpoint but accepts the queries + /// in the request body, allowing much larger `queries` arrays than can fit in + /// a URL query string. + Future createQuery({ + required String databaseId, + required String tableId, + List? queries, + String? transactionId, + bool? total, + int? ttl, + }) async { + if (databaseId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "databaseId"', + ); + } + + if (tableId.isEmpty) { + throw AppwriteException( + 'Missing required parameter: "tableId"', + ); + } + + final String apiPath = '/tablesdb/{databaseId}/tables/{tableId}/rows/query' + .replaceAll( + '{databaseId}', + databaseId, + ) + .replaceAll( + '{tableId}', + tableId, + ); + + final Map apiParams = { + if (queries != null) 'queries': queries, + if (transactionId != null) 'transactionId': transactionId, + if (total != null) 'total': total, + if (ttl != null) 'ttl': ttl, + }; + + final Map apiHeaders = { + 'X-Appwrite-Project': client.config['project'] ?? '', + 'content-type': 'application/json', + 'accept': 'application/json', + }; + + final res = await client.call( + HttpMethod.post, + path: apiPath, + params: apiParams, + headers: apiHeaders, + ); + + return models.RowList.fromMap(res.data); + } + /// Get a row by its unique ID. This endpoint response returns a JSON object /// with the row data. Future getRow({ diff --git a/lib/src/client_browser.dart b/lib/src/client_browser.dart index 7488458c..ab689f04 100644 --- a/lib/src/client_browser.dart +++ b/lib/src/client_browser.dart @@ -40,7 +40,7 @@ class ClientBrowser extends ClientBase with ClientMixin { 'x-sdk-name': 'Flutter', 'x-sdk-platform': 'client', 'x-sdk-language': 'flutter', - 'x-sdk-version': '28.0.0', + 'x-sdk-version': '28.1.0', 'X-Appwrite-Response-Format': '2.5.0', }; diff --git a/lib/src/client_io.dart b/lib/src/client_io.dart index af5ed1f3..5d91c62c 100644 --- a/lib/src/client_io.dart +++ b/lib/src/client_io.dart @@ -59,7 +59,7 @@ class ClientIO extends ClientBase with ClientMixin { 'x-sdk-name': 'Flutter', 'x-sdk-platform': 'client', 'x-sdk-language': 'flutter', - 'x-sdk-version': '28.0.0', + 'x-sdk-version': '28.1.0', 'X-Appwrite-Response-Format': '2.5.0', }; @@ -261,6 +261,15 @@ class ClientIO extends ClientBase with ClientMixin { _initProgress = false; } + Future _ready() async { + while (!_initialized && _initProgress) { + await Future.delayed(Duration(milliseconds: 10)); + } + if (!_initialized) { + await init(); + } + } + Future _interceptRequest(http.BaseRequest request) async { final body = (request is http.Request) ? request.body : ''; for (final i in _interceptors) { @@ -499,59 +508,116 @@ class ClientIO extends ClientBase with ClientMixin { return finalResponse ?? lastResponse; } - bool get _customSchemeAllowed => Platform.isWindows || Platform.isLinux; + bool get _loopbackCallback => + defaultTargetPlatform == TargetPlatform.windows || + defaultTargetPlatform == TargetPlatform.linux; @override - Future webAuth(Uri url, {String? callbackUrlScheme}) { - return FlutterWebAuth2.authenticate( - url: url.toString(), - callbackUrlScheme: callbackUrlScheme != null && _customSchemeAllowed - ? callbackUrlScheme - : "appwrite-callback-${config['project']!}", - options: const FlutterWebAuth2Options( - useWebview: false, + Future webAuth(Uri url, {String? callbackUrlScheme}) async { + if (!_loopbackCallback) { + return _saveSession( + await _authenticate( + url, + "appwrite-callback-${config['project']!}", + ), + ); + } + + final callback = callbackUrlScheme ?? await _loopbackUrl(); + final exchange = url.path.contains(_sessionOAuth2Path); + final result = await _authenticate( + url.replace( + path: exchange + ? url.path.replaceFirst(_sessionOAuth2Path, _tokenOAuth2Path) + : url.path, + queryParameters: { + ...url.queryParametersAll, + 'success': [callback], + 'failure': [callback], + }, ), - ).then((value) async { - Uri url = Uri.parse(value); - final key = url.queryParameters['key']; - final secret = url.queryParameters['secret']; - if (key == null || secret == null) { - final error = url.queryParameters['error']; - if (error != null && error.isNotEmpty) { - try { - final parsed = jsonDecode(error); - if (parsed is Map) { - final codeValue = parsed['code']; - final int? code = codeValue is int - ? codeValue - : int.tryParse('${codeValue ?? ''}'); - throw AppwriteException( - parsed['message']?.toString() ?? error, - code, - parsed['type']?.toString(), - error, - ); - } - } on AppwriteException { - rethrow; - } catch (_) { - // Fall through to a plain-string error when JSON is malformed. - } - throw AppwriteException(error); + callback, + ); + if (!exchange) { + return _saveSession(result); + } + + final userId = result.queryParameters['userId']; + final secret = result.queryParameters['secret']; + if (userId == null || secret == null) { + _throwCallbackError(result); + } + await call( + HttpMethod.post, + path: _tokenSessionPath, + params: {'userId': userId, 'secret': secret}, + ); + } + + static const String _sessionOAuth2Path = '/account/sessions/oauth2/'; + static const String _tokenOAuth2Path = '/account/tokens/oauth2/'; + static const String _tokenSessionPath = '/account/sessions/token'; + + Future _loopbackUrl() async { + final socket = await ServerSocket.bind(InternetAddress.loopbackIPv4, 0); + final port = socket.port; + await socket.close(); + return 'http://localhost:$port/'; + } + + Future _authenticate(Uri url, String callbackUrlScheme) async { + return Uri.parse( + await FlutterWebAuth2.authenticate( + url: url.toString(), + callbackUrlScheme: callbackUrlScheme, + options: const FlutterWebAuth2Options(useWebview: false), + ), + ); + } + + Future _saveSession(Uri url) async { + final key = url.queryParameters['key']; + final secret = url.queryParameters['secret']; + if (key == null || secret == null) { + _throwCallbackError(url); + } + Cookie cookie = Cookie(key, secret); + cookie.domain = Uri.parse(_endPoint).host; + cookie.httpOnly = true; + cookie.path = '/'; + List cookies = [cookie]; + await _ready(); + await _cookieJar.saveFromResponse(Uri.parse(_endPoint), cookies); + } + + Never _throwCallbackError(Uri url) { + final error = url.queryParameters['error']; + if (error != null && error.isNotEmpty) { + try { + final parsed = jsonDecode(error); + if (parsed is Map) { + final codeValue = parsed['code']; + final int? code = codeValue is int + ? codeValue + : int.tryParse('${codeValue ?? ''}'); + throw AppwriteException( + parsed['message']?.toString() ?? error, + code, + parsed['type']?.toString(), + error, + ); } - throw AppwriteException( - "Invalid OAuth2 Response. Key and Secret not available.", - 500, - ); + } on AppwriteException { + rethrow; + } catch (_) { + // Fall through to a plain-string error when JSON is malformed. } - Cookie cookie = Cookie(key, secret); - cookie.domain = Uri.parse(_endPoint).host; - cookie.httpOnly = true; - cookie.path = '/'; - List cookies = [cookie]; - await init(); - _cookieJar.saveFromResponse(Uri.parse(_endPoint), cookies); - }); + throw AppwriteException(error); + } + throw AppwriteException( + "Invalid OAuth2 Response. Key and Secret not available.", + 500, + ); } @override @@ -562,12 +628,7 @@ class ClientIO extends ClientBase with ClientMixin { Map params = const {}, ResponseType? responseType, }) async { - while (!_initialized && _initProgress) { - await Future.delayed(Duration(milliseconds: 10)); - } - if (!_initialized) { - await init(); - } + await _ready(); late http.Response res; http.BaseRequest request = prepareRequest( diff --git a/pubspec.yaml b/pubspec.yaml index 08a46375..2147f32e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: appwrite -version: 28.0.0 +version: 28.1.0 description: Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API homepage: https://appwrite.io repository: https://github.com/appwrite/sdk-for-flutter diff --git a/test/query_test.dart b/test/query_test.dart index fad7f352..6ab76a8c 100644 --- a/test/query_test.dart +++ b/test/query_test.dart @@ -511,6 +511,23 @@ void main() { expect(query['values'], ['ord']); }); + test('returns nested join without alias, leaving the alias to the server', + () { + final query = + jsonDecode(Query.join('orders', [Query.on('\$id', 'customerId')])); + expect(query['method'], 'join'); + expect(query['attribute'], 'orders'); + expect(query['values'].length, 1); + expect(query['values'][0]['method'], 'on'); + }); + + test('returns crossJoin without alias, leaving the alias to the server', () { + final query = jsonDecode(Query.crossJoin('orders')); + expect(query['method'], 'crossJoin'); + expect(query['attribute'], 'orders'); + expect(query['values'] ?? [], isEmpty); + }); + test('returns vectorDot', () { final query = jsonDecode(Query.vectorDot('embedding', [0.1, 0.2])); expect(query['method'], 'vectorDot'); diff --git a/test/services/account_test.dart b/test/services/account_test.dart index a904822d..3a712b73 100644 --- a/test/services/account_test.dart +++ b/test/services/account_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -88,10 +94,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.get(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/account", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -116,7 +138,13 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.create( @@ -124,6 +152,16 @@ void main() { email: "email@example.com", password: "password", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["userId", "email", "password"])); expect(response, isA()); }); @@ -134,10 +172,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.listConsents(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/account/consents", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -157,12 +211,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.getConsent( consentId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/account/consents/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -170,12 +240,28 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.deleteConsent( consentId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/account/consents/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method listConsentTokens()', () async { @@ -185,12 +271,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.listConsentTokens( consentId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/account/consents//tokens", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -211,13 +313,29 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.getConsentToken( consentId: "", tokenId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/account/consents//tokens/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -225,13 +343,29 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.deleteConsentToken( consentId: "", tokenId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/account/consents//tokens/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method updateEmail()', () async { @@ -255,13 +389,29 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateEmail( email: "email@example.com", password: "password", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/account/email", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["email", "password"])); expect(response, isA()); }); @@ -272,10 +422,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.listIdentities(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/account/identities", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -283,12 +449,28 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.deleteIdentity( identityId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/account/identities/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method createJWT()', () async { @@ -298,13 +480,59 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createJWT(); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/jwts", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); + test('test method listMemberships()', () async { + final Map data = { + 'total': 5, + 'memberships': [], + }; + + when( + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).thenAnswer((_) async => Response(data: data)); + + final response = await account.listMemberships(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/account/memberships", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); + expect(response, isA()); + }); + test('test method updateMFA()', () async { final Map data = { '\$id': "5e5ea5c16897e", @@ -326,12 +554,28 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateMFA( mfa: true, ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/account/mfa", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["mfa"])); expect(response, isA()); }); @@ -343,12 +587,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createMfaAuthenticator( type: enums.AuthenticatorType.totp, ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/mfa/authenticators/totp", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -360,12 +620,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createMFAAuthenticator( type: enums.AuthenticatorType.totp, ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/mfa/authenticators/totp", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -390,13 +666,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateMfaAuthenticator( type: enums.AuthenticatorType.totp, otp: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/account/mfa/authenticators/totp", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["otp"])); expect(response, isA()); }); @@ -421,13 +713,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateMFAAuthenticator( type: enums.AuthenticatorType.totp, otp: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/account/mfa/authenticators/totp", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["otp"])); expect(response, isA()); }); @@ -435,24 +743,56 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.deleteMfaAuthenticator( type: enums.AuthenticatorType.totp, ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/account/mfa/authenticators/totp", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method deleteMFAAuthenticator()', () async { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.deleteMFAAuthenticator( type: enums.AuthenticatorType.totp, ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/account/mfa/authenticators/totp", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method createMfaChallenge()', () async { @@ -464,12 +804,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createMfaChallenge( factor: enums.AuthenticationFactor.email, ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/mfa/challenges", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["factor"])); expect(response, isA()); }); @@ -482,12 +838,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createMFAChallenge( factor: enums.AuthenticationFactor.email, ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/mfa/challenges", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["factor"])); expect(response, isA()); }); @@ -525,13 +897,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateMfaChallenge( challengeId: "", otp: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/account/mfa/challenges", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["challengeId", "otp"])); expect(response, isA()); }); @@ -569,13 +957,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateMFAChallenge( challengeId: "", otp: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/account/mfa/challenges", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["challengeId", "otp"])); expect(response, isA()); }); @@ -589,10 +993,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.listMfaFactors(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/account/mfa/factors", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -606,10 +1026,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.listMFAFactors(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/account/mfa/factors", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -619,10 +1055,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.getMfaRecoveryCodes(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/account/mfa/recovery-codes", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -632,10 +1084,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.getMFARecoveryCodes(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/account/mfa/recovery-codes", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -645,10 +1113,26 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createMfaRecoveryCodes(); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/mfa/recovery-codes", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -658,10 +1142,26 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createMFARecoveryCodes(); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/mfa/recovery-codes", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -671,10 +1171,26 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateMfaRecoveryCodes(); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/account/mfa/recovery-codes", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -684,10 +1200,26 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateMFARecoveryCodes(); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/account/mfa/recovery-codes", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -712,12 +1244,28 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateName( name: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/account/name", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["name"])); expect(response, isA()); }); @@ -728,10 +1276,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.listPasskeys(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/account/passkeys", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -745,10 +1309,26 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createPasskey(); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/passkeys", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -762,12 +1342,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.getPasskey( passkeyId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/account/passkeys/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -781,13 +1377,29 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updatePasskey( passkeyId: "", name: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/account/passkeys/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["name"])); expect(response, isA()); }); @@ -795,12 +1407,28 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.deletePasskey( passkeyId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/account/passkeys/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method updatePasskeyVerification()', () async { @@ -813,13 +1441,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updatePasskeyVerification( passkeyId: "", credential: {}, ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/account/passkeys//verification", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["credential"])); expect(response, isA()); }); @@ -844,12 +1488,28 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updatePassword( password: "password", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/account/password", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["password"])); expect(response, isA()); }); @@ -874,13 +1534,29 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updatePhone( phone: "+12065550100", password: "password", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/account/phone", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["phone", "password"])); expect(response, isA()); }); @@ -888,10 +1564,26 @@ void main() { final Map data = {}; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.getPrefs(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/account/prefs", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -916,12 +1608,28 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updatePrefs( prefs: {}, ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/account/prefs", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["prefs"])); expect(response, isA()); }); @@ -936,13 +1644,29 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createRecovery( email: "email@example.com", url: "https://example.com", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/recovery", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["email", "url"])); expect(response, isA()); }); @@ -957,7 +1681,13 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateRecovery( @@ -965,6 +1695,16 @@ void main() { secret: "", password: "password", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/account/recovery", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["userId", "secret", "password"])); expect(response, isA()); }); @@ -979,12 +1719,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createRecoveryOTP( email: "email@example.com", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/recovery/otp", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["email"])); expect(response, isA()); }); @@ -999,7 +1755,13 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateRecoveryOTP( @@ -1007,6 +1769,16 @@ void main() { secret: "", password: "password", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/account/recovery/otp", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["userId", "secret", "password"])); expect(response, isA()); }); @@ -1017,10 +1789,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.listSessions(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/account/sessions", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -1028,10 +1816,26 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.deleteSessions(); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/account/sessions", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method createAnonymousSession()', () async { @@ -1068,10 +1872,26 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createAnonymousSession(); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/sessions/anonymous", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -1109,13 +1929,29 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createEmailPasswordSession( email: "email@example.com", password: "password", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/sessions/email", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["email", "password"])); expect(response, isA()); }); @@ -1153,13 +1989,29 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createIdTokenSession( provider: enums.IdTokenProvider.apple, idToken: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/sessions/id-token", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["provider", "idToken"])); expect(response, isA()); }); @@ -1197,13 +2049,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateMagicURLSession( userId: "", secret: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/account/sessions/magic-url", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["userId", "secret"])); expect(response, isA()); }); @@ -1215,6 +2083,8 @@ void main() { final response = await account.createOAuth2Session( provider: enums.OAuthProvider.amazon, ); + final Uri url = verify(client.webAuth(captureAny)).captured.single; + expect(Uri.decodeFull(url.path), "/v1/account/sessions/oauth2/amazon"); expect(response, equals('done')); }); @@ -1252,13 +2122,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updatePhoneSession( userId: "", secret: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/account/sessions/phone", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["userId", "secret"])); expect(response, isA()); }); @@ -1296,13 +2182,29 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createSession( userId: "", secret: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/sessions/token", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["userId", "secret"])); expect(response, isA()); }); @@ -1340,12 +2242,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.getSession( sessionId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/account/sessions/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -1383,12 +2301,28 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateSession( sessionId: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/account/sessions/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -1396,12 +2330,28 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.deleteSession( sessionId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/account/sessions/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method updateStatus()', () async { @@ -1425,10 +2375,26 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateStatus(); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/account/status", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -1445,13 +2411,29 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createPushTarget( targetId: "", identifier: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/targets/push", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["targetId", "identifier"])); expect(response, isA()); }); @@ -1468,13 +2450,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updatePushTarget( targetId: "", identifier: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/account/targets//push", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["identifier"])); expect(response, isA()); }); @@ -1482,12 +2480,28 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.deletePushTarget( targetId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/account/targets//push", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method createEmailToken()', () async { @@ -1501,13 +2515,29 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createEmailToken( userId: "", email: "email@example.com", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/tokens/email", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["userId", "email"])); expect(response, isA()); }); @@ -1522,13 +2552,29 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createMagicURLToken( userId: "", email: "email@example.com", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/tokens/magic-url", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["userId", "email"])); expect(response, isA()); }); @@ -1540,6 +2586,8 @@ void main() { final response = await account.createOAuth2Token( provider: enums.OAuthProvider.amazon, ); + final Uri url = verify(client.webAuth(captureAny)).captured.single; + expect(Uri.decodeFull(url.path), "/v1/account/tokens/oauth2/amazon"); expect(response, equals('done')); }); @@ -1553,10 +2601,26 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createPasskeyToken(); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/tokens/passkey", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -1571,13 +2635,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updatePasskeyToken( challengeId: "", credential: {}, ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/account/tokens/passkey", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["challengeId", "credential"])); expect(response, isA()); }); @@ -1592,13 +2672,29 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createPhoneToken( userId: "", phone: "+12065550100", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/tokens/phone", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["userId", "phone"])); expect(response, isA()); }); @@ -1613,12 +2709,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createEmailVerification( url: "https://example.com", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/verifications/email", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["url"])); expect(response, isA()); }); @@ -1633,12 +2745,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createVerification( url: "https://example.com", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/verifications/email", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["url"])); expect(response, isA()); }); @@ -1653,13 +2781,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateEmailVerification( userId: "", secret: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/account/verifications/email", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["userId", "secret"])); expect(response, isA()); }); @@ -1674,13 +2818,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateVerification( userId: "", secret: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/account/verifications/email", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["userId", "secret"])); expect(response, isA()); }); @@ -1695,10 +2855,26 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createEmailVerificationOTP(); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/verifications/email/otp", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -1713,13 +2889,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updateEmailVerificationOTP( userId: "", secret: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/account/verifications/email/otp", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["userId", "secret"])); expect(response, isA()); }); @@ -1734,10 +2926,26 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.createPhoneVerification(); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/account/verifications/phone", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -1752,13 +2960,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await account.updatePhoneVerification( userId: "", secret: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/account/verifications/phone", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["userId", "secret"])); expect(response, isA()); }); }); diff --git a/test/services/analytics_test.dart b/test/services/analytics_test.dart index d94506aa..559e6e1b 100644 --- a/test/services/analytics_test.dart +++ b/test/services/analytics_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -71,7 +77,13 @@ void main() { final data = ''; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await analytics.createEvent( @@ -79,6 +91,16 @@ void main() { name: "", url: "https://example.com", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/analytics/properties//events", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["name", "url"])); }); }); } diff --git a/test/services/apps_test.dart b/test/services/apps_test.dart index a60f0d67..f5d6e730 100644 --- a/test/services/apps_test.dart +++ b/test/services/apps_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -74,10 +80,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.list(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/apps", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -112,7 +134,13 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.create( @@ -120,6 +148,16 @@ void main() { name: "", redirectUris: [], ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/apps", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["appId", "name", "redirectUris"])); expect(response, isA()); }); @@ -130,10 +168,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.listInstallationScopes(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/apps/scopes/installations", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -144,10 +198,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.listOAuth2Scopes(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/apps/scopes/oauth2", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -182,12 +252,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.get( appId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/apps/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -222,13 +308,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.update( appId: "", name: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/apps/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["name"])); expect(response, isA()); }); @@ -236,12 +338,28 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.delete( appId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/apps/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method listInstallations()', () async { @@ -251,12 +369,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.listInstallations( appId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/apps//installations", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -274,13 +408,29 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.getInstallation( appId: "", installationId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/apps//installations/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -288,13 +438,29 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.deleteInstallation( appId: "", installationId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/apps//installations/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method createInstallationToken()', () async { @@ -307,13 +473,29 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.createInstallationToken( appId: "", installationId: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/apps//installations//tokens", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -324,12 +506,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.listKeys( appId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/apps//keys", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -347,12 +545,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.createKey( appId: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/apps//keys", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -370,13 +584,29 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.getKey( appId: "", keyId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/apps//keys/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -384,13 +614,29 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.deleteKey( appId: "", keyId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/apps//keys/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method listSecrets()', () async { @@ -400,12 +646,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.listSecrets( appId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/apps//secrets", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -423,12 +685,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.createSecret( appId: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/apps//secrets", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -445,13 +723,29 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.getSecret( appId: "", secretId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/apps//secrets/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -459,13 +753,29 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.deleteSecret( appId: "", secretId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/apps//secrets/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method updateTeam()', () async { @@ -499,13 +809,29 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.updateTeam( appId: "", teamId: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/apps//team", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["teamId"])); expect(response, isA()); }); @@ -513,12 +839,28 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await apps.deleteTokens( appId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/apps//tokens", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); }); } diff --git a/test/services/avatars_test.dart b/test/services/avatars_test.dart index 18c4d03d..16f91365 100644 --- a/test/services/avatars_test.dart +++ b/test/services/avatars_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -71,12 +77,28 @@ void main() { final Uint8List data = Uint8List.fromList([]); when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await avatars.getBrowser( code: enums.Browser.avantBrowser, ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/avatars/browsers/aa", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -84,12 +106,28 @@ void main() { final Uint8List data = Uint8List.fromList([]); when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await avatars.getCreditCard( code: enums.CreditCard.americanExpress, ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/avatars/credit-cards/amex", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -97,12 +135,28 @@ void main() { final Uint8List data = Uint8List.fromList([]); when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await avatars.getFavicon( url: "https://example.com", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/avatars/favicon", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["url"])); expect(response, isA()); }); @@ -110,12 +164,28 @@ void main() { final Uint8List data = Uint8List.fromList([]); when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await avatars.getFlag( code: enums.Flag.afghanistan, ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/avatars/flags/af", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -123,12 +193,28 @@ void main() { final Uint8List data = Uint8List.fromList([]); when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await avatars.getImage( url: "https://example.com", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/avatars/image", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["url"])); expect(response, isA()); }); @@ -136,10 +222,26 @@ void main() { final Uint8List data = Uint8List.fromList([]); when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await avatars.getInitials(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/avatars/initials", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -147,10 +249,26 @@ void main() { final Uint8List data = Uint8List.fromList([]); when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await avatars.getPhoto(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/avatars/photo", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -176,17 +294,29 @@ void main() { when( client.chunkedUpload( - path: argThat(isNotNull), - params: argThat(isNotNull), - paramName: argThat(isNotNull), - idParamName: argThat(isNotNull), - headers: argThat(isNotNull), + path: anyNamed('path'), + params: anyNamed('params'), + paramName: anyNamed('paramName'), + idParamName: anyNamed('idParamName'), + headers: anyNamed('headers'), + method: anyNamed('method'), ), ).thenAnswer((_) async => Response(data: data)); final response = await avatars.updatePhoto( file: InputFile.fromPath(path: './image.png'), ); + final Map params = verify( + client.chunkedUpload( + path: "/avatars/photo", + params: captureAnyNamed('params'), + paramName: anyNamed('paramName'), + idParamName: anyNamed('idParamName'), + headers: anyNamed('headers'), + method: HttpMethod.put, + ), + ).captured.single; + expect(params.keys, unorderedEquals(["file"])); expect(response, isA()); }); @@ -194,22 +324,54 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await avatars.deletePhoto(); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/avatars/photo", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method getQR()', () async { final Uint8List data = Uint8List.fromList([]); when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await avatars.getQR( text: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/avatars/qr", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["text"])); expect(response, isA()); }); @@ -217,12 +379,28 @@ void main() { final Uint8List data = Uint8List.fromList([]); when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await avatars.getScreenshot( url: "https://example.com", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/avatars/screenshots", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["url"])); expect(response, isA()); }); }); diff --git a/test/services/databases_test.dart b/test/services/databases_test.dart index eb03954a..f341f304 100644 --- a/test/services/databases_test.dart +++ b/test/services/databases_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -74,10 +80,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await databases.listTransactions(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/databases/transactions", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -92,10 +114,26 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await databases.createTransaction(); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/databases/transactions", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -110,12 +148,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await databases.getTransaction( transactionId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/databases/transactions/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -130,12 +184,28 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await databases.updateTransaction( transactionId: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/databases/transactions/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -143,12 +213,28 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await databases.deleteTransaction( transactionId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/databases/transactions/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method createOperations()', () async { @@ -162,12 +248,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await databases.createOperations( transactionId: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/databases/transactions//operations", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -178,13 +280,29 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await databases.listDocuments( databaseId: "", collectionId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/databases//collections//documents", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -200,7 +318,13 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await databases.createDocument( @@ -209,9 +333,52 @@ void main() { documentId: "", data: {}, ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/databases//collections//documents", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["documentId", "data"])); expect(response, isA()); }); + test('test method createQuery()', () async { + final Map data = { + 'total': 5, + 'documents': [], + }; + + when( + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).thenAnswer((_) async => Response(data: data)); + + final response = await databases.createQuery( + databaseId: "", + collectionId: "", + ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/databases//collections//documents/query", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); + expect(response, isA()); + }); + test('test method getDocument()', () async { final Map data = { '\$id': "5e5ea5c16897e", @@ -224,7 +391,13 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await databases.getDocument( @@ -232,6 +405,16 @@ void main() { collectionId: "", documentId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/databases//collections//documents/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -247,7 +430,13 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await databases.upsertDocument( @@ -255,6 +444,16 @@ void main() { collectionId: "", documentId: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/databases//collections//documents/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -270,7 +469,13 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await databases.updateDocument( @@ -278,6 +483,16 @@ void main() { collectionId: "", documentId: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/databases//collections//documents/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -285,7 +500,13 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await databases.deleteDocument( @@ -293,6 +514,16 @@ void main() { collectionId: "", documentId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/databases//collections//documents/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method decrementDocumentAttribute()', () async { @@ -307,7 +538,13 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await databases.decrementDocumentAttribute( @@ -316,6 +553,16 @@ void main() { documentId: "", attribute: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/databases//collections//documents///decrement", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -331,7 +578,13 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await databases.incrementDocumentAttribute( @@ -340,6 +593,16 @@ void main() { documentId: "", attribute: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/databases//collections//documents///increment", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); }); diff --git a/test/services/documents_db_test.dart b/test/services/documents_db_test.dart index 4312cced..e6cd7d0b 100644 --- a/test/services/documents_db_test.dart +++ b/test/services/documents_db_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -74,10 +80,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await documentsDB.listTransactions(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/documentsdb/transactions", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -92,10 +114,26 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await documentsDB.createTransaction(); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/documentsdb/transactions", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -110,12 +148,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await documentsDB.getTransaction( transactionId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/documentsdb/transactions/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -130,12 +184,28 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await documentsDB.updateTransaction( transactionId: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/documentsdb/transactions/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -143,12 +213,28 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await documentsDB.deleteTransaction( transactionId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/documentsdb/transactions/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method createOperations()', () async { @@ -162,12 +248,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await documentsDB.createOperations( transactionId: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/documentsdb/transactions//operations", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -178,13 +280,29 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await documentsDB.listDocuments( databaseId: "", collectionId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/documentsdb//collections//documents", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -200,7 +318,13 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await documentsDB.createDocument( @@ -209,6 +333,16 @@ void main() { documentId: "", data: {}, ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/documentsdb//collections//documents", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["documentId", "data"])); expect(response, isA()); }); @@ -219,7 +353,13 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await documentsDB.createDocuments( @@ -227,6 +367,49 @@ void main() { collectionId: "", documents: [], ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/documentsdb//collections//documents", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["documents"])); + expect(response, isA()); + }); + + test('test method createQuery()', () async { + final Map data = { + 'total': 5, + 'documents': [], + }; + + when( + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).thenAnswer((_) async => Response(data: data)); + + final response = await documentsDB.createQuery( + databaseId: "", + collectionId: "", + ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/documentsdb//collections//documents/query", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -242,7 +425,13 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await documentsDB.getDocument( @@ -250,6 +439,16 @@ void main() { collectionId: "", documentId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/documentsdb//collections//documents/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -265,7 +464,13 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await documentsDB.upsertDocument( @@ -273,6 +478,16 @@ void main() { collectionId: "", documentId: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/documentsdb//collections//documents/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -288,7 +503,13 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await documentsDB.updateDocument( @@ -296,6 +517,16 @@ void main() { collectionId: "", documentId: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/documentsdb//collections//documents/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -303,7 +534,13 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await documentsDB.deleteDocument( @@ -311,6 +548,16 @@ void main() { collectionId: "", documentId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/documentsdb//collections//documents/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method decrementDocumentAttribute()', () async { @@ -325,7 +572,13 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await documentsDB.decrementDocumentAttribute( @@ -334,6 +587,16 @@ void main() { documentId: "", attribute: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/documentsdb//collections//documents///decrement", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -349,7 +612,13 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await documentsDB.incrementDocumentAttribute( @@ -358,6 +627,16 @@ void main() { documentId: "", attribute: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/documentsdb//collections//documents///increment", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); }); diff --git a/test/services/functions_test.dart b/test/services/functions_test.dart index 93a7bc81..05edea49 100644 --- a/test/services/functions_test.dart +++ b/test/services/functions_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -74,12 +80,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await functions.listExecutions( functionId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/functions//executions", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -106,12 +128,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await functions.createExecution( functionId: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/functions//executions", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -138,13 +176,29 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await functions.getExecution( functionId: "", executionId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/functions//executions/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); }); diff --git a/test/services/graphql_test.dart b/test/services/graphql_test.dart index 3333a66e..0afd4fa7 100644 --- a/test/services/graphql_test.dart +++ b/test/services/graphql_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -71,24 +77,56 @@ void main() { final data = ''; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await graphql.query( query: {}, ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/graphql", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["query"])); }); test('test method mutation()', () async { final data = ''; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await graphql.mutation( query: {}, ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/graphql/mutation", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["query"])); }); }); } diff --git a/test/services/locale_test.dart b/test/services/locale_test.dart index 77ee7ddd..b58bdcb3 100644 --- a/test/services/locale_test.dart +++ b/test/services/locale_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -79,10 +85,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await locale.get(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/locale", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -93,10 +115,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await locale.listCodes(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/locale/codes", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -107,10 +145,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await locale.listContinents(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/locale/continents", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -121,10 +175,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await locale.listCountries(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/locale/countries", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -135,10 +205,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await locale.listCountriesEU(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/locale/countries/eu", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -149,10 +235,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await locale.listCountriesPhones(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/locale/countries/phones", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -163,10 +265,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await locale.listCurrencies(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/locale/currencies", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -177,10 +295,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await locale.listLanguages(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/locale/languages", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); }); diff --git a/test/services/messaging_test.dart b/test/services/messaging_test.dart index 5bf1cbd3..11fba0b9 100644 --- a/test/services/messaging_test.dart +++ b/test/services/messaging_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -90,7 +96,13 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await messaging.createSubscriber( @@ -98,6 +110,16 @@ void main() { subscriberId: "", targetId: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/messaging/topics//subscribers", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["subscriberId", "targetId"])); expect(response, isA()); }); @@ -105,13 +127,29 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await messaging.deleteSubscriber( topicId: "", subscriberId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/messaging/topics//subscribers/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); }); } diff --git a/test/services/oauth2_test.dart b/test/services/oauth2_test.dart index 41976a32..a8429a5f 100644 --- a/test/services/oauth2_test.dart +++ b/test/services/oauth2_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -73,12 +79,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await oauth2.approve( grantId: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/oauth2/testproject/approve", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["grant_id"])); expect(response, isA()); }); @@ -89,10 +111,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await oauth2.authorize(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/oauth2/testproject/authorize", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -103,10 +141,26 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await oauth2.authorizePost(); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/oauth2/testproject/authorize", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -123,10 +177,26 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await oauth2.createDeviceAuthorization(); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/oauth2/testproject/device_authorization", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -148,12 +218,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await oauth2.createGrant( userCode: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/oauth2/testproject/grants", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["user_code"])); expect(response, isA()); }); @@ -175,12 +261,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await oauth2.getGrant( grantId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/oauth2/testproject/grants/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -188,20 +290,52 @@ void main() { final data = ''; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await oauth2.logout(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/oauth2/testproject/logout", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method logoutPost()', () async { final data = ''; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await oauth2.logoutPost(); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/oauth2/testproject/logout", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method listOrganizations()', () async { @@ -211,10 +345,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await oauth2.listOrganizations(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/oauth2/testproject/organizations", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -225,7 +375,13 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await oauth2.createPAR( @@ -233,6 +389,16 @@ void main() { redirectUri: "https://example.com", responseType: "code", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/oauth2/testproject/par", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["client_id", "redirect_uri", "response_type"])); expect(response, isA()); }); @@ -243,10 +409,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await oauth2.listProjects(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/oauth2/testproject/projects", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -257,12 +439,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await oauth2.reject( grantId: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/oauth2/testproject/reject", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["grant_id"])); expect(response, isA()); }); @@ -270,12 +468,28 @@ void main() { final data = ''; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await oauth2.revoke( token: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/oauth2/testproject/revoke", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["token"])); }); test('test method createToken()', () async { @@ -288,12 +502,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await oauth2.createToken( grantType: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/oauth2/testproject/token", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["grant_type"])); expect(response, isA()); }); }); diff --git a/test/services/organization_test.dart b/test/services/organization_test.dart index 7354def0..4e39beda 100644 --- a/test/services/organization_test.dart +++ b/test/services/organization_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -74,10 +80,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await organization.listInstallations(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/organization/installations", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -95,12 +117,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await organization.createInstallation( appId: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/organization/installations", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["appId"])); expect(response, isA()); }); @@ -118,12 +156,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await organization.getInstallation( installationId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/organization/installations/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -141,12 +195,28 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await organization.updateInstallation( installationId: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/organization/installations/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -154,12 +224,28 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await organization.deleteInstallation( installationId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/organization/installations/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); }); } diff --git a/test/services/presences_test.dart b/test/services/presences_test.dart index 9f160e79..13c02de0 100644 --- a/test/services/presences_test.dart +++ b/test/services/presences_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -74,10 +80,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await presences.list(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/presences", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -92,12 +114,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await presences.get( presenceId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/presences/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -112,13 +150,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await presences.upsert( presenceId: "", status: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/presences/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["status"])); expect(response, isA()); }); @@ -133,12 +187,28 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await presences.update( presenceId: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/presences/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -146,12 +216,28 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await presences.delete( presenceId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/presences/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); }); } diff --git a/test/services/storage_test.dart b/test/services/storage_test.dart index d1e6f09b..72b05be7 100644 --- a/test/services/storage_test.dart +++ b/test/services/storage_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -74,12 +80,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await storage.listFiles( bucketId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/storage/buckets//files", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -105,11 +127,12 @@ void main() { when( client.chunkedUpload( - path: argThat(isNotNull), - params: argThat(isNotNull), - paramName: argThat(isNotNull), - idParamName: argThat(isNotNull), - headers: argThat(isNotNull), + path: anyNamed('path'), + params: anyNamed('params'), + paramName: anyNamed('paramName'), + idParamName: anyNamed('idParamName'), + headers: anyNamed('headers'), + method: anyNamed('method'), ), ).thenAnswer((_) async => Response(data: data)); @@ -118,6 +141,17 @@ void main() { fileId: "", file: InputFile.fromPath(path: './image.png'), ); + final Map params = verify( + client.chunkedUpload( + path: "/storage/buckets//files", + params: captureAnyNamed('params'), + paramName: anyNamed('paramName'), + idParamName: anyNamed('idParamName'), + headers: anyNamed('headers'), + method: HttpMethod.post, + ), + ).captured.single; + expect(params.keys, unorderedEquals(["fileId", "file"])); expect(response, isA()); }); @@ -142,13 +176,29 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await storage.getFile( bucketId: "", fileId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/storage/buckets//files/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -173,13 +223,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await storage.updateFile( bucketId: "", fileId: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/storage/buckets//files/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -187,26 +253,58 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await storage.deleteFile( bucketId: "", fileId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/storage/buckets//files/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method getFileDownload()', () async { final Uint8List data = Uint8List.fromList([]); when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await storage.getFileDownload( bucketId: "", fileId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/storage/buckets//files//download", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -214,13 +312,29 @@ void main() { final Uint8List data = Uint8List.fromList([]); when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await storage.getFilePreview( bucketId: "", fileId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/storage/buckets//files//preview", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -228,13 +342,29 @@ void main() { final Uint8List data = Uint8List.fromList([]); when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await storage.getFileView( bucketId: "", fileId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/storage/buckets//files//view", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); }); diff --git a/test/services/tables_db_test.dart b/test/services/tables_db_test.dart index 90a55af7..526bd009 100644 --- a/test/services/tables_db_test.dart +++ b/test/services/tables_db_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -74,10 +80,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await tablesDB.listTransactions(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/tablesdb/transactions", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -92,10 +114,26 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await tablesDB.createTransaction(); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/tablesdb/transactions", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -110,12 +148,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await tablesDB.getTransaction( transactionId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/tablesdb/transactions/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -130,12 +184,28 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await tablesDB.updateTransaction( transactionId: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/tablesdb/transactions/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -143,12 +213,28 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await tablesDB.deleteTransaction( transactionId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/tablesdb/transactions/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method createOperations()', () async { @@ -162,12 +248,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await tablesDB.createOperations( transactionId: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/tablesdb/transactions//operations", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -178,13 +280,29 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await tablesDB.listRows( databaseId: "", tableId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/tablesdb//tables//rows", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -200,7 +318,13 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await tablesDB.createRow( @@ -209,9 +333,52 @@ void main() { rowId: "", data: {}, ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/tablesdb//tables//rows", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["rowId", "data"])); expect(response, isA()); }); + test('test method createQuery()', () async { + final Map data = { + 'total': 5, + 'rows': [], + }; + + when( + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).thenAnswer((_) async => Response(data: data)); + + final response = await tablesDB.createQuery( + databaseId: "", + tableId: "", + ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/tablesdb//tables//rows/query", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); + expect(response, isA()); + }); + test('test method getRow()', () async { final Map data = { '\$id': "5e5ea5c16897e", @@ -224,7 +391,13 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await tablesDB.getRow( @@ -232,6 +405,16 @@ void main() { tableId: "", rowId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/tablesdb//tables//rows/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -247,7 +430,13 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await tablesDB.upsertRow( @@ -255,6 +444,16 @@ void main() { tableId: "", rowId: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/tablesdb//tables//rows/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -270,7 +469,13 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await tablesDB.updateRow( @@ -278,6 +483,16 @@ void main() { tableId: "", rowId: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/tablesdb//tables//rows/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -285,7 +500,13 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await tablesDB.deleteRow( @@ -293,6 +514,16 @@ void main() { tableId: "", rowId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/tablesdb//tables//rows/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method decrementRowColumn()', () async { @@ -307,7 +538,13 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await tablesDB.decrementRowColumn( @@ -316,6 +553,16 @@ void main() { rowId: "", column: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/tablesdb//tables//rows///decrement", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -331,7 +578,13 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await tablesDB.incrementRowColumn( @@ -340,6 +593,16 @@ void main() { rowId: "", column: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/tablesdb//tables//rows///increment", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); }); diff --git a/test/services/teams_test.dart b/test/services/teams_test.dart index 7c9f2faf..fcf47c3f 100644 --- a/test/services/teams_test.dart +++ b/test/services/teams_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -74,10 +80,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.list(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/teams", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -92,13 +114,29 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.create( teamId: "", name: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/teams", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["teamId", "name"])); expect(response, isA()); }); @@ -113,12 +151,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.get( teamId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/teams/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -133,13 +187,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.updateName( teamId: "", name: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/teams/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["name"])); expect(response, isA()); }); @@ -147,12 +217,28 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.delete( teamId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/teams/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method listInstallations()', () async { @@ -162,12 +248,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.listInstallations( teamId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/teams//installations", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -185,13 +287,29 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.createInstallation( teamId: "", appId: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/teams//installations", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["appId"])); expect(response, isA()); }); @@ -209,13 +327,29 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.getInstallation( teamId: "", installationId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/teams//installations/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -233,13 +367,29 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.updateInstallation( teamId: "", installationId: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/teams//installations/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -247,13 +397,29 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.deleteInstallation( teamId: "", installationId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/teams//installations/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method listMemberships()', () async { @@ -263,12 +429,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.listMemberships( teamId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/teams//memberships", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -292,13 +474,29 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.createMembership( teamId: "", roles: [], ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/teams//memberships", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["roles"])); expect(response, isA()); }); @@ -322,13 +520,29 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.getMembership( teamId: "", membershipId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/teams//memberships/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -352,7 +566,13 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.updateMembership( @@ -360,6 +580,16 @@ void main() { membershipId: "", roles: [], ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/teams//memberships/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["roles"])); expect(response, isA()); }); @@ -367,13 +597,29 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.deleteMembership( teamId: "", membershipId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/teams//memberships/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method updateMembershipStatus()', () async { @@ -396,7 +642,13 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.updateMembershipStatus( @@ -405,6 +657,16 @@ void main() { userId: "", secret: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/teams//memberships//status", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["userId", "secret"])); expect(response, isA()); }); @@ -412,12 +674,28 @@ void main() { final Map data = {}; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.getPrefs( teamId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/teams//prefs", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -425,13 +703,29 @@ void main() { final Map data = {}; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await teams.updatePrefs( teamId: "", prefs: {}, ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/teams//prefs", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["prefs"])); expect(response, isA()); }); }); diff --git a/test/services/vectors_db_test.dart b/test/services/vectors_db_test.dart index dc13e38d..066686f6 100644 --- a/test/services/vectors_db_test.dart +++ b/test/services/vectors_db_test.dart @@ -14,13 +14,18 @@ class MockClient extends Mock implements Client { @override Future call( HttpMethod? method, { - String path = '', - Map headers = const {}, - Map params = const {}, + String? path = '', + Map? headers = const {}, + Map? params = const {}, ResponseType? responseType, }) async { return super.noSuchMethod( - Invocation.method(#call, [method]), + Invocation.method(#call, [method], { + #path: path, + #headers: headers, + #params: params, + #responseType: responseType, + }), returnValue: Response(), ); } @@ -42,16 +47,17 @@ class MockClient extends Mock implements Client { Map? headers, Function(UploadProgress)? onProgress, ResponseType? responseType, - HttpMethod method = HttpMethod.post, + HttpMethod? method = HttpMethod.post, }) async { return super.noSuchMethod( - Invocation.method(#chunkedUpload, [ - path, - params, - paramName, - idParamName, - headers, - ]), + Invocation.method(#chunkedUpload, [], { + #path: path, + #params: params, + #paramName: paramName, + #idParamName: idParamName, + #headers: headers, + #method: method, + }), returnValue: Response(data: {}), ); } @@ -74,10 +80,26 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await vectorsDB.listTransactions(); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/vectorsdb/transactions", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -92,10 +114,26 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await vectorsDB.createTransaction(); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/vectorsdb/transactions", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -110,12 +148,28 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await vectorsDB.getTransaction( transactionId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/vectorsdb/transactions/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -130,12 +184,28 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await vectorsDB.updateTransaction( transactionId: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/vectorsdb/transactions/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -143,12 +213,28 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await vectorsDB.deleteTransaction( transactionId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/vectorsdb/transactions/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); test('test method createOperations()', () async { @@ -162,12 +248,28 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await vectorsDB.createOperations( transactionId: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/vectorsdb/transactions//operations", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -178,13 +280,29 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await vectorsDB.listDocuments( databaseId: "", collectionId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/vectorsdb//collections//documents", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -200,7 +318,13 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await vectorsDB.createDocument( @@ -209,6 +333,16 @@ void main() { documentId: "", data: {}, ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/vectorsdb//collections//documents", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, unorderedEquals(["documentId", "data"])); expect(response, isA()); }); @@ -219,13 +353,29 @@ void main() { }; when( - client.call(HttpMethod.post), + client.call( + HttpMethod.post, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await vectorsDB.createQuery( databaseId: "", collectionId: "", ); + final Map params = verify( + client.call( + HttpMethod.post, + path: "/vectorsdb//collections//documents/query", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -241,7 +391,13 @@ void main() { }; when( - client.call(HttpMethod.get), + client.call( + HttpMethod.get, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await vectorsDB.getDocument( @@ -249,6 +405,16 @@ void main() { collectionId: "", documentId: "", ); + final Map params = verify( + client.call( + HttpMethod.get, + path: "/vectorsdb//collections//documents/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -264,7 +430,13 @@ void main() { }; when( - client.call(HttpMethod.put), + client.call( + HttpMethod.put, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await vectorsDB.upsertDocument( @@ -272,6 +444,16 @@ void main() { collectionId: "", documentId: "", ); + final Map params = verify( + client.call( + HttpMethod.put, + path: "/vectorsdb//collections//documents/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -287,7 +469,13 @@ void main() { }; when( - client.call(HttpMethod.patch), + client.call( + HttpMethod.patch, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await vectorsDB.updateDocument( @@ -295,6 +483,16 @@ void main() { collectionId: "", documentId: "", ); + final Map params = verify( + client.call( + HttpMethod.patch, + path: "/vectorsdb//collections//documents/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); expect(response, isA()); }); @@ -302,7 +500,13 @@ void main() { final data = ''; when( - client.call(HttpMethod.delete), + client.call( + HttpMethod.delete, + path: anyNamed('path'), + headers: anyNamed('headers'), + params: anyNamed('params'), + responseType: anyNamed('responseType'), + ), ).thenAnswer((_) async => Response(data: data)); final response = await vectorsDB.deleteDocument( @@ -310,6 +514,16 @@ void main() { collectionId: "", documentId: "", ); + final Map params = verify( + client.call( + HttpMethod.delete, + path: "/vectorsdb//collections//documents/", + headers: anyNamed('headers'), + params: captureAnyNamed('params'), + responseType: anyNamed('responseType'), + ), + ).captured.single; + expect(params.keys, isEmpty); }); }); } diff --git a/test/src/client_io_test.dart b/test/src/client_io_test.dart new file mode 100644 index 00000000..2a43f250 --- /dev/null +++ b/test/src/client_io_test.dart @@ -0,0 +1,202 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:appwrite/src/client_io.dart'; +import 'package:appwrite/src/exception.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final messenger = + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger; + + late HttpServer server; + late Directory documents; + late ClientIO client; + late List> authentications; + late List requests; + late String Function(Uri url, String callback) respond; + + setUp(() async { + HttpOverrides.global = null; + documents = await Directory.systemTemp.createTemp(); + messenger.setMockMethodCallHandler( + const MethodChannel('plugins.flutter.io/path_provider'), + (call) async => documents.path, + ); + authentications = []; + messenger.setMockMethodCallHandler( + const MethodChannel('flutter_web_auth_2'), + (call) async { + final arguments = Map.from(call.arguments as Map); + authentications.add(arguments); + return respond( + Uri.parse(arguments['url'] as String), + arguments['callbackUrlScheme'] as String, + ); + }, + ); + + requests = []; + server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0); + server.listen((request) async { + requests.add( + '${request.method} ${request.uri.path} ${await utf8.decoder.bind(request).join()}', + ); + request.response + ..headers.contentType = ContentType.json + ..cookies.add(Cookie('a_session_project', 'session')) + ..write('{}'); + await request.response.close(); + }); + + client = ClientIO(endPoint: 'http://127.0.0.1:${server.port}/v1'); + client.config['project'] = 'project'; + }); + + tearDown(() async { + debugDefaultTargetPlatformOverride = null; + messenger.setMockMethodCallHandler( + const MethodChannel('plugins.flutter.io/path_provider'), + null, + ); + messenger.setMockMethodCallHandler( + const MethodChannel('flutter_web_auth_2'), + null, + ); + await server.close(force: true); + await documents.delete(recursive: true); + }); + + Uri authorization() => Uri.parse( + 'http://127.0.0.1:${server.port}/v1/account/sessions/oauth2/github?scopes%5B%5D=user&scopes%5B%5D=repo&project=project', + ); + + String Function(Uri url, String callback) redirect( + String outcome, + String query, + ) => (url, callback) { + final target = Uri.parse(url.queryParameters[outcome]!); + if (target.origin != Uri.parse(callback).origin) { + throw PlatformException(code: 'CANCELED'); + } + return '$target?$query'; + }; + + Future> cookies() async => + (await client.cookieJar.loadForRequest( + Uri.parse('http://127.0.0.1:${server.port}/v1'), + )).map((cookie) => '${cookie.name}=${cookie.value}').toList(); + + for (final platform in [TargetPlatform.linux, TargetPlatform.windows]) { + group('webAuth on ${platform.name}', () { + setUp(() => debugDefaultTargetPlatformOverride = platform); + + test('signs in through a loopback token callback', () async { + respond = redirect('success', 'userId=user&secret=token'); + + await client.webAuth(authorization()); + + final callback = authentications.single['callbackUrlScheme'] as String; + expect(callback, matches(RegExp(r'^http://localhost:\d+/$'))); + final url = Uri.parse(authentications.single['url'] as String); + expect(url.path, '/v1/account/tokens/oauth2/github'); + expect(url.queryParametersAll['scopes[]'], ['user', 'repo']); + expect(url.queryParameters['project'], 'project'); + expect(url.queryParameters['success'], callback); + expect(url.queryParameters['failure'], callback); + expect(requests, [ + 'POST /v1/account/sessions/token {"userId":"user","secret":"token"}', + ]); + expect(await cookies(), ['a_session_project=session']); + }); + + test('routes the failure URL it is given through the callback', () async { + respond = redirect('success', 'userId=user&secret=token'); + + await client.webAuth( + authorization().replace( + queryParameters: { + ...authorization().queryParametersAll, + 'success': 'http://localhost:4000/auth', + 'failure': 'https://app.example/failed', + }, + ), + callbackUrlScheme: 'http://localhost:4000/auth', + ); + + expect( + authentications.single['callbackUrlScheme'], + 'http://localhost:4000/auth', + ); + final url = Uri.parse(authentications.single['url'] as String); + expect(url.queryParameters['success'], 'http://localhost:4000/auth'); + expect(url.queryParameters['failure'], 'http://localhost:4000/auth'); + expect(requests, hasLength(1)); + }); + + test('throws the error the callback carries', () async { + respond = redirect( + 'failure', + 'error=${Uri.encodeComponent('{"message":"Denied","code":401,"type":"user_oauth2_unauthorized"}')}', + ); + + await expectLater( + client.webAuth(authorization()), + throwsA( + isA() + .having((error) => error.message, 'message', 'Denied') + .having((error) => error.code, 'code', 401), + ), + ); + expect(requests, isEmpty); + }); + + test('throws the error of a failure URL it is given', () async { + respond = redirect( + 'failure', + 'error=${Uri.encodeComponent('{"message":"Denied","code":401,"type":"user_oauth2_unauthorized"}')}', + ); + + await expectLater( + client.webAuth( + authorization().replace( + queryParameters: { + ...authorization().queryParametersAll, + 'failure': 'https://app.example/failed', + }, + ), + ), + throwsA( + isA() + .having((error) => error.message, 'message', 'Denied') + .having((error) => error.code, 'code', 401), + ), + ); + final callback = authentications.single['callbackUrlScheme'] as String; + expect(callback, matches(RegExp(r'^http://localhost:\d+/$'))); + final url = Uri.parse(authentications.single['url'] as String); + expect(url.queryParameters['failure'], callback); + expect(requests, isEmpty); + }); + }); + } + + test('webAuth on android saves the session from the app callback', () async { + debugDefaultTargetPlatformOverride = TargetPlatform.android; + respond = (url, callback) => + '$callback://?key=a_session_project&secret=session'; + + await client.webAuth(authorization()); + + expect( + authentications.single['callbackUrlScheme'], + 'appwrite-callback-project', + ); + expect(authentications.single['url'], authorization().toString()); + expect(requests, isEmpty); + expect(await cookies(), ['a_session_project=session']); + }); +} From 6f4bf9fa5d5512dcaff62c699d46e9f016e6ba59 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 27 Oct 2026 16:02:39 +0000 Subject: [PATCH 4/5] chore: update Flutter SDK to 28.2.0 --- CHANGELOG.md | 7 + README.md | 6 +- android/build.gradle | 2 +- docs/examples/oauth2/authorize-post.md | 2 +- docs/examples/oauth2/authorize.md | 2 +- docs/examples/storage/update-file.md | 2 +- lib/appwrite.dart | 9 +- lib/services/account.dart | 50 ++-- lib/services/analytics.dart | 2 +- lib/services/apps.dart | 48 +-- lib/services/avatars.dart | 6 +- lib/services/databases.dart | 60 ++-- lib/services/documents_db.dart | 64 ++-- lib/services/functions.dart | 8 +- lib/services/messaging.dart | 6 +- lib/services/oauth2.dart | 30 +- lib/services/organization.dart | 6 +- lib/services/presences.dart | 8 +- lib/services/storage.dart | 28 +- lib/services/tables_db.dart | 60 ++-- lib/services/teams.dart | 46 +-- lib/services/vectors_db.dart | 44 +-- lib/src/client_browser.dart | 6 +- lib/src/client_io.dart | 6 +- pubspec.yaml | 2 +- test/services/account_test.dart | 394 ++++++++++++++++++------- test/services/analytics_test.dart | 27 +- test/services/apps_test.dart | 175 ++++++++--- test/services/avatars_test.dart | 133 ++++++++- test/services/databases_test.dart | 139 +++++++-- test/services/documents_db_test.dart | 147 +++++++-- test/services/functions_test.dart | 30 +- test/services/graphql_test.dart | 8 +- test/services/locale_test.dart | 58 +++- test/services/messaging_test.dart | 11 +- test/services/oauth2_test.dart | 222 ++++++++++++-- test/services/organization_test.dart | 31 +- test/services/presences_test.dart | 47 ++- test/services/storage_test.dart | 82 ++++- test/services/tables_db_test.dart | 139 +++++++-- test/services/teams_test.dart | 125 +++++--- test/services/vectors_db_test.dart | 117 ++++++-- 42 files changed, 1756 insertions(+), 639 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6362da7f..6d8c915c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 28.2.0 + +* Updated: requests send `X-Appwrite-Response-Format: 2.6.2`; the SDK targets Appwrite 2.6.x +* Fixed: path parameters are percent-encoded as one segment; `.` and `..` throw `AppwriteException` +* Fixed: chunked upload resume lookups percent-encode the file ID +* Fixed: examples pass `null` for unset optional params instead of empty strings + ## 28.1.0 * Added: `createQuery` on `databases`, `documentsDB` and `tablesDB` to send list queries in the request body diff --git a/README.md b/README.md index 0cca741c..c0fcf58f 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ [![pub package](https://img.shields.io/pub/v/appwrite?style=flat-square)](https://pub.dartlang.org/packages/appwrite) ![License](https://img.shields.io/badge/license-BSD--3--Clause-blue.svg?style=flat-square) -![Version](https://img.shields.io/badge/api%20version-2.5.x-blue.svg?style=flat-square) +![Version](https://img.shields.io/badge/api%20version-2.6.x-blue.svg?style=flat-square) [![X Account](https://img.shields.io/badge/follow-%40appwrite-000000?logo=x&style=flat-square)](https://x.com/appwrite) [![Discord](https://img.shields.io/discord/564160730845151244?label=discord&style=flat-square)](https://appwrite.io/discord) -**This SDK targets Appwrite server version 2.5.x as shipped on Appwrite Cloud.** Self-hosted releases can lag behind Cloud — if you run an older self-hosted build, use a matching older SDK from [previous releases](https://github.com/appwrite/sdk-for-flutter/releases) when APIs differ. +**This SDK targets Appwrite server version 2.6.x as shipped on Appwrite Cloud.** Self-hosted releases can lag behind Cloud — if you run an older self-hosted build, use a matching older SDK from [previous releases](https://github.com/appwrite/sdk-for-flutter/releases) when APIs differ. Appwrite is an open-source backend as a service server that abstracts and simplifies complex and repetitive development tasks behind a very simple to use REST API. Appwrite aims to help you develop your apps faster and in a more secure way. Use the Flutter SDK to integrate your app with the Appwrite server to easily start interacting with all of Appwrite backend APIs and tools. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) @@ -24,7 +24,7 @@ Or add it to your app's `pubspec.yaml` file and run `flutter pub get`: ```yaml dependencies: - appwrite: ^28.1.0 + appwrite: ^28.2.0 ``` ### Android requirements diff --git a/android/build.gradle b/android/build.gradle index 5d77d97e..d1778b9c 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,7 +1,7 @@ // The native half of Push on Android: background delivery that survives the process being // killed, a reboot and an app update, shared with the Appwrite Android SDK. group = "io.appwrite.flutter" -version = "28.1.0" +version = "28.2.0" buildscript { ext.kotlin_version = "2.1.0" diff --git a/docs/examples/oauth2/authorize-post.md b/docs/examples/oauth2/authorize-post.md index 05d9c020..32526b3c 100644 --- a/docs/examples/oauth2/authorize-post.md +++ b/docs/examples/oauth2/authorize-post.md @@ -11,7 +11,7 @@ Oauth2 oauth2 = Oauth2(client); models.Oauth2Authorize result = await oauth2.authorizePost( clientId: '', // optional redirectUri: 'https://example.com', // optional - responseType: '', // optional + responseType: null, // optional scope: '', // optional state: '', // optional nonce: '', // optional diff --git a/docs/examples/oauth2/authorize.md b/docs/examples/oauth2/authorize.md index 0fe1d691..b3cc0444 100644 --- a/docs/examples/oauth2/authorize.md +++ b/docs/examples/oauth2/authorize.md @@ -11,7 +11,7 @@ Oauth2 oauth2 = Oauth2(client); models.Oauth2Authorize result = await oauth2.authorize( clientId: '', // optional redirectUri: 'https://example.com', // optional - responseType: '', // optional + responseType: null, // optional scope: '', // optional state: '', // optional nonce: '', // optional diff --git a/docs/examples/storage/update-file.md b/docs/examples/storage/update-file.md index 6ddd4920..ed57a830 100644 --- a/docs/examples/storage/update-file.md +++ b/docs/examples/storage/update-file.md @@ -11,7 +11,7 @@ Storage storage = Storage(client); models.File result = await storage.updateFile( bucketId: '', fileId: '', - name: '', // optional + name: null, // optional permissions: [Permission.read(Role.any())], // optional ); ``` diff --git a/lib/appwrite.dart b/lib/appwrite.dart index 085d8348..337e4836 100644 --- a/lib/appwrite.dart +++ b/lib/appwrite.dart @@ -1,6 +1,6 @@ /// Appwrite Flutter SDK /// -/// This SDK targets Appwrite server version 2.5.x as shipped on Appwrite Cloud. +/// This SDK targets Appwrite server version 2.6.x as shipped on Appwrite Cloud. /// Self-hosted releases can lag behind Cloud — if you run an older self-hosted /// build, use a matching older SDK from /// [previous releases](https://github.com/appwrite/sdk-for-flutter/releases) @@ -58,3 +58,10 @@ part 'services/storage.dart'; part 'services/tables_db.dart'; part 'services/teams.dart'; part 'services/vectors_db.dart'; + +String _encodePath(String value) { + if (value == '.' || value == '..') { + throw AppwriteException('Path parameter cannot be "." or ".."'); + } + return Uri.encodeComponent(value); +} diff --git a/lib/services/account.dart b/lib/services/account.dart index 3e6de0d8..706b0131 100644 --- a/lib/services/account.dart +++ b/lib/services/account.dart @@ -105,7 +105,7 @@ class Account extends Service { final String apiPath = '/account/consents/{consentId}'.replaceAll( '{consentId}', - consentId, + _encodePath(consentId), ); final Map apiParams = {}; @@ -139,7 +139,7 @@ class Account extends Service { final String apiPath = '/account/consents/{consentId}'.replaceAll( '{consentId}', - consentId, + _encodePath(consentId), ); final Map apiParams = {}; @@ -176,7 +176,7 @@ class Account extends Service { final String apiPath = '/account/consents/{consentId}/tokens'.replaceAll( '{consentId}', - consentId, + _encodePath(consentId), ); final Map apiParams = { @@ -220,11 +220,11 @@ class Account extends Service { final String apiPath = '/account/consents/{consentId}/tokens/{tokenId}' .replaceAll( '{consentId}', - consentId, + _encodePath(consentId), ) .replaceAll( '{tokenId}', - tokenId, + _encodePath(tokenId), ); final Map apiParams = {}; @@ -266,11 +266,11 @@ class Account extends Service { final String apiPath = '/account/consents/{consentId}/tokens/{tokenId}' .replaceAll( '{consentId}', - consentId, + _encodePath(consentId), ) .replaceAll( '{tokenId}', - tokenId, + _encodePath(tokenId), ); final Map apiParams = {}; @@ -364,7 +364,7 @@ class Account extends Service { final String apiPath = '/account/identities/{identityId}'.replaceAll( '{identityId}', - identityId, + _encodePath(identityId), ); final Map apiParams = {}; @@ -480,7 +480,7 @@ class Account extends Service { }) async { final String apiPath = '/account/mfa/authenticators/{type}'.replaceAll( '{type}', - type.value, + _encodePath(type.value), ); final Map apiParams = {}; @@ -510,7 +510,7 @@ class Account extends Service { }) async { final String apiPath = '/account/mfa/authenticators/{type}'.replaceAll( '{type}', - type.value, + _encodePath(type.value), ); final Map apiParams = {}; @@ -543,7 +543,7 @@ class Account extends Service { }) async { final String apiPath = '/account/mfa/authenticators/{type}'.replaceAll( '{type}', - type.value, + _encodePath(type.value), ); final Map apiParams = { @@ -575,7 +575,7 @@ class Account extends Service { }) async { final String apiPath = '/account/mfa/authenticators/{type}'.replaceAll( '{type}', - type.value, + _encodePath(type.value), ); final Map apiParams = { @@ -607,7 +607,7 @@ class Account extends Service { }) async { final String apiPath = '/account/mfa/authenticators/{type}'.replaceAll( '{type}', - type.value, + _encodePath(type.value), ); final Map apiParams = {}; @@ -634,7 +634,7 @@ class Account extends Service { }) async { final String apiPath = '/account/mfa/authenticators/{type}'.replaceAll( '{type}', - type.value, + _encodePath(type.value), ); final Map apiParams = {}; @@ -1086,7 +1086,7 @@ class Account extends Service { final String apiPath = '/account/passkeys/{passkeyId}'.replaceAll( '{passkeyId}', - passkeyId, + _encodePath(passkeyId), ); final Map apiParams = {}; @@ -1119,7 +1119,7 @@ class Account extends Service { final String apiPath = '/account/passkeys/{passkeyId}'.replaceAll( '{passkeyId}', - passkeyId, + _encodePath(passkeyId), ); final Map apiParams = { @@ -1157,7 +1157,7 @@ class Account extends Service { final String apiPath = '/account/passkeys/{passkeyId}'.replaceAll( '{passkeyId}', - passkeyId, + _encodePath(passkeyId), ); final Map apiParams = {}; @@ -1196,7 +1196,7 @@ class Account extends Service { final String apiPath = '/account/passkeys/{passkeyId}/verification' .replaceAll( '{passkeyId}', - passkeyId, + _encodePath(passkeyId), ); final Map apiParams = { @@ -1748,7 +1748,7 @@ class Account extends Service { }) async { final String apiPath = '/account/sessions/oauth2/{provider}'.replaceAll( '{provider}', - provider.value, + _encodePath(provider.value), ); final Map params = { @@ -1861,7 +1861,7 @@ class Account extends Service { final String apiPath = '/account/sessions/{sessionId}'.replaceAll( '{sessionId}', - sessionId, + _encodePath(sessionId), ); final Map apiParams = {}; @@ -1895,7 +1895,7 @@ class Account extends Service { final String apiPath = '/account/sessions/{sessionId}'.replaceAll( '{sessionId}', - sessionId, + _encodePath(sessionId), ); final Map apiParams = {}; @@ -1932,7 +1932,7 @@ class Account extends Service { final String apiPath = '/account/sessions/{sessionId}'.replaceAll( '{sessionId}', - sessionId, + _encodePath(sessionId), ); final Map apiParams = {}; @@ -2037,7 +2037,7 @@ class Account extends Service { final String apiPath = '/account/targets/{targetId}/push'.replaceAll( '{targetId}', - targetId, + _encodePath(targetId), ); final Map apiParams = { @@ -2076,7 +2076,7 @@ class Account extends Service { final String apiPath = '/account/targets/{targetId}/push'.replaceAll( '{targetId}', - targetId, + _encodePath(targetId), ); final Map apiParams = {}; @@ -2210,7 +2210,7 @@ class Account extends Service { }) async { final String apiPath = '/account/tokens/oauth2/{provider}'.replaceAll( '{provider}', - provider.value, + _encodePath(provider.value), ); final Map params = { diff --git a/lib/services/analytics.dart b/lib/services/analytics.dart index effdd8e6..309ba869 100644 --- a/lib/services/analytics.dart +++ b/lib/services/analytics.dart @@ -29,7 +29,7 @@ class Analytics extends Service { final String apiPath = '/analytics/properties/{propertyId}/events' .replaceAll( '{propertyId}', - propertyId, + _encodePath(propertyId), ); final Map apiParams = { diff --git a/lib/services/apps.dart b/lib/services/apps.dart index 1026e7ea..057d207f 100644 --- a/lib/services/apps.dart +++ b/lib/services/apps.dart @@ -150,7 +150,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = {}; @@ -201,7 +201,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = { @@ -256,7 +256,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = {}; @@ -293,7 +293,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/installations'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = { @@ -338,11 +338,11 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/installations/{installationId}' .replaceAll( '{appId}', - appId, + _encodePath(appId), ) .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = {}; @@ -384,11 +384,11 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/installations/{installationId}' .replaceAll( '{appId}', - appId, + _encodePath(appId), ) .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = {}; @@ -436,11 +436,11 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/installations/{installationId}/tokens' .replaceAll( '{appId}', - appId, + _encodePath(appId), ) .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = {}; @@ -475,7 +475,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/keys'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = { @@ -512,7 +512,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/keys'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = {}; @@ -553,11 +553,11 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/keys/{keyId}' .replaceAll( '{appId}', - appId, + _encodePath(appId), ) .replaceAll( '{keyId}', - keyId, + _encodePath(keyId), ); final Map apiParams = {}; @@ -597,11 +597,11 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/keys/{keyId}' .replaceAll( '{appId}', - appId, + _encodePath(appId), ) .replaceAll( '{keyId}', - keyId, + _encodePath(keyId), ); final Map apiParams = {}; @@ -636,7 +636,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/secrets'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = { @@ -671,7 +671,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/secrets'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = {}; @@ -712,11 +712,11 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/secrets/{secretId}' .replaceAll( '{appId}', - appId, + _encodePath(appId), ) .replaceAll( '{secretId}', - secretId, + _encodePath(secretId), ); final Map apiParams = {}; @@ -756,11 +756,11 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/secrets/{secretId}' .replaceAll( '{appId}', - appId, + _encodePath(appId), ) .replaceAll( '{secretId}', - secretId, + _encodePath(secretId), ); final Map apiParams = {}; @@ -794,7 +794,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/team'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = { @@ -829,7 +829,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/tokens'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = {}; diff --git a/lib/services/avatars.dart b/lib/services/avatars.dart index f9b4cbd5..9231ce8f 100644 --- a/lib/services/avatars.dart +++ b/lib/services/avatars.dart @@ -24,7 +24,7 @@ class Avatars extends Service { }) async { final String apiPath = '/avatars/browsers/{code}'.replaceAll( '{code}', - code.value, + _encodePath(code.value), ); final Map apiParams = { @@ -64,7 +64,7 @@ class Avatars extends Service { }) async { final String apiPath = '/avatars/credit-cards/{code}'.replaceAll( '{code}', - code.value, + _encodePath(code.value), ); final Map apiParams = { @@ -133,7 +133,7 @@ class Avatars extends Service { }) async { final String apiPath = '/avatars/flags/{code}'.replaceAll( '{code}', - code.value, + _encodePath(code.value), ); final Map apiParams = { diff --git a/lib/services/databases.dart b/lib/services/databases.dart index 11959bf9..28c8aa41 100644 --- a/lib/services/databases.dart +++ b/lib/services/databases.dart @@ -80,7 +80,7 @@ class Databases extends Service { final String apiPath = '/databases/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = {}; @@ -117,7 +117,7 @@ class Databases extends Service { final String apiPath = '/databases/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = { @@ -156,7 +156,7 @@ class Databases extends Service { final String apiPath = '/databases/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = {}; @@ -194,7 +194,7 @@ class Databases extends Service { final String apiPath = '/databases/transactions/{transactionId}/operations' .replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = { @@ -255,11 +255,11 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -315,11 +315,11 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -376,11 +376,11 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents/query' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -440,15 +440,15 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -508,15 +508,15 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -576,15 +576,15 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -641,15 +641,15 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -713,19 +713,19 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents/{documentId}/{attribute}/decrement' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ) .replaceAll( '{attribute}', - attribute, + _encodePath(attribute), ); final Map apiParams = { @@ -791,19 +791,19 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents/{documentId}/{attribute}/increment' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ) .replaceAll( '{attribute}', - attribute, + _encodePath(attribute), ); final Map apiParams = { diff --git a/lib/services/documents_db.dart b/lib/services/documents_db.dart index 93ef8712..210ea5fd 100644 --- a/lib/services/documents_db.dart +++ b/lib/services/documents_db.dart @@ -70,7 +70,7 @@ class DocumentsDB extends Service { final String apiPath = '/documentsdb/transactions/{transactionId}' .replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = {}; @@ -105,7 +105,7 @@ class DocumentsDB extends Service { final String apiPath = '/documentsdb/transactions/{transactionId}' .replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = { @@ -142,7 +142,7 @@ class DocumentsDB extends Service { final String apiPath = '/documentsdb/transactions/{transactionId}' .replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = {}; @@ -177,7 +177,7 @@ class DocumentsDB extends Service { final String apiPath = '/documentsdb/transactions/{transactionId}/operations'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = { @@ -226,11 +226,11 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -283,11 +283,11 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -339,11 +339,11 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -395,11 +395,11 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents/query' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -456,15 +456,15 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -521,15 +521,15 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -586,15 +586,15 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -648,15 +648,15 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -717,19 +717,19 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents/{documentId}/{attribute}/decrement' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ) .replaceAll( '{attribute}', - attribute, + _encodePath(attribute), ); final Map apiParams = { @@ -792,19 +792,19 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents/{documentId}/{attribute}/increment' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ) .replaceAll( '{attribute}', - attribute, + _encodePath(attribute), ); final Map apiParams = { diff --git a/lib/services/functions.dart b/lib/services/functions.dart index 9d40b1d0..6111f347 100644 --- a/lib/services/functions.dart +++ b/lib/services/functions.dart @@ -21,7 +21,7 @@ class Functions extends Service { final String apiPath = '/functions/{functionId}/executions'.replaceAll( '{functionId}', - functionId, + _encodePath(functionId), ); final Map apiParams = { @@ -65,7 +65,7 @@ class Functions extends Service { final String apiPath = '/functions/{functionId}/executions'.replaceAll( '{functionId}', - functionId, + _encodePath(functionId), ); final Map apiParams = { @@ -113,11 +113,11 @@ class Functions extends Service { final String apiPath = '/functions/{functionId}/executions/{executionId}' .replaceAll( '{functionId}', - functionId, + _encodePath(functionId), ) .replaceAll( '{executionId}', - executionId, + _encodePath(executionId), ); final Map apiParams = {}; diff --git a/lib/services/messaging.dart b/lib/services/messaging.dart index 4afbb010..1d4e2cd9 100644 --- a/lib/services/messaging.dart +++ b/lib/services/messaging.dart @@ -20,7 +20,7 @@ class Messaging extends Service { final String apiPath = '/messaging/topics/{topicId}/subscribers'.replaceAll( '{topicId}', - topicId, + _encodePath(topicId), ); final Map apiParams = { @@ -65,11 +65,11 @@ class Messaging extends Service { '/messaging/topics/{topicId}/subscribers/{subscriberId}' .replaceAll( '{topicId}', - topicId, + _encodePath(topicId), ) .replaceAll( '{subscriberId}', - subscriberId, + _encodePath(subscriberId), ); final Map apiParams = {}; diff --git a/lib/services/oauth2.dart b/lib/services/oauth2.dart index 439de1a8..570de711 100644 --- a/lib/services/oauth2.dart +++ b/lib/services/oauth2.dart @@ -18,7 +18,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/approve'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -66,7 +66,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/authorize'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -125,7 +125,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/authorize'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -174,7 +174,7 @@ class Oauth2 extends Service { final String apiPath = '/oauth2/{project_id}/device_authorization' .replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -210,7 +210,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/grants'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -247,11 +247,11 @@ class Oauth2 extends Service { final String apiPath = '/oauth2/{project_id}/grants/{grant_id}' .replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ) .replaceAll( '{grant_id}', - grantId, + _encodePath(grantId), ); final Map apiParams = {}; @@ -284,7 +284,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/logout'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -325,7 +325,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/logout'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -363,7 +363,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/organizations'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -405,7 +405,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/par'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -451,7 +451,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/projects'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -483,7 +483,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/reject'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -514,7 +514,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/revoke'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -555,7 +555,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/token'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { diff --git a/lib/services/organization.dart b/lib/services/organization.dart index 68b762c9..694d0c7c 100644 --- a/lib/services/organization.dart +++ b/lib/services/organization.dart @@ -78,7 +78,7 @@ class Organization extends Service { final String apiPath = '/organization/installations/{installationId}' .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = {}; @@ -115,7 +115,7 @@ class Organization extends Service { final String apiPath = '/organization/installations/{installationId}' .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = { @@ -154,7 +154,7 @@ class Organization extends Service { final String apiPath = '/organization/installations/{installationId}' .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = {}; diff --git a/lib/services/presences.dart b/lib/services/presences.dart index 7ce2e633..04a70bc4 100644 --- a/lib/services/presences.dart +++ b/lib/services/presences.dart @@ -48,7 +48,7 @@ class Presences extends Service { final String apiPath = '/presences/{presenceId}'.replaceAll( '{presenceId}', - presenceId, + _encodePath(presenceId), ); final Map apiParams = {}; @@ -84,7 +84,7 @@ class Presences extends Service { final String apiPath = '/presences/{presenceId}'.replaceAll( '{presenceId}', - presenceId, + _encodePath(presenceId), ); final Map apiParams = { @@ -128,7 +128,7 @@ class Presences extends Service { final String apiPath = '/presences/{presenceId}'.replaceAll( '{presenceId}', - presenceId, + _encodePath(presenceId), ); final Map apiParams = { @@ -167,7 +167,7 @@ class Presences extends Service { final String apiPath = '/presences/{presenceId}'.replaceAll( '{presenceId}', - presenceId, + _encodePath(presenceId), ); final Map apiParams = {}; diff --git a/lib/services/storage.dart b/lib/services/storage.dart index ec4522fe..49891ed4 100644 --- a/lib/services/storage.dart +++ b/lib/services/storage.dart @@ -21,7 +21,7 @@ class Storage extends Service { final String apiPath = '/storage/buckets/{bucketId}/files'.replaceAll( '{bucketId}', - bucketId, + _encodePath(bucketId), ); final Map apiParams = { @@ -78,7 +78,7 @@ class Storage extends Service { final String apiPath = '/storage/buckets/{bucketId}/files'.replaceAll( '{bucketId}', - bucketId, + _encodePath(bucketId), ); final Map apiParams = { @@ -131,11 +131,11 @@ class Storage extends Service { final String apiPath = '/storage/buckets/{bucketId}/files/{fileId}' .replaceAll( '{bucketId}', - bucketId, + _encodePath(bucketId), ) .replaceAll( '{fileId}', - fileId, + _encodePath(fileId), ); final Map apiParams = {}; @@ -178,11 +178,11 @@ class Storage extends Service { final String apiPath = '/storage/buckets/{bucketId}/files/{fileId}' .replaceAll( '{bucketId}', - bucketId, + _encodePath(bucketId), ) .replaceAll( '{fileId}', - fileId, + _encodePath(fileId), ); final Map apiParams = { @@ -227,11 +227,11 @@ class Storage extends Service { final String apiPath = '/storage/buckets/{bucketId}/files/{fileId}' .replaceAll( '{bucketId}', - bucketId, + _encodePath(bucketId), ) .replaceAll( '{fileId}', - fileId, + _encodePath(fileId), ); final Map apiParams = {}; @@ -275,11 +275,11 @@ class Storage extends Service { final String apiPath = '/storage/buckets/{bucketId}/files/{fileId}/download' .replaceAll( '{bucketId}', - bucketId, + _encodePath(bucketId), ) .replaceAll( '{fileId}', - fileId, + _encodePath(fileId), ); final Map apiParams = { @@ -337,11 +337,11 @@ class Storage extends Service { final String apiPath = '/storage/buckets/{bucketId}/files/{fileId}/preview' .replaceAll( '{bucketId}', - bucketId, + _encodePath(bucketId), ) .replaceAll( '{fileId}', - fileId, + _encodePath(fileId), ); final Map apiParams = { @@ -397,11 +397,11 @@ class Storage extends Service { final String apiPath = '/storage/buckets/{bucketId}/files/{fileId}/view' .replaceAll( '{bucketId}', - bucketId, + _encodePath(bucketId), ) .replaceAll( '{fileId}', - fileId, + _encodePath(fileId), ); final Map apiParams = { diff --git a/lib/services/tables_db.dart b/lib/services/tables_db.dart index 3ad93e30..c3914d57 100644 --- a/lib/services/tables_db.dart +++ b/lib/services/tables_db.dart @@ -71,7 +71,7 @@ class TablesDB extends Service { final String apiPath = '/tablesdb/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = {}; @@ -105,7 +105,7 @@ class TablesDB extends Service { final String apiPath = '/tablesdb/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = { @@ -141,7 +141,7 @@ class TablesDB extends Service { final String apiPath = '/tablesdb/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = {}; @@ -176,7 +176,7 @@ class TablesDB extends Service { final String apiPath = '/tablesdb/transactions/{transactionId}/operations' .replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = { @@ -232,11 +232,11 @@ class TablesDB extends Service { final String apiPath = '/tablesdb/{databaseId}/tables/{tableId}/rows' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ); final Map apiParams = { @@ -288,11 +288,11 @@ class TablesDB extends Service { final String apiPath = '/tablesdb/{databaseId}/tables/{tableId}/rows' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ); final Map apiParams = { @@ -345,11 +345,11 @@ class TablesDB extends Service { final String apiPath = '/tablesdb/{databaseId}/tables/{tableId}/rows/query' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ); final Map apiParams = { @@ -406,15 +406,15 @@ class TablesDB extends Service { '/tablesdb/{databaseId}/tables/{tableId}/rows/{rowId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ) .replaceAll( '{rowId}', - rowId, + _encodePath(rowId), ); final Map apiParams = { @@ -471,15 +471,15 @@ class TablesDB extends Service { '/tablesdb/{databaseId}/tables/{tableId}/rows/{rowId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ) .replaceAll( '{rowId}', - rowId, + _encodePath(rowId), ); final Map apiParams = { @@ -536,15 +536,15 @@ class TablesDB extends Service { '/tablesdb/{databaseId}/tables/{tableId}/rows/{rowId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ) .replaceAll( '{rowId}', - rowId, + _encodePath(rowId), ); final Map apiParams = { @@ -598,15 +598,15 @@ class TablesDB extends Service { '/tablesdb/{databaseId}/tables/{tableId}/rows/{rowId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ) .replaceAll( '{rowId}', - rowId, + _encodePath(rowId), ); final Map apiParams = { @@ -667,19 +667,19 @@ class TablesDB extends Service { '/tablesdb/{databaseId}/tables/{tableId}/rows/{rowId}/{column}/decrement' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ) .replaceAll( '{rowId}', - rowId, + _encodePath(rowId), ) .replaceAll( '{column}', - column, + _encodePath(column), ); final Map apiParams = { @@ -742,19 +742,19 @@ class TablesDB extends Service { '/tablesdb/{databaseId}/tables/{tableId}/rows/{rowId}/{column}/increment' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ) .replaceAll( '{rowId}', - rowId, + _encodePath(rowId), ) .replaceAll( '{column}', - column, + _encodePath(column), ); final Map apiParams = { diff --git a/lib/services/teams.dart b/lib/services/teams.dart index 307318db..7674d795 100644 --- a/lib/services/teams.dart +++ b/lib/services/teams.dart @@ -80,7 +80,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = {}; @@ -113,7 +113,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = { @@ -149,7 +149,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = {}; @@ -184,7 +184,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/installations'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = { @@ -224,7 +224,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/installations'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = { @@ -270,11 +270,11 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/installations/{installationId}' .replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ) .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = {}; @@ -318,11 +318,11 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/installations/{installationId}' .replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ) .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = { @@ -368,11 +368,11 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/installations/{installationId}' .replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ) .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = {}; @@ -410,7 +410,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/memberships'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = { @@ -472,7 +472,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/memberships'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = { @@ -523,11 +523,11 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/memberships/{membershipId}' .replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ) .replaceAll( '{membershipId}', - membershipId, + _encodePath(membershipId), ); final Map apiParams = {}; @@ -570,11 +570,11 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/memberships/{membershipId}' .replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ) .replaceAll( '{membershipId}', - membershipId, + _encodePath(membershipId), ); final Map apiParams = { @@ -619,11 +619,11 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/memberships/{membershipId}' .replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ) .replaceAll( '{membershipId}', - membershipId, + _encodePath(membershipId), ); final Map apiParams = {}; @@ -671,11 +671,11 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/memberships/{membershipId}/status' .replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ) .replaceAll( '{membershipId}', - membershipId, + _encodePath(membershipId), ); final Map apiParams = { @@ -713,7 +713,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/prefs'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = {}; @@ -748,7 +748,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/prefs'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = { diff --git a/lib/services/vectors_db.dart b/lib/services/vectors_db.dart index fddd1087..45ce942e 100644 --- a/lib/services/vectors_db.dart +++ b/lib/services/vectors_db.dart @@ -69,7 +69,7 @@ class VectorsDB extends Service { final String apiPath = '/vectorsdb/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = {}; @@ -103,7 +103,7 @@ class VectorsDB extends Service { final String apiPath = '/vectorsdb/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = { @@ -139,7 +139,7 @@ class VectorsDB extends Service { final String apiPath = '/vectorsdb/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = {}; @@ -174,7 +174,7 @@ class VectorsDB extends Service { final String apiPath = '/vectorsdb/transactions/{transactionId}/operations' .replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = { @@ -223,11 +223,11 @@ class VectorsDB extends Service { '/vectorsdb/{databaseId}/collections/{collectionId}/documents' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -280,11 +280,11 @@ class VectorsDB extends Service { '/vectorsdb/{databaseId}/collections/{collectionId}/documents' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -338,11 +338,11 @@ class VectorsDB extends Service { '/vectorsdb/{databaseId}/collections/{collectionId}/documents/query' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -399,15 +399,15 @@ class VectorsDB extends Service { '/vectorsdb/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -464,15 +464,15 @@ class VectorsDB extends Service { '/vectorsdb/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -529,15 +529,15 @@ class VectorsDB extends Service { '/vectorsdb/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -591,15 +591,15 @@ class VectorsDB extends Service { '/vectorsdb/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { diff --git a/lib/src/client_browser.dart b/lib/src/client_browser.dart index ab689f04..aed903a6 100644 --- a/lib/src/client_browser.dart +++ b/lib/src/client_browser.dart @@ -40,8 +40,8 @@ class ClientBrowser extends ClientBase with ClientMixin { 'x-sdk-name': 'Flutter', 'x-sdk-platform': 'client', 'x-sdk-language': 'flutter', - 'x-sdk-version': '28.1.0', - 'X-Appwrite-Response-Format': '2.5.0', + 'x-sdk-version': '28.2.0', + 'X-Appwrite-Response-Format': '2.6.2', }; config = {}; @@ -237,7 +237,7 @@ class ClientBrowser extends ClientBase with ClientMixin { try { res = await call( HttpMethod.get, - path: '$path/${params[idParamName]}', + path: '$path/${Uri.encodeComponent(params[idParamName].toString())}', headers: headers, ); final int chunksUploaded = res.data['chunksUploaded'] as int; diff --git a/lib/src/client_io.dart b/lib/src/client_io.dart index 5d91c62c..7250e0f8 100644 --- a/lib/src/client_io.dart +++ b/lib/src/client_io.dart @@ -59,8 +59,8 @@ class ClientIO extends ClientBase with ClientMixin { 'x-sdk-name': 'Flutter', 'x-sdk-platform': 'client', 'x-sdk-language': 'flutter', - 'x-sdk-version': '28.1.0', - 'X-Appwrite-Response-Format': '2.5.0', + 'x-sdk-version': '28.2.0', + 'X-Appwrite-Response-Format': '2.6.2', }; config = {}; @@ -368,7 +368,7 @@ class ClientIO extends ClientBase with ClientMixin { try { res = await call( HttpMethod.get, - path: '$path/${params[idParamName]}', + path: '$path/${Uri.encodeComponent(params[idParamName].toString())}', headers: headers, ); final int chunksUploaded = res.data['chunksUploaded'] as int; diff --git a/pubspec.yaml b/pubspec.yaml index 2147f32e..78e84c3f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: appwrite -version: 28.1.0 +version: 28.2.0 description: Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API homepage: https://appwrite.io repository: https://github.com/appwrite/sdk-for-flutter diff --git a/test/services/account_test.dart b/test/services/account_test.dart index 3a712b73..3b64c48e 100644 --- a/test/services/account_test.dart +++ b/test/services/account_test.dart @@ -113,7 +113,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -151,6 +151,7 @@ void main() { userId: "", email: "email@example.com", password: "password", + name: "", ); final Map params = verify( client.call( @@ -161,7 +162,12 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "email", "password"])); + expect(params, { + "userId": "", + "email": "email@example.com", + "password": "password", + "name": "", + }); expect(response, isA()); }); @@ -181,7 +187,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.listConsents(); + final response = await account.listConsents( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -191,7 +200,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -226,13 +238,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/account/consents/", + path: "/account/consents/%3CCONSENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -255,13 +267,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/account/consents/", + path: "/account/consents/%3CCONSENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method listConsentTokens()', () async { @@ -282,17 +294,22 @@ void main() { final response = await account.listConsentTokens( consentId: "", + queries: [], + total: false, ); final Map params = verify( client.call( HttpMethod.get, - path: "/account/consents//tokens", + path: "/account/consents/%3CCONSENT_ID%3E/tokens", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -329,13 +346,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/account/consents//tokens/", + path: "/account/consents/%3CCONSENT_ID%3E/tokens/%3CTOKEN_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -359,13 +376,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/account/consents//tokens/", + path: "/account/consents/%3CCONSENT_ID%3E/tokens/%3CTOKEN_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method updateEmail()', () async { @@ -411,7 +428,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["email", "password"])); + expect(params, { + "email": "email@example.com", + "password": "password", + }); expect(response, isA()); }); @@ -431,7 +451,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.listIdentities(); + final response = await account.listIdentities( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -441,7 +464,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -464,13 +490,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/account/identities/", + path: "/account/identities/%3CIDENTITY_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method createJWT()', () async { @@ -489,7 +515,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.createJWT(); + final response = await account.createJWT( + duration: 1, + ); final Map params = verify( client.call( HttpMethod.post, @@ -499,7 +527,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "duration": 1, + }); expect(response, isA()); }); @@ -519,7 +549,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.listMemberships(); + final response = await account.listMemberships( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -529,7 +562,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -564,7 +600,7 @@ void main() { ).thenAnswer((_) async => Response(data: data)); final response = await account.updateMFA( - mfa: true, + mfa: false, ); final Map params = verify( client.call( @@ -575,7 +611,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["mfa"])); + expect(params, { + "mfa": false, + }); expect(response, isA()); }); @@ -608,7 +646,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -641,7 +679,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -688,7 +726,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["otp"])); + expect(params, { + "otp": "", + }); expect(response, isA()); }); @@ -735,7 +775,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["otp"])); + expect(params, { + "otp": "", + }); expect(response, isA()); }); @@ -764,7 +806,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method deleteMFAAuthenticator()', () async { @@ -792,7 +834,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method createMfaChallenge()', () async { @@ -825,7 +867,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["factor"])); + expect(params, { + "factor": enums.AuthenticationFactor.email.value, + }); expect(response, isA()); }); @@ -859,7 +903,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["factor"])); + expect(params, { + "factor": enums.AuthenticationFactor.email.value, + }); expect(response, isA()); }); @@ -919,7 +965,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["challengeId", "otp"])); + expect(params, { + "challengeId": "", + "otp": "", + }); expect(response, isA()); }); @@ -979,7 +1028,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["challengeId", "otp"])); + expect(params, { + "challengeId": "", + "otp": "", + }); expect(response, isA()); }); @@ -1012,7 +1064,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1045,7 +1097,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1074,7 +1126,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1103,7 +1155,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1132,7 +1184,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1161,7 +1213,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1190,7 +1242,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1219,7 +1271,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1265,7 +1317,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["name"])); + expect(params, { + "name": "", + }); expect(response, isA()); }); @@ -1285,7 +1339,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.listPasskeys(); + final response = await account.listPasskeys( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -1295,7 +1352,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -1318,7 +1378,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.createPasskey(); + final response = await account.createPasskey( + passkeyId: "", + name: "", + ); final Map params = verify( client.call( HttpMethod.post, @@ -1328,7 +1391,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "passkeyId": "", + "name": "", + }); expect(response, isA()); }); @@ -1357,13 +1423,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/account/passkeys/", + path: "/account/passkeys/%3CPASSKEY_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1393,13 +1459,15 @@ void main() { final Map params = verify( client.call( HttpMethod.patch, - path: "/account/passkeys/", + path: "/account/passkeys/%3CPASSKEY_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["name"])); + expect(params, { + "name": "", + }); expect(response, isA()); }); @@ -1422,13 +1490,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/account/passkeys/", + path: "/account/passkeys/%3CPASSKEY_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method updatePasskeyVerification()', () async { @@ -1457,13 +1525,15 @@ void main() { final Map params = verify( client.call( HttpMethod.put, - path: "/account/passkeys//verification", + path: "/account/passkeys/%3CPASSKEY_ID%3E/verification", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["credential"])); + expect(params, { + "credential": isA(), + }); expect(response, isA()); }); @@ -1499,6 +1569,7 @@ void main() { final response = await account.updatePassword( password: "password", + oldPassword: "password", ); final Map params = verify( client.call( @@ -1509,7 +1580,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["password"])); + expect(params, { + "password": "password", + "oldPassword": "password", + }); expect(response, isA()); }); @@ -1556,7 +1630,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["phone", "password"])); + expect(params, { + "phone": "+12065550100", + "password": "password", + }); expect(response, isA()); }); @@ -1583,7 +1660,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1629,7 +1706,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["prefs"])); + expect(params, { + "prefs": isA(), + }); expect(response, isA()); }); @@ -1666,7 +1745,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["email", "url"])); + expect(params, { + "email": "email@example.com", + "url": "https://example.com", + }); expect(response, isA()); }); @@ -1704,7 +1786,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret", "password"])); + expect(params, { + "userId": "", + "secret": "", + "password": "password", + }); expect(response, isA()); }); @@ -1730,6 +1816,7 @@ void main() { final response = await account.createRecoveryOTP( email: "email@example.com", + phrase: false, ); final Map params = verify( client.call( @@ -1740,7 +1827,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["email"])); + expect(params, { + "email": "email@example.com", + "phrase": false, + }); expect(response, isA()); }); @@ -1778,7 +1868,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret", "password"])); + expect(params, { + "userId": "", + "secret": "", + "password": "password", + }); expect(response, isA()); }); @@ -1798,7 +1892,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.listSessions(); + final response = await account.listSessions( + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -1808,7 +1904,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "total": false, + }); expect(response, isA()); }); @@ -1825,7 +1923,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.deleteSessions(); + final response = await account.deleteSessions( + current: false, + ); final Map params = verify( client.call( HttpMethod.delete, @@ -1835,7 +1935,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "current": false, + }); }); test('test method createAnonymousSession()', () async { @@ -1891,7 +1993,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1941,6 +2043,7 @@ void main() { final response = await account.createEmailPasswordSession( email: "email@example.com", password: "password", + duration: 1, ); final Map params = verify( client.call( @@ -1951,7 +2054,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["email", "password"])); + expect(params, { + "email": "email@example.com", + "password": "password", + "duration": 1, + }); expect(response, isA()); }); @@ -2001,6 +2108,10 @@ void main() { final response = await account.createIdTokenSession( provider: enums.IdTokenProvider.apple, idToken: "", + nonce: "", + accessToken: "", + accessTokenExpiry: 1, + name: "", ); final Map params = verify( client.call( @@ -2011,7 +2122,14 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["provider", "idToken"])); + expect(params, { + "provider": enums.IdTokenProvider.apple.value, + "idToken": "", + "nonce": "", + "accessToken": "", + "accessTokenExpiry": 1, + "name": "", + }); expect(response, isA()); }); @@ -2071,7 +2189,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret"])); + expect(params, { + "userId": "", + "secret": "", + }); expect(response, isA()); }); @@ -2082,9 +2203,16 @@ void main() { final response = await account.createOAuth2Session( provider: enums.OAuthProvider.amazon, + success: "https://example.com", + failure: "https://example.com", + scopes: [], + state: "", ); final Uri url = verify(client.webAuth(captureAny)).captured.single; expect(Uri.decodeFull(url.path), "/v1/account/sessions/oauth2/amazon"); + expect(url.queryParameters["success"], "https://example.com"); + expect(url.queryParameters["failure"], "https://example.com"); + expect(url.queryParameters["state"], ""); expect(response, equals('done')); }); @@ -2144,7 +2272,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret"])); + expect(params, { + "userId": "", + "secret": "", + }); expect(response, isA()); }); @@ -2204,7 +2335,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret"])); + expect(params, { + "userId": "", + "secret": "", + }); expect(response, isA()); }); @@ -2257,13 +2391,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/account/sessions/", + path: "/account/sessions/%3CSESSION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -2316,13 +2450,13 @@ void main() { final Map params = verify( client.call( HttpMethod.patch, - path: "/account/sessions/", + path: "/account/sessions/%3CSESSION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -2345,13 +2479,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/account/sessions/", + path: "/account/sessions/%3CSESSION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method updateStatus()', () async { @@ -2394,7 +2528,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -2423,6 +2557,9 @@ void main() { final response = await account.createPushTarget( targetId: "", identifier: "", + providerId: "", + bundleId: "", + environment: "sandbox", ); final Map params = verify( client.call( @@ -2433,7 +2570,13 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["targetId", "identifier"])); + expect(params, { + "targetId": "", + "identifier": "", + "providerId": "", + "bundleId": "", + "environment": "sandbox", + }); expect(response, isA()); }); @@ -2462,17 +2605,23 @@ void main() { final response = await account.updatePushTarget( targetId: "", identifier: "", + bundleId: "", + environment: "sandbox", ); final Map params = verify( client.call( HttpMethod.put, - path: "/account/targets//push", + path: "/account/targets/%3CTARGET_ID%3E/push", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["identifier"])); + expect(params, { + "identifier": "", + "bundleId": "", + "environment": "sandbox", + }); expect(response, isA()); }); @@ -2495,13 +2644,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/account/targets//push", + path: "/account/targets/%3CTARGET_ID%3E/push", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method createEmailToken()', () async { @@ -2527,6 +2676,7 @@ void main() { final response = await account.createEmailToken( userId: "", email: "email@example.com", + phrase: false, ); final Map params = verify( client.call( @@ -2537,7 +2687,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "email"])); + expect(params, { + "userId": "", + "email": "email@example.com", + "phrase": false, + }); expect(response, isA()); }); @@ -2564,6 +2718,8 @@ void main() { final response = await account.createMagicURLToken( userId: "", email: "email@example.com", + url: "https://example.com", + phrase: false, ); final Map params = verify( client.call( @@ -2574,7 +2730,12 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "email"])); + expect(params, { + "userId": "", + "email": "email@example.com", + "url": "https://example.com", + "phrase": false, + }); expect(response, isA()); }); @@ -2585,9 +2746,16 @@ void main() { final response = await account.createOAuth2Token( provider: enums.OAuthProvider.amazon, + success: "https://example.com", + failure: "https://example.com", + scopes: [], + state: "", ); final Uri url = verify(client.webAuth(captureAny)).captured.single; expect(Uri.decodeFull(url.path), "/v1/account/tokens/oauth2/amazon"); + expect(url.queryParameters["success"], "https://example.com"); + expect(url.queryParameters["failure"], "https://example.com"); + expect(url.queryParameters["state"], ""); expect(response, equals('done')); }); @@ -2620,7 +2788,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -2657,7 +2825,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["challengeId", "credential"])); + expect(params, { + "challengeId": "", + "credential": isA(), + }); expect(response, isA()); }); @@ -2694,7 +2865,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "phone"])); + expect(params, { + "userId": "", + "phone": "+12065550100", + }); expect(response, isA()); }); @@ -2730,7 +2904,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["url"])); + expect(params, { + "url": "https://example.com", + }); expect(response, isA()); }); @@ -2766,7 +2942,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["url"])); + expect(params, { + "url": "https://example.com", + }); expect(response, isA()); }); @@ -2803,7 +2981,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret"])); + expect(params, { + "userId": "", + "secret": "", + }); expect(response, isA()); }); @@ -2840,7 +3021,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret"])); + expect(params, { + "userId": "", + "secret": "", + }); expect(response, isA()); }); @@ -2864,7 +3048,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.createEmailVerificationOTP(); + final response = await account.createEmailVerificationOTP( + phrase: false, + ); final Map params = verify( client.call( HttpMethod.post, @@ -2874,7 +3060,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "phrase": false, + }); expect(response, isA()); }); @@ -2911,7 +3099,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret"])); + expect(params, { + "userId": "", + "secret": "", + }); expect(response, isA()); }); @@ -2945,7 +3136,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -2982,7 +3173,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret"])); + expect(params, { + "userId": "", + "secret": "", + }); expect(response, isA()); }); }); diff --git a/test/services/analytics_test.dart b/test/services/analytics_test.dart index 559e6e1b..b270a8fd 100644 --- a/test/services/analytics_test.dart +++ b/test/services/analytics_test.dart @@ -90,17 +90,40 @@ void main() { propertyId: "", name: "", url: "https://example.com", + domain: "", + referrer: "", + screenWidth: 1, + sessionHash: "", + scrollDepth: 1, + engagementTime: 1, + props: [], + userId: "", + ip: "", + userAgent: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/analytics/properties//events", + path: "/analytics/properties/%3CPROPERTY_ID%3E/events", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["name", "url"])); + expect(params, { + "name": "", + "url": "https://example.com", + "domain": "", + "referrer": "", + "screenWidth": 1, + "sessionHash": "", + "scrollDepth": 1, + "engagementTime": 1, + "props": isA(), + "userId": "", + "ip": "", + "userAgent": "", + }); }); }); } diff --git a/test/services/apps_test.dart b/test/services/apps_test.dart index f5d6e730..93ad5926 100644 --- a/test/services/apps_test.dart +++ b/test/services/apps_test.dart @@ -89,7 +89,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await apps.list(); + final response = await apps.list( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -99,7 +102,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -147,6 +153,22 @@ void main() { appId: "", name: "", redirectUris: [], + description: "", + clientUri: "https://example.com", + logoUri: "https://example.com", + privacyPolicyUrl: "https://example.com", + termsUrl: "https://example.com", + contacts: [], + tagline: "", + tags: [], + images: [], + supportUrl: "https://example.com", + dataDeletionUrl: "https://example.com", + postLogoutRedirectUris: [], + enabled: false, + type: "public", + deviceFlow: false, + teamId: "", ); final Map params = verify( client.call( @@ -157,7 +179,27 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["appId", "name", "redirectUris"])); + expect(params, { + "appId": "", + "name": "", + "description": "", + "clientUri": "https://example.com", + "logoUri": "https://example.com", + "privacyPolicyUrl": "https://example.com", + "termsUrl": "https://example.com", + "contacts": isA(), + "tagline": "", + "tags": isA(), + "images": isA(), + "supportUrl": "https://example.com", + "dataDeletionUrl": "https://example.com", + "redirectUris": isA(), + "postLogoutRedirectUris": isA(), + "enabled": false, + "type": "public", + "deviceFlow": false, + "teamId": "", + }); expect(response, isA()); }); @@ -187,7 +229,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -217,7 +259,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -267,13 +309,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/apps/", + path: "/apps/%3CAPP_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -320,17 +362,55 @@ void main() { final response = await apps.update( appId: "", name: "", + description: "", + clientUri: "https://example.com", + logoUri: "https://example.com", + privacyPolicyUrl: "https://example.com", + termsUrl: "https://example.com", + contacts: [], + tagline: "", + tags: [], + images: [], + supportUrl: "https://example.com", + dataDeletionUrl: "https://example.com", + enabled: false, + redirectUris: [], + postLogoutRedirectUris: [], + type: "public", + deviceFlow: false, + installationScopes: [], + installationRedirectUrl: "https://example.com", ); final Map params = verify( client.call( HttpMethod.put, - path: "/apps/", + path: "/apps/%3CAPP_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["name"])); + expect(params, { + "name": "", + "description": "", + "clientUri": "https://example.com", + "logoUri": "https://example.com", + "privacyPolicyUrl": "https://example.com", + "termsUrl": "https://example.com", + "contacts": isA(), + "tagline": "", + "tags": isA(), + "images": isA(), + "supportUrl": "https://example.com", + "dataDeletionUrl": "https://example.com", + "enabled": false, + "redirectUris": isA(), + "postLogoutRedirectUris": isA(), + "type": "public", + "deviceFlow": false, + "installationScopes": isA(), + "installationRedirectUrl": "https://example.com", + }); expect(response, isA()); }); @@ -353,13 +433,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/apps/", + path: "/apps/%3CAPP_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method listInstallations()', () async { @@ -380,17 +460,22 @@ void main() { final response = await apps.listInstallations( appId: "", + queries: [], + total: false, ); final Map params = verify( client.call( HttpMethod.get, - path: "/apps//installations", + path: "/apps/%3CAPP_ID%3E/installations", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -424,13 +509,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/apps//installations/", + path: "/apps/%3CAPP_ID%3E/installations/%3CINSTALLATION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -454,13 +539,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/apps//installations/", + path: "/apps/%3CAPP_ID%3E/installations/%3CINSTALLATION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method createInstallationToken()', () async { @@ -489,13 +574,13 @@ void main() { final Map params = verify( client.call( HttpMethod.post, - path: "/apps//installations//tokens", + path: "/apps/%3CAPP_ID%3E/installations/%3CINSTALLATION_ID%3E/tokens", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -517,17 +602,22 @@ void main() { final response = await apps.listKeys( appId: "", + queries: [], + total: false, ); final Map params = verify( client.call( HttpMethod.get, - path: "/apps//keys", + path: "/apps/%3CAPP_ID%3E/keys", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -560,13 +650,13 @@ void main() { final Map params = verify( client.call( HttpMethod.post, - path: "/apps//keys", + path: "/apps/%3CAPP_ID%3E/keys", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -600,13 +690,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/apps//keys/", + path: "/apps/%3CAPP_ID%3E/keys/%3CKEY_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -630,13 +720,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/apps//keys/", + path: "/apps/%3CAPP_ID%3E/keys/%3CKEY_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method listSecrets()', () async { @@ -657,17 +747,22 @@ void main() { final response = await apps.listSecrets( appId: "", + queries: [], + total: false, ); final Map params = verify( client.call( HttpMethod.get, - path: "/apps//secrets", + path: "/apps/%3CAPP_ID%3E/secrets", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -700,13 +795,13 @@ void main() { final Map params = verify( client.call( HttpMethod.post, - path: "/apps//secrets", + path: "/apps/%3CAPP_ID%3E/secrets", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -739,13 +834,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/apps//secrets/", + path: "/apps/%3CAPP_ID%3E/secrets/%3CSECRET_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -769,13 +864,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/apps//secrets/", + path: "/apps/%3CAPP_ID%3E/secrets/%3CSECRET_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method updateTeam()', () async { @@ -825,13 +920,15 @@ void main() { final Map params = verify( client.call( HttpMethod.patch, - path: "/apps//team", + path: "/apps/%3CAPP_ID%3E/team", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["teamId"])); + expect(params, { + "teamId": "", + }); expect(response, isA()); }); @@ -854,13 +951,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/apps//tokens", + path: "/apps/%3CAPP_ID%3E/tokens", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); }); } diff --git a/test/services/avatars_test.dart b/test/services/avatars_test.dart index 16f91365..aff83830 100644 --- a/test/services/avatars_test.dart +++ b/test/services/avatars_test.dart @@ -88,6 +88,9 @@ void main() { final response = await avatars.getBrowser( code: enums.Browser.avantBrowser, + width: 1, + height: 1, + quality: 1, ); final Map params = verify( client.call( @@ -98,7 +101,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "width": 1, + "height": 1, + "quality": 1, + }); expect(response, isA()); }); @@ -117,6 +124,9 @@ void main() { final response = await avatars.getCreditCard( code: enums.CreditCard.americanExpress, + width: 1, + height: 1, + quality: 1, ); final Map params = verify( client.call( @@ -127,7 +137,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "width": 1, + "height": 1, + "quality": 1, + }); expect(response, isA()); }); @@ -156,7 +170,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["url"])); + expect(params, { + "url": "https://example.com", + }); expect(response, isA()); }); @@ -175,6 +191,9 @@ void main() { final response = await avatars.getFlag( code: enums.Flag.afghanistan, + width: 1, + height: 1, + quality: 1, ); final Map params = verify( client.call( @@ -185,7 +204,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "width": 1, + "height": 1, + "quality": 1, + }); expect(response, isA()); }); @@ -204,6 +227,8 @@ void main() { final response = await avatars.getImage( url: "https://example.com", + width: 1, + height: 1, ); final Map params = verify( client.call( @@ -214,7 +239,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["url"])); + expect(params, { + "url": "https://example.com", + "width": 1, + "height": 1, + }); expect(response, isA()); }); @@ -231,7 +260,12 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await avatars.getInitials(); + final response = await avatars.getInitials( + name: "", + width: 1, + height: 1, + background: "FFFFFF", + ); final Map params = verify( client.call( HttpMethod.get, @@ -241,7 +275,12 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "name": "", + "width": 1, + "height": 1, + "background": "FFFFFF", + }); expect(response, isA()); }); @@ -258,7 +297,16 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await avatars.getPhoto(); + final response = await avatars.getPhoto( + width: 1, + height: 1, + quality: 1, + output: "png", + rating: "g", + userId: "current()", + emailHash: "", + name: "", + ); final Map params = verify( client.call( HttpMethod.get, @@ -268,7 +316,16 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "width": 1, + "height": 1, + "quality": 1, + "output": "png", + "rating": "g", + "userId": "current()", + "emailHash": "", + "name": "", + }); expect(response, isA()); }); @@ -316,7 +373,9 @@ void main() { method: HttpMethod.put, ), ).captured.single; - expect(params.keys, unorderedEquals(["file"])); + expect(params, { + "file": isA(), + }); expect(response, isA()); }); @@ -343,7 +402,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method getQR()', () async { @@ -361,6 +420,9 @@ void main() { final response = await avatars.getQR( text: "", + size: 1, + margin: 1, + download: false, ); final Map params = verify( client.call( @@ -371,7 +433,12 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["text"])); + expect(params, { + "text": "", + "size": 1, + "margin": 1, + "download": false, + }); expect(response, isA()); }); @@ -390,6 +457,25 @@ void main() { final response = await avatars.getScreenshot( url: "https://example.com", + headers: {}, + viewportWidth: 1, + viewportHeight: 1, + scale: 1.0, + theme: enums.BrowserTheme.dark, + userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15", + fullpage: false, + locale: "en-US", + timezone: enums.Timezone.africaAbidjan, + latitude: 1.0, + longitude: 1.0, + accuracy: 1.0, + touch: false, + permissions: [enums.BrowserPermission.geolocation, enums.BrowserPermission.notifications], + sleep: 1, + width: 1, + height: 1, + quality: 1, + output: enums.ImageFormat.jpeg, ); final Map params = verify( client.call( @@ -400,7 +486,28 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["url"])); + expect(params, { + "url": "https://example.com", + "headers": isA(), + "viewportWidth": 1, + "viewportHeight": 1, + "scale": 1.0, + "theme": enums.BrowserTheme.dark.value, + "userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15", + "fullpage": false, + "locale": "en-US", + "timezone": enums.Timezone.africaAbidjan.value, + "latitude": 1.0, + "longitude": 1.0, + "accuracy": 1.0, + "touch": false, + "permissions": isA(), + "sleep": 1, + "width": 1, + "height": 1, + "quality": 1, + "output": enums.ImageFormat.jpeg.value, + }); expect(response, isA()); }); }); diff --git a/test/services/databases_test.dart b/test/services/databases_test.dart index f341f304..0523d431 100644 --- a/test/services/databases_test.dart +++ b/test/services/databases_test.dart @@ -89,7 +89,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await databases.listTransactions(); + final response = await databases.listTransactions( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -99,7 +102,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -123,7 +129,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await databases.createTransaction(); + final response = await databases.createTransaction( + ttl: 1, + ); final Map params = verify( client.call( HttpMethod.post, @@ -133,7 +141,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "ttl": 1, + }); expect(response, isA()); }); @@ -163,13 +173,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/databases/transactions/", + path: "/databases/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -195,17 +205,22 @@ void main() { final response = await databases.updateTransaction( transactionId: "", + commit: false, + rollback: false, ); final Map params = verify( client.call( HttpMethod.patch, - path: "/databases/transactions/", + path: "/databases/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "commit": false, + "rollback": false, + }); expect(response, isA()); }); @@ -228,13 +243,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/databases/transactions/", + path: "/databases/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method createOperations()', () async { @@ -259,17 +274,20 @@ void main() { final response = await databases.createOperations( transactionId: "", + operations: [], ); final Map params = verify( client.call( HttpMethod.post, - path: "/databases/transactions//operations", + path: "/databases/transactions/%3CTRANSACTION_ID%3E/operations", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "operations": isA(), + }); expect(response, isA()); }); @@ -292,17 +310,26 @@ void main() { final response = await databases.listDocuments( databaseId: "", collectionId: "", + queries: [], + transactionId: "", + total: false, + ttl: 1, ); final Map params = verify( client.call( HttpMethod.get, - path: "/databases//collections//documents", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -332,17 +359,24 @@ void main() { collectionId: "", documentId: "", data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/databases//collections//documents", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["documentId", "data"])); + expect(params, { + "documentId": "", + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -365,17 +399,26 @@ void main() { final response = await databases.createQuery( databaseId: "", collectionId: "", + queries: [], + transactionId: "", + total: false, + ttl: 1, ); final Map params = verify( client.call( HttpMethod.post, - path: "/databases//collections//documents/query", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/query", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -404,17 +447,22 @@ void main() { databaseId: "", collectionId: "", documentId: "", + queries: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.get, - path: "/databases//collections//documents/", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -443,17 +491,24 @@ void main() { databaseId: "", collectionId: "", documentId: "", + data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.put, - path: "/databases//collections//documents/", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -482,17 +537,24 @@ void main() { databaseId: "", collectionId: "", documentId: "", + data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/databases//collections//documents/", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -513,17 +575,20 @@ void main() { databaseId: "", collectionId: "", documentId: "", + transactionId: "", ); final Map params = verify( client.call( HttpMethod.delete, - path: "/databases//collections//documents/", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "transactionId": "", + }); }); test('test method decrementDocumentAttribute()', () async { @@ -552,17 +617,24 @@ void main() { collectionId: "", documentId: "", attribute: "", + value: 1.0, + min: 1.0, + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/databases//collections//documents///decrement", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E/%3CATTRIBUTE%3E/decrement", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "value": 1.0, + "min": 1.0, + "transactionId": "", + }); expect(response, isA()); }); @@ -592,17 +664,24 @@ void main() { collectionId: "", documentId: "", attribute: "", + value: 1.0, + max: 1.0, + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/databases//collections//documents///increment", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E/%3CATTRIBUTE%3E/increment", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "value": 1.0, + "max": 1.0, + "transactionId": "", + }); expect(response, isA()); }); }); diff --git a/test/services/documents_db_test.dart b/test/services/documents_db_test.dart index e6cd7d0b..d69530b4 100644 --- a/test/services/documents_db_test.dart +++ b/test/services/documents_db_test.dart @@ -89,7 +89,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await documentsDB.listTransactions(); + final response = await documentsDB.listTransactions( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -99,7 +102,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -123,7 +129,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await documentsDB.createTransaction(); + final response = await documentsDB.createTransaction( + ttl: 1, + ); final Map params = verify( client.call( HttpMethod.post, @@ -133,7 +141,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "ttl": 1, + }); expect(response, isA()); }); @@ -163,13 +173,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/documentsdb/transactions/", + path: "/documentsdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -195,17 +205,22 @@ void main() { final response = await documentsDB.updateTransaction( transactionId: "", + commit: false, + rollback: false, ); final Map params = verify( client.call( HttpMethod.patch, - path: "/documentsdb/transactions/", + path: "/documentsdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "commit": false, + "rollback": false, + }); expect(response, isA()); }); @@ -228,13 +243,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/documentsdb/transactions/", + path: "/documentsdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method createOperations()', () async { @@ -259,17 +274,20 @@ void main() { final response = await documentsDB.createOperations( transactionId: "", + operations: [], ); final Map params = verify( client.call( HttpMethod.post, - path: "/documentsdb/transactions//operations", + path: "/documentsdb/transactions/%3CTRANSACTION_ID%3E/operations", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "operations": isA(), + }); expect(response, isA()); }); @@ -292,17 +310,26 @@ void main() { final response = await documentsDB.listDocuments( databaseId: "", collectionId: "", + queries: [], + transactionId: "", + total: false, + ttl: 1, ); final Map params = verify( client.call( HttpMethod.get, - path: "/documentsdb//collections//documents", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -332,17 +359,24 @@ void main() { collectionId: "", documentId: "", data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/documentsdb//collections//documents", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["documentId", "data"])); + expect(params, { + "documentId": "", + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -366,17 +400,21 @@ void main() { databaseId: "", collectionId: "", documents: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/documentsdb//collections//documents", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["documents"])); + expect(params, { + "documents": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -399,17 +437,26 @@ void main() { final response = await documentsDB.createQuery( databaseId: "", collectionId: "", + queries: [], + transactionId: "", + total: false, + ttl: 1, ); final Map params = verify( client.call( HttpMethod.post, - path: "/documentsdb//collections//documents/query", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/query", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -438,17 +485,22 @@ void main() { databaseId: "", collectionId: "", documentId: "", + queries: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.get, - path: "/documentsdb//collections//documents/", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -477,17 +529,24 @@ void main() { databaseId: "", collectionId: "", documentId: "", + data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.put, - path: "/documentsdb//collections//documents/", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -516,17 +575,24 @@ void main() { databaseId: "", collectionId: "", documentId: "", + data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/documentsdb//collections//documents/", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -547,17 +613,20 @@ void main() { databaseId: "", collectionId: "", documentId: "", + transactionId: "", ); final Map params = verify( client.call( HttpMethod.delete, - path: "/documentsdb//collections//documents/", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "transactionId": "", + }); }); test('test method decrementDocumentAttribute()', () async { @@ -586,17 +655,24 @@ void main() { collectionId: "", documentId: "", attribute: "", + value: 1.0, + min: 1.0, + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/documentsdb//collections//documents///decrement", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E/%3CATTRIBUTE%3E/decrement", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "value": 1.0, + "min": 1.0, + "transactionId": "", + }); expect(response, isA()); }); @@ -626,17 +702,24 @@ void main() { collectionId: "", documentId: "", attribute: "", + value: 1.0, + max: 1.0, + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/documentsdb//collections//documents///increment", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E/%3CATTRIBUTE%3E/increment", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "value": 1.0, + "max": 1.0, + "transactionId": "", + }); expect(response, isA()); }); }); diff --git a/test/services/functions_test.dart b/test/services/functions_test.dart index 05edea49..14a0c530 100644 --- a/test/services/functions_test.dart +++ b/test/services/functions_test.dart @@ -91,17 +91,22 @@ void main() { final response = await functions.listExecutions( functionId: "", + queries: [], + total: false, ); final Map params = verify( client.call( HttpMethod.get, - path: "/functions//executions", + path: "/functions/%3CFUNCTION_ID%3E/executions", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -139,17 +144,30 @@ void main() { final response = await functions.createExecution( functionId: "", + body: "", + xasync: false, + path: "", + method: enums.ExecutionMethod.gET, + headers: {}, + scheduledAt: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/functions//executions", + path: "/functions/%3CFUNCTION_ID%3E/executions", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "body": "", + "async": false, + "path": "", + "method": enums.ExecutionMethod.gET.value, + "headers": isA(), + "scheduledAt": "", + }); expect(response, isA()); }); @@ -192,13 +210,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/functions//executions/", + path: "/functions/%3CFUNCTION_ID%3E/executions/%3CEXECUTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); }); diff --git a/test/services/graphql_test.dart b/test/services/graphql_test.dart index 0afd4fa7..734afba3 100644 --- a/test/services/graphql_test.dart +++ b/test/services/graphql_test.dart @@ -98,7 +98,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["query"])); + expect(params, { + "query": isA(), + }); }); test('test method mutation()', () async { @@ -126,7 +128,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["query"])); + expect(params, { + "query": isA(), + }); }); }); } diff --git a/test/services/locale_test.dart b/test/services/locale_test.dart index b58bdcb3..48ae11e5 100644 --- a/test/services/locale_test.dart +++ b/test/services/locale_test.dart @@ -104,7 +104,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -124,7 +124,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await locale.listCodes(); + final response = await locale.listCodes( + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -134,7 +136,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "total": false, + }); expect(response, isA()); }); @@ -154,7 +158,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await locale.listContinents(); + final response = await locale.listContinents( + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -164,7 +170,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "total": false, + }); expect(response, isA()); }); @@ -184,7 +192,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await locale.listCountries(); + final response = await locale.listCountries( + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -194,7 +204,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "total": false, + }); expect(response, isA()); }); @@ -214,7 +226,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await locale.listCountriesEU(); + final response = await locale.listCountriesEU( + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -224,7 +238,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "total": false, + }); expect(response, isA()); }); @@ -244,7 +260,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await locale.listCountriesPhones(); + final response = await locale.listCountriesPhones( + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -254,7 +272,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "total": false, + }); expect(response, isA()); }); @@ -274,7 +294,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await locale.listCurrencies(); + final response = await locale.listCurrencies( + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -284,7 +306,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "total": false, + }); expect(response, isA()); }); @@ -304,7 +328,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await locale.listLanguages(); + final response = await locale.listLanguages( + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -314,7 +340,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "total": false, + }); expect(response, isA()); }); }); diff --git a/test/services/messaging_test.dart b/test/services/messaging_test.dart index 11fba0b9..db237091 100644 --- a/test/services/messaging_test.dart +++ b/test/services/messaging_test.dart @@ -113,13 +113,16 @@ void main() { final Map params = verify( client.call( HttpMethod.post, - path: "/messaging/topics//subscribers", + path: "/messaging/topics/%3CTOPIC_ID%3E/subscribers", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["subscriberId", "targetId"])); + expect(params, { + "subscriberId": "", + "targetId": "", + }); expect(response, isA()); }); @@ -143,13 +146,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/messaging/topics//subscribers/", + path: "/messaging/topics/%3CTOPIC_ID%3E/subscribers/%3CSUBSCRIBER_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); }); } diff --git a/test/services/oauth2_test.dart b/test/services/oauth2_test.dart index a8429a5f..7eea84ba 100644 --- a/test/services/oauth2_test.dart +++ b/test/services/oauth2_test.dart @@ -90,6 +90,8 @@ void main() { final response = await oauth2.approve( grantId: "", + authorizationDetails: "", + scope: "", ); final Map params = verify( client.call( @@ -100,7 +102,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["grant_id"])); + expect(params, { + "grant_id": "", + "authorization_details": "", + "scope": "", + }); expect(response, isA()); }); @@ -120,7 +126,22 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await oauth2.authorize(); + final response = await oauth2.authorize( + clientId: "", + redirectUri: "https://example.com", + responseType: "response_type", + scope: "", + state: "", + nonce: "", + codeChallenge: "", + codeChallengeMethod: "s256", + prompt: "", + maxAge: 1, + authorizationDetails: "", + resource: [], + audience: "", + requestUri: "", + ); final Map params = verify( client.call( HttpMethod.get, @@ -130,7 +151,22 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "client_id": "", + "redirect_uri": "https://example.com", + "response_type": "response_type", + "scope": "", + "state": "", + "nonce": "", + "code_challenge": "", + "code_challenge_method": "s256", + "prompt": "", + "max_age": 1, + "authorization_details": "", + "resource": isA(), + "audience": "", + "request_uri": "", + }); expect(response, isA()); }); @@ -150,7 +186,22 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await oauth2.authorizePost(); + final response = await oauth2.authorizePost( + clientId: "", + redirectUri: "https://example.com", + responseType: "response_type", + scope: "", + state: "", + nonce: "", + codeChallenge: "", + codeChallengeMethod: "s256", + prompt: "", + maxAge: 1, + authorizationDetails: "", + resource: [], + audience: "", + requestUri: "", + ); final Map params = verify( client.call( HttpMethod.post, @@ -160,7 +211,22 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "client_id": "", + "redirect_uri": "https://example.com", + "response_type": "response_type", + "scope": "", + "state": "", + "nonce": "", + "code_challenge": "", + "code_challenge_method": "s256", + "prompt": "", + "max_age": 1, + "authorization_details": "", + "resource": isA(), + "audience": "", + "request_uri": "", + }); expect(response, isA()); }); @@ -186,7 +252,13 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await oauth2.createDeviceAuthorization(); + final response = await oauth2.createDeviceAuthorization( + clientId: "", + scope: "", + authorizationDetails: "", + resource: [], + audience: "", + ); final Map params = verify( client.call( HttpMethod.post, @@ -196,7 +268,13 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "client_id": "", + "scope": "", + "authorization_details": "", + "resource": isA(), + "audience": "", + }); expect(response, isA()); }); @@ -239,7 +317,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["user_code"])); + expect(params, { + "user_code": "", + }); expect(response, isA()); }); @@ -276,13 +356,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/oauth2/testproject/grants/", + path: "/oauth2/testproject/grants/%3CGRANT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -299,7 +379,14 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await oauth2.logout(); + final response = await oauth2.logout( + idTokenHint: "", + logoutHint: "", + clientId: "", + postLogoutRedirectUri: "https://example.com", + state: "", + uiLocales: "", + ); final Map params = verify( client.call( HttpMethod.get, @@ -309,7 +396,14 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "id_token_hint": "", + "logout_hint": "", + "client_id": "", + "post_logout_redirect_uri": "https://example.com", + "state": "", + "ui_locales": "", + }); }); test('test method logoutPost()', () async { @@ -325,7 +419,14 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await oauth2.logoutPost(); + final response = await oauth2.logoutPost( + idTokenHint: "", + logoutHint: "", + clientId: "", + postLogoutRedirectUri: "https://example.com", + state: "", + uiLocales: "", + ); final Map params = verify( client.call( HttpMethod.post, @@ -335,7 +436,14 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "id_token_hint": "", + "logout_hint": "", + "client_id": "", + "post_logout_redirect_uri": "https://example.com", + "state": "", + "ui_locales": "", + }); }); test('test method listOrganizations()', () async { @@ -354,7 +462,11 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await oauth2.listOrganizations(); + final response = await oauth2.listOrganizations( + limit: 1, + offset: 1, + search: "", + ); final Map params = verify( client.call( HttpMethod.get, @@ -364,7 +476,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "limit": 1, + "offset": 1, + "search": "", + }); expect(response, isA()); }); @@ -388,6 +504,16 @@ void main() { clientId: "", redirectUri: "https://example.com", responseType: "code", + scope: "", + state: "", + nonce: "", + codeChallenge: "", + codeChallengeMethod: "s256", + prompt: "", + maxAge: 1, + authorizationDetails: "", + resource: [], + audience: "", ); final Map params = verify( client.call( @@ -398,7 +524,21 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["client_id", "redirect_uri", "response_type"])); + expect(params, { + "client_id": "", + "redirect_uri": "https://example.com", + "response_type": "code", + "scope": "", + "state": "", + "nonce": "", + "code_challenge": "", + "code_challenge_method": "s256", + "prompt": "", + "max_age": 1, + "authorization_details": "", + "resource": isA(), + "audience": "", + }); expect(response, isA()); }); @@ -418,7 +558,11 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await oauth2.listProjects(); + final response = await oauth2.listProjects( + limit: 1, + offset: 1, + search: "", + ); final Map params = verify( client.call( HttpMethod.get, @@ -428,7 +572,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "limit": 1, + "offset": 1, + "search": "", + }); expect(response, isA()); }); @@ -460,7 +608,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["grant_id"])); + expect(params, { + "grant_id": "", + }); expect(response, isA()); }); @@ -479,6 +629,9 @@ void main() { final response = await oauth2.revoke( token: "", + tokenTypeHint: "access_token", + clientId: "", + clientSecret: "", ); final Map params = verify( client.call( @@ -489,7 +642,12 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["token"])); + expect(params, { + "token": "", + "token_type_hint": "access_token", + "client_id": "", + "client_secret": "", + }); }); test('test method createToken()', () async { @@ -513,6 +671,15 @@ void main() { final response = await oauth2.createToken( grantType: "", + code: "", + refreshToken: "", + deviceCode: "", + clientId: "", + clientSecret: "", + codeVerifier: "", + redirectUri: "https://example.com", + resource: [], + audience: "", ); final Map params = verify( client.call( @@ -523,7 +690,18 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["grant_type"])); + expect(params, { + "grant_type": "", + "code": "", + "refresh_token": "", + "device_code": "", + "client_id": "", + "client_secret": "", + "code_verifier": "", + "redirect_uri": "https://example.com", + "resource": isA(), + "audience": "", + }); expect(response, isA()); }); }); diff --git a/test/services/organization_test.dart b/test/services/organization_test.dart index 4e39beda..e675582b 100644 --- a/test/services/organization_test.dart +++ b/test/services/organization_test.dart @@ -89,7 +89,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await organization.listInstallations(); + final response = await organization.listInstallations( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -99,7 +102,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -128,6 +134,7 @@ void main() { final response = await organization.createInstallation( appId: "", + authorizationDetails: "", ); final Map params = verify( client.call( @@ -138,7 +145,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["appId"])); + expect(params, { + "appId": "", + "authorizationDetails": "", + }); expect(response, isA()); }); @@ -171,13 +181,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/organization/installations/", + path: "/organization/installations/%3CINSTALLATION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -206,17 +216,20 @@ void main() { final response = await organization.updateInstallation( installationId: "", + authorizationDetails: "", ); final Map params = verify( client.call( HttpMethod.put, - path: "/organization/installations/", + path: "/organization/installations/%3CINSTALLATION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "authorizationDetails": "", + }); expect(response, isA()); }); @@ -239,13 +252,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/organization/installations/", + path: "/organization/installations/%3CINSTALLATION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); }); } diff --git a/test/services/presences_test.dart b/test/services/presences_test.dart index 13c02de0..baf04899 100644 --- a/test/services/presences_test.dart +++ b/test/services/presences_test.dart @@ -89,7 +89,11 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await presences.list(); + final response = await presences.list( + queries: [], + total: false, + ttl: 1, + ); final Map params = verify( client.call( HttpMethod.get, @@ -99,7 +103,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -129,13 +137,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/presences/", + path: "/presences/%3CPRESENCE_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -162,17 +170,25 @@ void main() { final response = await presences.upsert( presenceId: "", status: "", + permissions: [], + expiresAt: "2020-10-15T06:38:00.000+00:00", + metadata: {}, ); final Map params = verify( client.call( HttpMethod.put, - path: "/presences/", + path: "/presences/%3CPRESENCE_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["status"])); + expect(params, { + "status": "", + "permissions": isA(), + "expiresAt": "2020-10-15T06:38:00.000+00:00", + "metadata": isA(), + }); expect(response, isA()); }); @@ -198,17 +214,28 @@ void main() { final response = await presences.update( presenceId: "", + status: "", + expiresAt: "2020-10-15T06:38:00.000+00:00", + metadata: {}, + permissions: [], + purge: false, ); final Map params = verify( client.call( HttpMethod.patch, - path: "/presences/", + path: "/presences/%3CPRESENCE_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "status": "", + "expiresAt": "2020-10-15T06:38:00.000+00:00", + "metadata": isA(), + "permissions": isA(), + "purge": false, + }); expect(response, isA()); }); @@ -231,13 +258,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/presences/", + path: "/presences/%3CPRESENCE_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); }); } diff --git a/test/services/storage_test.dart b/test/services/storage_test.dart index 72b05be7..3750cc01 100644 --- a/test/services/storage_test.dart +++ b/test/services/storage_test.dart @@ -91,17 +91,24 @@ void main() { final response = await storage.listFiles( bucketId: "", + queries: [], + search: "", + total: false, ); final Map params = verify( client.call( HttpMethod.get, - path: "/storage/buckets//files", + path: "/storage/buckets/%3CBUCKET_ID%3E/files", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "search": "", + "total": false, + }); expect(response, isA()); }); @@ -140,10 +147,12 @@ void main() { bucketId: "", fileId: "", file: InputFile.fromPath(path: './image.png'), + permissions: [], + folder: "photos/2026", ); final Map params = verify( client.chunkedUpload( - path: "/storage/buckets//files", + path: "/storage/buckets/%3CBUCKET_ID%3E/files", params: captureAnyNamed('params'), paramName: anyNamed('paramName'), idParamName: anyNamed('idParamName'), @@ -151,7 +160,12 @@ void main() { method: HttpMethod.post, ), ).captured.single; - expect(params.keys, unorderedEquals(["fileId", "file"])); + expect(params, { + "fileId": "", + "file": isA(), + "permissions": isA(), + "folder": "photos/2026", + }); expect(response, isA()); }); @@ -192,13 +206,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/storage/buckets//files/", + path: "/storage/buckets/%3CBUCKET_ID%3E/files/%3CFILE_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -235,17 +249,22 @@ void main() { final response = await storage.updateFile( bucketId: "", fileId: "", + name: "name", + permissions: [], ); final Map params = verify( client.call( HttpMethod.put, - path: "/storage/buckets//files/", + path: "/storage/buckets/%3CBUCKET_ID%3E/files/%3CFILE_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "name": "name", + "permissions": isA(), + }); expect(response, isA()); }); @@ -269,13 +288,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/storage/buckets//files/", + path: "/storage/buckets/%3CBUCKET_ID%3E/files/%3CFILE_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method getFileDownload()', () async { @@ -294,17 +313,20 @@ void main() { final response = await storage.getFileDownload( bucketId: "", fileId: "", + token: "", ); final Map params = verify( client.call( HttpMethod.get, - path: "/storage/buckets//files//download", + path: "/storage/buckets/%3CBUCKET_ID%3E/files/%3CFILE_ID%3E/download", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "token": "", + }); expect(response, isA()); }); @@ -324,17 +346,42 @@ void main() { final response = await storage.getFilePreview( bucketId: "", fileId: "", + width: 1, + height: 1, + gravity: enums.ImageGravity.auto, + quality: 1, + borderWidth: 1, + borderColor: "FFFFFF", + borderRadius: 1, + opacity: 1.0, + rotation: 1, + background: "FFFFFF", + output: enums.ImageFormat.jpg, + token: "", ); final Map params = verify( client.call( HttpMethod.get, - path: "/storage/buckets//files//preview", + path: "/storage/buckets/%3CBUCKET_ID%3E/files/%3CFILE_ID%3E/preview", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "width": 1, + "height": 1, + "gravity": enums.ImageGravity.auto.value, + "quality": 1, + "borderWidth": 1, + "borderColor": "FFFFFF", + "borderRadius": 1, + "opacity": 1.0, + "rotation": 1, + "background": "FFFFFF", + "output": enums.ImageFormat.jpg.value, + "token": "", + }); expect(response, isA()); }); @@ -354,17 +401,20 @@ void main() { final response = await storage.getFileView( bucketId: "", fileId: "", + token: "", ); final Map params = verify( client.call( HttpMethod.get, - path: "/storage/buckets//files//view", + path: "/storage/buckets/%3CBUCKET_ID%3E/files/%3CFILE_ID%3E/view", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "token": "", + }); expect(response, isA()); }); }); diff --git a/test/services/tables_db_test.dart b/test/services/tables_db_test.dart index 526bd009..99b1d079 100644 --- a/test/services/tables_db_test.dart +++ b/test/services/tables_db_test.dart @@ -89,7 +89,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await tablesDB.listTransactions(); + final response = await tablesDB.listTransactions( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -99,7 +102,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -123,7 +129,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await tablesDB.createTransaction(); + final response = await tablesDB.createTransaction( + ttl: 1, + ); final Map params = verify( client.call( HttpMethod.post, @@ -133,7 +141,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "ttl": 1, + }); expect(response, isA()); }); @@ -163,13 +173,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/tablesdb/transactions/", + path: "/tablesdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -195,17 +205,22 @@ void main() { final response = await tablesDB.updateTransaction( transactionId: "", + commit: false, + rollback: false, ); final Map params = verify( client.call( HttpMethod.patch, - path: "/tablesdb/transactions/", + path: "/tablesdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "commit": false, + "rollback": false, + }); expect(response, isA()); }); @@ -228,13 +243,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/tablesdb/transactions/", + path: "/tablesdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method createOperations()', () async { @@ -259,17 +274,20 @@ void main() { final response = await tablesDB.createOperations( transactionId: "", + operations: [], ); final Map params = verify( client.call( HttpMethod.post, - path: "/tablesdb/transactions//operations", + path: "/tablesdb/transactions/%3CTRANSACTION_ID%3E/operations", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "operations": isA(), + }); expect(response, isA()); }); @@ -292,17 +310,26 @@ void main() { final response = await tablesDB.listRows( databaseId: "", tableId: "", + queries: [], + transactionId: "", + total: false, + ttl: 1, ); final Map params = verify( client.call( HttpMethod.get, - path: "/tablesdb//tables//rows", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -332,17 +359,24 @@ void main() { tableId: "", rowId: "", data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/tablesdb//tables//rows", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["rowId", "data"])); + expect(params, { + "rowId": "", + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -365,17 +399,26 @@ void main() { final response = await tablesDB.createQuery( databaseId: "", tableId: "", + queries: [], + transactionId: "", + total: false, + ttl: 1, ); final Map params = verify( client.call( HttpMethod.post, - path: "/tablesdb//tables//rows/query", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows/query", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -404,17 +447,22 @@ void main() { databaseId: "", tableId: "", rowId: "", + queries: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.get, - path: "/tablesdb//tables//rows/", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows/%3CROW_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -443,17 +491,24 @@ void main() { databaseId: "", tableId: "", rowId: "", + data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.put, - path: "/tablesdb//tables//rows/", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows/%3CROW_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -482,17 +537,24 @@ void main() { databaseId: "", tableId: "", rowId: "", + data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/tablesdb//tables//rows/", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows/%3CROW_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -513,17 +575,20 @@ void main() { databaseId: "", tableId: "", rowId: "", + transactionId: "", ); final Map params = verify( client.call( HttpMethod.delete, - path: "/tablesdb//tables//rows/", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows/%3CROW_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "transactionId": "", + }); }); test('test method decrementRowColumn()', () async { @@ -552,17 +617,24 @@ void main() { tableId: "", rowId: "", column: "", + value: 1.0, + min: 1.0, + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/tablesdb//tables//rows///decrement", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows/%3CROW_ID%3E/%3CCOLUMN%3E/decrement", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "value": 1.0, + "min": 1.0, + "transactionId": "", + }); expect(response, isA()); }); @@ -592,17 +664,24 @@ void main() { tableId: "", rowId: "", column: "", + value: 1.0, + max: 1.0, + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/tablesdb//tables//rows///increment", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows/%3CROW_ID%3E/%3CCOLUMN%3E/increment", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "value": 1.0, + "max": 1.0, + "transactionId": "", + }); expect(response, isA()); }); }); diff --git a/test/services/teams_test.dart b/test/services/teams_test.dart index fcf47c3f..724ab2a5 100644 --- a/test/services/teams_test.dart +++ b/test/services/teams_test.dart @@ -89,7 +89,11 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await teams.list(); + final response = await teams.list( + queries: [], + search: "", + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -99,7 +103,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "search": "", + "total": false, + }); expect(response, isA()); }); @@ -126,6 +134,7 @@ void main() { final response = await teams.create( teamId: "", name: "", + roles: [], ); final Map params = verify( client.call( @@ -136,7 +145,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["teamId", "name"])); + expect(params, { + "teamId": "", + "name": "", + "roles": isA(), + }); expect(response, isA()); }); @@ -166,13 +179,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/teams/", + path: "/teams/%3CTEAM_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -203,13 +216,15 @@ void main() { final Map params = verify( client.call( HttpMethod.put, - path: "/teams/", + path: "/teams/%3CTEAM_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["name"])); + expect(params, { + "name": "", + }); expect(response, isA()); }); @@ -232,13 +247,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/teams/", + path: "/teams/%3CTEAM_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method listInstallations()', () async { @@ -259,17 +274,22 @@ void main() { final response = await teams.listInstallations( teamId: "", + queries: [], + total: false, ); final Map params = verify( client.call( HttpMethod.get, - path: "/teams//installations", + path: "/teams/%3CTEAM_ID%3E/installations", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -299,17 +319,21 @@ void main() { final response = await teams.createInstallation( teamId: "", appId: "", + authorizationDetails: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/teams//installations", + path: "/teams/%3CTEAM_ID%3E/installations", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["appId"])); + expect(params, { + "appId": "", + "authorizationDetails": "", + }); expect(response, isA()); }); @@ -343,13 +367,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/teams//installations/", + path: "/teams/%3CTEAM_ID%3E/installations/%3CINSTALLATION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -379,17 +403,20 @@ void main() { final response = await teams.updateInstallation( teamId: "", installationId: "", + authorizationDetails: "", ); final Map params = verify( client.call( HttpMethod.put, - path: "/teams//installations/", + path: "/teams/%3CTEAM_ID%3E/installations/%3CINSTALLATION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "authorizationDetails": "", + }); expect(response, isA()); }); @@ -413,13 +440,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/teams//installations/", + path: "/teams/%3CTEAM_ID%3E/installations/%3CINSTALLATION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method listMemberships()', () async { @@ -440,17 +467,24 @@ void main() { final response = await teams.listMemberships( teamId: "", + queries: [], + search: "", + total: false, ); final Map params = verify( client.call( HttpMethod.get, - path: "/teams//memberships", + path: "/teams/%3CTEAM_ID%3E/memberships", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "search": "", + "total": false, + }); expect(response, isA()); }); @@ -486,17 +520,31 @@ void main() { final response = await teams.createMembership( teamId: "", roles: [], + email: "email@example.com", + userId: "", + phone: "+12065550100", + url: "https://example.com", + name: "", + membershipId: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/teams//memberships", + path: "/teams/%3CTEAM_ID%3E/memberships", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["roles"])); + expect(params, { + "email": "email@example.com", + "userId": "", + "phone": "+12065550100", + "roles": isA(), + "url": "https://example.com", + "name": "", + "membershipId": "", + }); expect(response, isA()); }); @@ -536,13 +584,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/teams//memberships/", + path: "/teams/%3CTEAM_ID%3E/memberships/%3CMEMBERSHIP_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -583,13 +631,15 @@ void main() { final Map params = verify( client.call( HttpMethod.patch, - path: "/teams//memberships/", + path: "/teams/%3CTEAM_ID%3E/memberships/%3CMEMBERSHIP_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["roles"])); + expect(params, { + "roles": isA(), + }); expect(response, isA()); }); @@ -613,13 +663,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/teams//memberships/", + path: "/teams/%3CTEAM_ID%3E/memberships/%3CMEMBERSHIP_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method updateMembershipStatus()', () async { @@ -660,13 +710,16 @@ void main() { final Map params = verify( client.call( HttpMethod.patch, - path: "/teams//memberships//status", + path: "/teams/%3CTEAM_ID%3E/memberships/%3CMEMBERSHIP_ID%3E/status", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret"])); + expect(params, { + "userId": "", + "secret": "", + }); expect(response, isA()); }); @@ -689,13 +742,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/teams//prefs", + path: "/teams/%3CTEAM_ID%3E/prefs", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -719,13 +772,15 @@ void main() { final Map params = verify( client.call( HttpMethod.put, - path: "/teams//prefs", + path: "/teams/%3CTEAM_ID%3E/prefs", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["prefs"])); + expect(params, { + "prefs": isA(), + }); expect(response, isA()); }); }); diff --git a/test/services/vectors_db_test.dart b/test/services/vectors_db_test.dart index 066686f6..fc4036eb 100644 --- a/test/services/vectors_db_test.dart +++ b/test/services/vectors_db_test.dart @@ -89,7 +89,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await vectorsDB.listTransactions(); + final response = await vectorsDB.listTransactions( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -99,7 +102,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -123,7 +129,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await vectorsDB.createTransaction(); + final response = await vectorsDB.createTransaction( + ttl: 1, + ); final Map params = verify( client.call( HttpMethod.post, @@ -133,7 +141,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "ttl": 1, + }); expect(response, isA()); }); @@ -163,13 +173,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/vectorsdb/transactions/", + path: "/vectorsdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -195,17 +205,22 @@ void main() { final response = await vectorsDB.updateTransaction( transactionId: "", + commit: false, + rollback: false, ); final Map params = verify( client.call( HttpMethod.patch, - path: "/vectorsdb/transactions/", + path: "/vectorsdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "commit": false, + "rollback": false, + }); expect(response, isA()); }); @@ -228,13 +243,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/vectorsdb/transactions/", + path: "/vectorsdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method createOperations()', () async { @@ -259,17 +274,20 @@ void main() { final response = await vectorsDB.createOperations( transactionId: "", + operations: [], ); final Map params = verify( client.call( HttpMethod.post, - path: "/vectorsdb/transactions//operations", + path: "/vectorsdb/transactions/%3CTRANSACTION_ID%3E/operations", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "operations": isA(), + }); expect(response, isA()); }); @@ -292,17 +310,26 @@ void main() { final response = await vectorsDB.listDocuments( databaseId: "", collectionId: "", + queries: [], + transactionId: "", + total: false, + ttl: 1, ); final Map params = verify( client.call( HttpMethod.get, - path: "/vectorsdb//collections//documents", + path: "/vectorsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -332,17 +359,24 @@ void main() { collectionId: "", documentId: "", data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/vectorsdb//collections//documents", + path: "/vectorsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["documentId", "data"])); + expect(params, { + "documentId": "", + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -365,17 +399,26 @@ void main() { final response = await vectorsDB.createQuery( databaseId: "", collectionId: "", + queries: [], + transactionId: "", + total: false, + ttl: 1, ); final Map params = verify( client.call( HttpMethod.post, - path: "/vectorsdb//collections//documents/query", + path: "/vectorsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/query", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -404,17 +447,22 @@ void main() { databaseId: "", collectionId: "", documentId: "", + queries: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.get, - path: "/vectorsdb//collections//documents/", + path: "/vectorsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -443,17 +491,24 @@ void main() { databaseId: "", collectionId: "", documentId: "", + data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.put, - path: "/vectorsdb//collections//documents/", + path: "/vectorsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -482,17 +537,24 @@ void main() { databaseId: "", collectionId: "", documentId: "", + data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/vectorsdb//collections//documents/", + path: "/vectorsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -513,17 +575,20 @@ void main() { databaseId: "", collectionId: "", documentId: "", + transactionId: "", ); final Map params = verify( client.call( HttpMethod.delete, - path: "/vectorsdb//collections//documents/", + path: "/vectorsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "transactionId": "", + }); }); }); } From e83cd99a027d0f01c2a13cfba14948ccc8614c25 Mon Sep 17 00:00:00 2001 From: Chirag Aggarwal Date: Tue, 27 Oct 2026 19:23:24 +0000 Subject: [PATCH 5/5] chore: update Flutter SDK to 28.2.0 --- CHANGELOG.md | 7 + README.md | 6 +- android/build.gradle | 2 +- docs/examples/oauth2/authorize-post.md | 2 +- docs/examples/oauth2/authorize.md | 2 +- docs/examples/storage/update-file.md | 2 +- lib/appwrite.dart | 9 +- lib/services/account.dart | 50 ++-- lib/services/analytics.dart | 2 +- lib/services/apps.dart | 48 +-- lib/services/avatars.dart | 6 +- lib/services/databases.dart | 60 ++-- lib/services/documents_db.dart | 64 ++-- lib/services/functions.dart | 8 +- lib/services/messaging.dart | 6 +- lib/services/oauth2.dart | 30 +- lib/services/organization.dart | 6 +- lib/services/presences.dart | 8 +- lib/services/storage.dart | 28 +- lib/services/tables_db.dart | 60 ++-- lib/services/teams.dart | 46 +-- lib/services/vectors_db.dart | 44 +-- lib/src/client_browser.dart | 10 +- lib/src/client_io.dart | 10 +- pubspec.yaml | 2 +- test/services/account_test.dart | 394 ++++++++++++++++++------- test/services/analytics_test.dart | 27 +- test/services/apps_test.dart | 175 ++++++++--- test/services/avatars_test.dart | 133 ++++++++- test/services/databases_test.dart | 139 +++++++-- test/services/documents_db_test.dart | 147 +++++++-- test/services/functions_test.dart | 30 +- test/services/graphql_test.dart | 8 +- test/services/locale_test.dart | 58 +++- test/services/messaging_test.dart | 11 +- test/services/oauth2_test.dart | 222 ++++++++++++-- test/services/organization_test.dart | 31 +- test/services/presences_test.dart | 47 ++- test/services/storage_test.dart | 82 ++++- test/services/tables_db_test.dart | 139 +++++++-- test/services/teams_test.dart | 125 +++++--- test/services/vectors_db_test.dart | 117 ++++++-- 42 files changed, 1764 insertions(+), 639 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6362da7f..6d8c915c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 28.2.0 + +* Updated: requests send `X-Appwrite-Response-Format: 2.6.2`; the SDK targets Appwrite 2.6.x +* Fixed: path parameters are percent-encoded as one segment; `.` and `..` throw `AppwriteException` +* Fixed: chunked upload resume lookups percent-encode the file ID +* Fixed: examples pass `null` for unset optional params instead of empty strings + ## 28.1.0 * Added: `createQuery` on `databases`, `documentsDB` and `tablesDB` to send list queries in the request body diff --git a/README.md b/README.md index 0cca741c..c0fcf58f 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ [![pub package](https://img.shields.io/pub/v/appwrite?style=flat-square)](https://pub.dartlang.org/packages/appwrite) ![License](https://img.shields.io/badge/license-BSD--3--Clause-blue.svg?style=flat-square) -![Version](https://img.shields.io/badge/api%20version-2.5.x-blue.svg?style=flat-square) +![Version](https://img.shields.io/badge/api%20version-2.6.x-blue.svg?style=flat-square) [![X Account](https://img.shields.io/badge/follow-%40appwrite-000000?logo=x&style=flat-square)](https://x.com/appwrite) [![Discord](https://img.shields.io/discord/564160730845151244?label=discord&style=flat-square)](https://appwrite.io/discord) -**This SDK targets Appwrite server version 2.5.x as shipped on Appwrite Cloud.** Self-hosted releases can lag behind Cloud — if you run an older self-hosted build, use a matching older SDK from [previous releases](https://github.com/appwrite/sdk-for-flutter/releases) when APIs differ. +**This SDK targets Appwrite server version 2.6.x as shipped on Appwrite Cloud.** Self-hosted releases can lag behind Cloud — if you run an older self-hosted build, use a matching older SDK from [previous releases](https://github.com/appwrite/sdk-for-flutter/releases) when APIs differ. Appwrite is an open-source backend as a service server that abstracts and simplifies complex and repetitive development tasks behind a very simple to use REST API. Appwrite aims to help you develop your apps faster and in a more secure way. Use the Flutter SDK to integrate your app with the Appwrite server to easily start interacting with all of Appwrite backend APIs and tools. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs) @@ -24,7 +24,7 @@ Or add it to your app's `pubspec.yaml` file and run `flutter pub get`: ```yaml dependencies: - appwrite: ^28.1.0 + appwrite: ^28.2.0 ``` ### Android requirements diff --git a/android/build.gradle b/android/build.gradle index 5d77d97e..d1778b9c 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,7 +1,7 @@ // The native half of Push on Android: background delivery that survives the process being // killed, a reboot and an app update, shared with the Appwrite Android SDK. group = "io.appwrite.flutter" -version = "28.1.0" +version = "28.2.0" buildscript { ext.kotlin_version = "2.1.0" diff --git a/docs/examples/oauth2/authorize-post.md b/docs/examples/oauth2/authorize-post.md index 05d9c020..32526b3c 100644 --- a/docs/examples/oauth2/authorize-post.md +++ b/docs/examples/oauth2/authorize-post.md @@ -11,7 +11,7 @@ Oauth2 oauth2 = Oauth2(client); models.Oauth2Authorize result = await oauth2.authorizePost( clientId: '', // optional redirectUri: 'https://example.com', // optional - responseType: '', // optional + responseType: null, // optional scope: '', // optional state: '', // optional nonce: '', // optional diff --git a/docs/examples/oauth2/authorize.md b/docs/examples/oauth2/authorize.md index 0fe1d691..b3cc0444 100644 --- a/docs/examples/oauth2/authorize.md +++ b/docs/examples/oauth2/authorize.md @@ -11,7 +11,7 @@ Oauth2 oauth2 = Oauth2(client); models.Oauth2Authorize result = await oauth2.authorize( clientId: '', // optional redirectUri: 'https://example.com', // optional - responseType: '', // optional + responseType: null, // optional scope: '', // optional state: '', // optional nonce: '', // optional diff --git a/docs/examples/storage/update-file.md b/docs/examples/storage/update-file.md index 6ddd4920..ed57a830 100644 --- a/docs/examples/storage/update-file.md +++ b/docs/examples/storage/update-file.md @@ -11,7 +11,7 @@ Storage storage = Storage(client); models.File result = await storage.updateFile( bucketId: '', fileId: '', - name: '', // optional + name: null, // optional permissions: [Permission.read(Role.any())], // optional ); ``` diff --git a/lib/appwrite.dart b/lib/appwrite.dart index 085d8348..337e4836 100644 --- a/lib/appwrite.dart +++ b/lib/appwrite.dart @@ -1,6 +1,6 @@ /// Appwrite Flutter SDK /// -/// This SDK targets Appwrite server version 2.5.x as shipped on Appwrite Cloud. +/// This SDK targets Appwrite server version 2.6.x as shipped on Appwrite Cloud. /// Self-hosted releases can lag behind Cloud — if you run an older self-hosted /// build, use a matching older SDK from /// [previous releases](https://github.com/appwrite/sdk-for-flutter/releases) @@ -58,3 +58,10 @@ part 'services/storage.dart'; part 'services/tables_db.dart'; part 'services/teams.dart'; part 'services/vectors_db.dart'; + +String _encodePath(String value) { + if (value == '.' || value == '..') { + throw AppwriteException('Path parameter cannot be "." or ".."'); + } + return Uri.encodeComponent(value); +} diff --git a/lib/services/account.dart b/lib/services/account.dart index 3e6de0d8..706b0131 100644 --- a/lib/services/account.dart +++ b/lib/services/account.dart @@ -105,7 +105,7 @@ class Account extends Service { final String apiPath = '/account/consents/{consentId}'.replaceAll( '{consentId}', - consentId, + _encodePath(consentId), ); final Map apiParams = {}; @@ -139,7 +139,7 @@ class Account extends Service { final String apiPath = '/account/consents/{consentId}'.replaceAll( '{consentId}', - consentId, + _encodePath(consentId), ); final Map apiParams = {}; @@ -176,7 +176,7 @@ class Account extends Service { final String apiPath = '/account/consents/{consentId}/tokens'.replaceAll( '{consentId}', - consentId, + _encodePath(consentId), ); final Map apiParams = { @@ -220,11 +220,11 @@ class Account extends Service { final String apiPath = '/account/consents/{consentId}/tokens/{tokenId}' .replaceAll( '{consentId}', - consentId, + _encodePath(consentId), ) .replaceAll( '{tokenId}', - tokenId, + _encodePath(tokenId), ); final Map apiParams = {}; @@ -266,11 +266,11 @@ class Account extends Service { final String apiPath = '/account/consents/{consentId}/tokens/{tokenId}' .replaceAll( '{consentId}', - consentId, + _encodePath(consentId), ) .replaceAll( '{tokenId}', - tokenId, + _encodePath(tokenId), ); final Map apiParams = {}; @@ -364,7 +364,7 @@ class Account extends Service { final String apiPath = '/account/identities/{identityId}'.replaceAll( '{identityId}', - identityId, + _encodePath(identityId), ); final Map apiParams = {}; @@ -480,7 +480,7 @@ class Account extends Service { }) async { final String apiPath = '/account/mfa/authenticators/{type}'.replaceAll( '{type}', - type.value, + _encodePath(type.value), ); final Map apiParams = {}; @@ -510,7 +510,7 @@ class Account extends Service { }) async { final String apiPath = '/account/mfa/authenticators/{type}'.replaceAll( '{type}', - type.value, + _encodePath(type.value), ); final Map apiParams = {}; @@ -543,7 +543,7 @@ class Account extends Service { }) async { final String apiPath = '/account/mfa/authenticators/{type}'.replaceAll( '{type}', - type.value, + _encodePath(type.value), ); final Map apiParams = { @@ -575,7 +575,7 @@ class Account extends Service { }) async { final String apiPath = '/account/mfa/authenticators/{type}'.replaceAll( '{type}', - type.value, + _encodePath(type.value), ); final Map apiParams = { @@ -607,7 +607,7 @@ class Account extends Service { }) async { final String apiPath = '/account/mfa/authenticators/{type}'.replaceAll( '{type}', - type.value, + _encodePath(type.value), ); final Map apiParams = {}; @@ -634,7 +634,7 @@ class Account extends Service { }) async { final String apiPath = '/account/mfa/authenticators/{type}'.replaceAll( '{type}', - type.value, + _encodePath(type.value), ); final Map apiParams = {}; @@ -1086,7 +1086,7 @@ class Account extends Service { final String apiPath = '/account/passkeys/{passkeyId}'.replaceAll( '{passkeyId}', - passkeyId, + _encodePath(passkeyId), ); final Map apiParams = {}; @@ -1119,7 +1119,7 @@ class Account extends Service { final String apiPath = '/account/passkeys/{passkeyId}'.replaceAll( '{passkeyId}', - passkeyId, + _encodePath(passkeyId), ); final Map apiParams = { @@ -1157,7 +1157,7 @@ class Account extends Service { final String apiPath = '/account/passkeys/{passkeyId}'.replaceAll( '{passkeyId}', - passkeyId, + _encodePath(passkeyId), ); final Map apiParams = {}; @@ -1196,7 +1196,7 @@ class Account extends Service { final String apiPath = '/account/passkeys/{passkeyId}/verification' .replaceAll( '{passkeyId}', - passkeyId, + _encodePath(passkeyId), ); final Map apiParams = { @@ -1748,7 +1748,7 @@ class Account extends Service { }) async { final String apiPath = '/account/sessions/oauth2/{provider}'.replaceAll( '{provider}', - provider.value, + _encodePath(provider.value), ); final Map params = { @@ -1861,7 +1861,7 @@ class Account extends Service { final String apiPath = '/account/sessions/{sessionId}'.replaceAll( '{sessionId}', - sessionId, + _encodePath(sessionId), ); final Map apiParams = {}; @@ -1895,7 +1895,7 @@ class Account extends Service { final String apiPath = '/account/sessions/{sessionId}'.replaceAll( '{sessionId}', - sessionId, + _encodePath(sessionId), ); final Map apiParams = {}; @@ -1932,7 +1932,7 @@ class Account extends Service { final String apiPath = '/account/sessions/{sessionId}'.replaceAll( '{sessionId}', - sessionId, + _encodePath(sessionId), ); final Map apiParams = {}; @@ -2037,7 +2037,7 @@ class Account extends Service { final String apiPath = '/account/targets/{targetId}/push'.replaceAll( '{targetId}', - targetId, + _encodePath(targetId), ); final Map apiParams = { @@ -2076,7 +2076,7 @@ class Account extends Service { final String apiPath = '/account/targets/{targetId}/push'.replaceAll( '{targetId}', - targetId, + _encodePath(targetId), ); final Map apiParams = {}; @@ -2210,7 +2210,7 @@ class Account extends Service { }) async { final String apiPath = '/account/tokens/oauth2/{provider}'.replaceAll( '{provider}', - provider.value, + _encodePath(provider.value), ); final Map params = { diff --git a/lib/services/analytics.dart b/lib/services/analytics.dart index effdd8e6..309ba869 100644 --- a/lib/services/analytics.dart +++ b/lib/services/analytics.dart @@ -29,7 +29,7 @@ class Analytics extends Service { final String apiPath = '/analytics/properties/{propertyId}/events' .replaceAll( '{propertyId}', - propertyId, + _encodePath(propertyId), ); final Map apiParams = { diff --git a/lib/services/apps.dart b/lib/services/apps.dart index 1026e7ea..057d207f 100644 --- a/lib/services/apps.dart +++ b/lib/services/apps.dart @@ -150,7 +150,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = {}; @@ -201,7 +201,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = { @@ -256,7 +256,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = {}; @@ -293,7 +293,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/installations'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = { @@ -338,11 +338,11 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/installations/{installationId}' .replaceAll( '{appId}', - appId, + _encodePath(appId), ) .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = {}; @@ -384,11 +384,11 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/installations/{installationId}' .replaceAll( '{appId}', - appId, + _encodePath(appId), ) .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = {}; @@ -436,11 +436,11 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/installations/{installationId}/tokens' .replaceAll( '{appId}', - appId, + _encodePath(appId), ) .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = {}; @@ -475,7 +475,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/keys'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = { @@ -512,7 +512,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/keys'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = {}; @@ -553,11 +553,11 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/keys/{keyId}' .replaceAll( '{appId}', - appId, + _encodePath(appId), ) .replaceAll( '{keyId}', - keyId, + _encodePath(keyId), ); final Map apiParams = {}; @@ -597,11 +597,11 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/keys/{keyId}' .replaceAll( '{appId}', - appId, + _encodePath(appId), ) .replaceAll( '{keyId}', - keyId, + _encodePath(keyId), ); final Map apiParams = {}; @@ -636,7 +636,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/secrets'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = { @@ -671,7 +671,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/secrets'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = {}; @@ -712,11 +712,11 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/secrets/{secretId}' .replaceAll( '{appId}', - appId, + _encodePath(appId), ) .replaceAll( '{secretId}', - secretId, + _encodePath(secretId), ); final Map apiParams = {}; @@ -756,11 +756,11 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/secrets/{secretId}' .replaceAll( '{appId}', - appId, + _encodePath(appId), ) .replaceAll( '{secretId}', - secretId, + _encodePath(secretId), ); final Map apiParams = {}; @@ -794,7 +794,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/team'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = { @@ -829,7 +829,7 @@ class Apps extends Service { final String apiPath = '/apps/{appId}/tokens'.replaceAll( '{appId}', - appId, + _encodePath(appId), ); final Map apiParams = {}; diff --git a/lib/services/avatars.dart b/lib/services/avatars.dart index f9b4cbd5..9231ce8f 100644 --- a/lib/services/avatars.dart +++ b/lib/services/avatars.dart @@ -24,7 +24,7 @@ class Avatars extends Service { }) async { final String apiPath = '/avatars/browsers/{code}'.replaceAll( '{code}', - code.value, + _encodePath(code.value), ); final Map apiParams = { @@ -64,7 +64,7 @@ class Avatars extends Service { }) async { final String apiPath = '/avatars/credit-cards/{code}'.replaceAll( '{code}', - code.value, + _encodePath(code.value), ); final Map apiParams = { @@ -133,7 +133,7 @@ class Avatars extends Service { }) async { final String apiPath = '/avatars/flags/{code}'.replaceAll( '{code}', - code.value, + _encodePath(code.value), ); final Map apiParams = { diff --git a/lib/services/databases.dart b/lib/services/databases.dart index 11959bf9..28c8aa41 100644 --- a/lib/services/databases.dart +++ b/lib/services/databases.dart @@ -80,7 +80,7 @@ class Databases extends Service { final String apiPath = '/databases/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = {}; @@ -117,7 +117,7 @@ class Databases extends Service { final String apiPath = '/databases/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = { @@ -156,7 +156,7 @@ class Databases extends Service { final String apiPath = '/databases/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = {}; @@ -194,7 +194,7 @@ class Databases extends Service { final String apiPath = '/databases/transactions/{transactionId}/operations' .replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = { @@ -255,11 +255,11 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -315,11 +315,11 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -376,11 +376,11 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents/query' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -440,15 +440,15 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -508,15 +508,15 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -576,15 +576,15 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -641,15 +641,15 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -713,19 +713,19 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents/{documentId}/{attribute}/decrement' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ) .replaceAll( '{attribute}', - attribute, + _encodePath(attribute), ); final Map apiParams = { @@ -791,19 +791,19 @@ class Databases extends Service { '/databases/{databaseId}/collections/{collectionId}/documents/{documentId}/{attribute}/increment' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ) .replaceAll( '{attribute}', - attribute, + _encodePath(attribute), ); final Map apiParams = { diff --git a/lib/services/documents_db.dart b/lib/services/documents_db.dart index 93ef8712..210ea5fd 100644 --- a/lib/services/documents_db.dart +++ b/lib/services/documents_db.dart @@ -70,7 +70,7 @@ class DocumentsDB extends Service { final String apiPath = '/documentsdb/transactions/{transactionId}' .replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = {}; @@ -105,7 +105,7 @@ class DocumentsDB extends Service { final String apiPath = '/documentsdb/transactions/{transactionId}' .replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = { @@ -142,7 +142,7 @@ class DocumentsDB extends Service { final String apiPath = '/documentsdb/transactions/{transactionId}' .replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = {}; @@ -177,7 +177,7 @@ class DocumentsDB extends Service { final String apiPath = '/documentsdb/transactions/{transactionId}/operations'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = { @@ -226,11 +226,11 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -283,11 +283,11 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -339,11 +339,11 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -395,11 +395,11 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents/query' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -456,15 +456,15 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -521,15 +521,15 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -586,15 +586,15 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -648,15 +648,15 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -717,19 +717,19 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents/{documentId}/{attribute}/decrement' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ) .replaceAll( '{attribute}', - attribute, + _encodePath(attribute), ); final Map apiParams = { @@ -792,19 +792,19 @@ class DocumentsDB extends Service { '/documentsdb/{databaseId}/collections/{collectionId}/documents/{documentId}/{attribute}/increment' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ) .replaceAll( '{attribute}', - attribute, + _encodePath(attribute), ); final Map apiParams = { diff --git a/lib/services/functions.dart b/lib/services/functions.dart index 9d40b1d0..6111f347 100644 --- a/lib/services/functions.dart +++ b/lib/services/functions.dart @@ -21,7 +21,7 @@ class Functions extends Service { final String apiPath = '/functions/{functionId}/executions'.replaceAll( '{functionId}', - functionId, + _encodePath(functionId), ); final Map apiParams = { @@ -65,7 +65,7 @@ class Functions extends Service { final String apiPath = '/functions/{functionId}/executions'.replaceAll( '{functionId}', - functionId, + _encodePath(functionId), ); final Map apiParams = { @@ -113,11 +113,11 @@ class Functions extends Service { final String apiPath = '/functions/{functionId}/executions/{executionId}' .replaceAll( '{functionId}', - functionId, + _encodePath(functionId), ) .replaceAll( '{executionId}', - executionId, + _encodePath(executionId), ); final Map apiParams = {}; diff --git a/lib/services/messaging.dart b/lib/services/messaging.dart index 4afbb010..1d4e2cd9 100644 --- a/lib/services/messaging.dart +++ b/lib/services/messaging.dart @@ -20,7 +20,7 @@ class Messaging extends Service { final String apiPath = '/messaging/topics/{topicId}/subscribers'.replaceAll( '{topicId}', - topicId, + _encodePath(topicId), ); final Map apiParams = { @@ -65,11 +65,11 @@ class Messaging extends Service { '/messaging/topics/{topicId}/subscribers/{subscriberId}' .replaceAll( '{topicId}', - topicId, + _encodePath(topicId), ) .replaceAll( '{subscriberId}', - subscriberId, + _encodePath(subscriberId), ); final Map apiParams = {}; diff --git a/lib/services/oauth2.dart b/lib/services/oauth2.dart index 439de1a8..570de711 100644 --- a/lib/services/oauth2.dart +++ b/lib/services/oauth2.dart @@ -18,7 +18,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/approve'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -66,7 +66,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/authorize'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -125,7 +125,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/authorize'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -174,7 +174,7 @@ class Oauth2 extends Service { final String apiPath = '/oauth2/{project_id}/device_authorization' .replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -210,7 +210,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/grants'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -247,11 +247,11 @@ class Oauth2 extends Service { final String apiPath = '/oauth2/{project_id}/grants/{grant_id}' .replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ) .replaceAll( '{grant_id}', - grantId, + _encodePath(grantId), ); final Map apiParams = {}; @@ -284,7 +284,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/logout'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -325,7 +325,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/logout'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -363,7 +363,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/organizations'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -405,7 +405,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/par'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -451,7 +451,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/projects'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -483,7 +483,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/reject'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -514,7 +514,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/revoke'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { @@ -555,7 +555,7 @@ class Oauth2 extends Service { }) async { final String apiPath = '/oauth2/{project_id}/token'.replaceAll( '{project_id}', - client.config['project'] ?? '', + _encodePath(client.config['project'] ?? ''), ); final Map apiParams = { diff --git a/lib/services/organization.dart b/lib/services/organization.dart index 68b762c9..694d0c7c 100644 --- a/lib/services/organization.dart +++ b/lib/services/organization.dart @@ -78,7 +78,7 @@ class Organization extends Service { final String apiPath = '/organization/installations/{installationId}' .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = {}; @@ -115,7 +115,7 @@ class Organization extends Service { final String apiPath = '/organization/installations/{installationId}' .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = { @@ -154,7 +154,7 @@ class Organization extends Service { final String apiPath = '/organization/installations/{installationId}' .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = {}; diff --git a/lib/services/presences.dart b/lib/services/presences.dart index 7ce2e633..04a70bc4 100644 --- a/lib/services/presences.dart +++ b/lib/services/presences.dart @@ -48,7 +48,7 @@ class Presences extends Service { final String apiPath = '/presences/{presenceId}'.replaceAll( '{presenceId}', - presenceId, + _encodePath(presenceId), ); final Map apiParams = {}; @@ -84,7 +84,7 @@ class Presences extends Service { final String apiPath = '/presences/{presenceId}'.replaceAll( '{presenceId}', - presenceId, + _encodePath(presenceId), ); final Map apiParams = { @@ -128,7 +128,7 @@ class Presences extends Service { final String apiPath = '/presences/{presenceId}'.replaceAll( '{presenceId}', - presenceId, + _encodePath(presenceId), ); final Map apiParams = { @@ -167,7 +167,7 @@ class Presences extends Service { final String apiPath = '/presences/{presenceId}'.replaceAll( '{presenceId}', - presenceId, + _encodePath(presenceId), ); final Map apiParams = {}; diff --git a/lib/services/storage.dart b/lib/services/storage.dart index ec4522fe..49891ed4 100644 --- a/lib/services/storage.dart +++ b/lib/services/storage.dart @@ -21,7 +21,7 @@ class Storage extends Service { final String apiPath = '/storage/buckets/{bucketId}/files'.replaceAll( '{bucketId}', - bucketId, + _encodePath(bucketId), ); final Map apiParams = { @@ -78,7 +78,7 @@ class Storage extends Service { final String apiPath = '/storage/buckets/{bucketId}/files'.replaceAll( '{bucketId}', - bucketId, + _encodePath(bucketId), ); final Map apiParams = { @@ -131,11 +131,11 @@ class Storage extends Service { final String apiPath = '/storage/buckets/{bucketId}/files/{fileId}' .replaceAll( '{bucketId}', - bucketId, + _encodePath(bucketId), ) .replaceAll( '{fileId}', - fileId, + _encodePath(fileId), ); final Map apiParams = {}; @@ -178,11 +178,11 @@ class Storage extends Service { final String apiPath = '/storage/buckets/{bucketId}/files/{fileId}' .replaceAll( '{bucketId}', - bucketId, + _encodePath(bucketId), ) .replaceAll( '{fileId}', - fileId, + _encodePath(fileId), ); final Map apiParams = { @@ -227,11 +227,11 @@ class Storage extends Service { final String apiPath = '/storage/buckets/{bucketId}/files/{fileId}' .replaceAll( '{bucketId}', - bucketId, + _encodePath(bucketId), ) .replaceAll( '{fileId}', - fileId, + _encodePath(fileId), ); final Map apiParams = {}; @@ -275,11 +275,11 @@ class Storage extends Service { final String apiPath = '/storage/buckets/{bucketId}/files/{fileId}/download' .replaceAll( '{bucketId}', - bucketId, + _encodePath(bucketId), ) .replaceAll( '{fileId}', - fileId, + _encodePath(fileId), ); final Map apiParams = { @@ -337,11 +337,11 @@ class Storage extends Service { final String apiPath = '/storage/buckets/{bucketId}/files/{fileId}/preview' .replaceAll( '{bucketId}', - bucketId, + _encodePath(bucketId), ) .replaceAll( '{fileId}', - fileId, + _encodePath(fileId), ); final Map apiParams = { @@ -397,11 +397,11 @@ class Storage extends Service { final String apiPath = '/storage/buckets/{bucketId}/files/{fileId}/view' .replaceAll( '{bucketId}', - bucketId, + _encodePath(bucketId), ) .replaceAll( '{fileId}', - fileId, + _encodePath(fileId), ); final Map apiParams = { diff --git a/lib/services/tables_db.dart b/lib/services/tables_db.dart index 3ad93e30..c3914d57 100644 --- a/lib/services/tables_db.dart +++ b/lib/services/tables_db.dart @@ -71,7 +71,7 @@ class TablesDB extends Service { final String apiPath = '/tablesdb/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = {}; @@ -105,7 +105,7 @@ class TablesDB extends Service { final String apiPath = '/tablesdb/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = { @@ -141,7 +141,7 @@ class TablesDB extends Service { final String apiPath = '/tablesdb/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = {}; @@ -176,7 +176,7 @@ class TablesDB extends Service { final String apiPath = '/tablesdb/transactions/{transactionId}/operations' .replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = { @@ -232,11 +232,11 @@ class TablesDB extends Service { final String apiPath = '/tablesdb/{databaseId}/tables/{tableId}/rows' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ); final Map apiParams = { @@ -288,11 +288,11 @@ class TablesDB extends Service { final String apiPath = '/tablesdb/{databaseId}/tables/{tableId}/rows' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ); final Map apiParams = { @@ -345,11 +345,11 @@ class TablesDB extends Service { final String apiPath = '/tablesdb/{databaseId}/tables/{tableId}/rows/query' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ); final Map apiParams = { @@ -406,15 +406,15 @@ class TablesDB extends Service { '/tablesdb/{databaseId}/tables/{tableId}/rows/{rowId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ) .replaceAll( '{rowId}', - rowId, + _encodePath(rowId), ); final Map apiParams = { @@ -471,15 +471,15 @@ class TablesDB extends Service { '/tablesdb/{databaseId}/tables/{tableId}/rows/{rowId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ) .replaceAll( '{rowId}', - rowId, + _encodePath(rowId), ); final Map apiParams = { @@ -536,15 +536,15 @@ class TablesDB extends Service { '/tablesdb/{databaseId}/tables/{tableId}/rows/{rowId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ) .replaceAll( '{rowId}', - rowId, + _encodePath(rowId), ); final Map apiParams = { @@ -598,15 +598,15 @@ class TablesDB extends Service { '/tablesdb/{databaseId}/tables/{tableId}/rows/{rowId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ) .replaceAll( '{rowId}', - rowId, + _encodePath(rowId), ); final Map apiParams = { @@ -667,19 +667,19 @@ class TablesDB extends Service { '/tablesdb/{databaseId}/tables/{tableId}/rows/{rowId}/{column}/decrement' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ) .replaceAll( '{rowId}', - rowId, + _encodePath(rowId), ) .replaceAll( '{column}', - column, + _encodePath(column), ); final Map apiParams = { @@ -742,19 +742,19 @@ class TablesDB extends Service { '/tablesdb/{databaseId}/tables/{tableId}/rows/{rowId}/{column}/increment' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{tableId}', - tableId, + _encodePath(tableId), ) .replaceAll( '{rowId}', - rowId, + _encodePath(rowId), ) .replaceAll( '{column}', - column, + _encodePath(column), ); final Map apiParams = { diff --git a/lib/services/teams.dart b/lib/services/teams.dart index 307318db..7674d795 100644 --- a/lib/services/teams.dart +++ b/lib/services/teams.dart @@ -80,7 +80,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = {}; @@ -113,7 +113,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = { @@ -149,7 +149,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = {}; @@ -184,7 +184,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/installations'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = { @@ -224,7 +224,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/installations'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = { @@ -270,11 +270,11 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/installations/{installationId}' .replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ) .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = {}; @@ -318,11 +318,11 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/installations/{installationId}' .replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ) .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = { @@ -368,11 +368,11 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/installations/{installationId}' .replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ) .replaceAll( '{installationId}', - installationId, + _encodePath(installationId), ); final Map apiParams = {}; @@ -410,7 +410,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/memberships'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = { @@ -472,7 +472,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/memberships'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = { @@ -523,11 +523,11 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/memberships/{membershipId}' .replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ) .replaceAll( '{membershipId}', - membershipId, + _encodePath(membershipId), ); final Map apiParams = {}; @@ -570,11 +570,11 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/memberships/{membershipId}' .replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ) .replaceAll( '{membershipId}', - membershipId, + _encodePath(membershipId), ); final Map apiParams = { @@ -619,11 +619,11 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/memberships/{membershipId}' .replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ) .replaceAll( '{membershipId}', - membershipId, + _encodePath(membershipId), ); final Map apiParams = {}; @@ -671,11 +671,11 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/memberships/{membershipId}/status' .replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ) .replaceAll( '{membershipId}', - membershipId, + _encodePath(membershipId), ); final Map apiParams = { @@ -713,7 +713,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/prefs'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = {}; @@ -748,7 +748,7 @@ class Teams extends Service { final String apiPath = '/teams/{teamId}/prefs'.replaceAll( '{teamId}', - teamId, + _encodePath(teamId), ); final Map apiParams = { diff --git a/lib/services/vectors_db.dart b/lib/services/vectors_db.dart index fddd1087..45ce942e 100644 --- a/lib/services/vectors_db.dart +++ b/lib/services/vectors_db.dart @@ -69,7 +69,7 @@ class VectorsDB extends Service { final String apiPath = '/vectorsdb/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = {}; @@ -103,7 +103,7 @@ class VectorsDB extends Service { final String apiPath = '/vectorsdb/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = { @@ -139,7 +139,7 @@ class VectorsDB extends Service { final String apiPath = '/vectorsdb/transactions/{transactionId}'.replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = {}; @@ -174,7 +174,7 @@ class VectorsDB extends Service { final String apiPath = '/vectorsdb/transactions/{transactionId}/operations' .replaceAll( '{transactionId}', - transactionId, + _encodePath(transactionId), ); final Map apiParams = { @@ -223,11 +223,11 @@ class VectorsDB extends Service { '/vectorsdb/{databaseId}/collections/{collectionId}/documents' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -280,11 +280,11 @@ class VectorsDB extends Service { '/vectorsdb/{databaseId}/collections/{collectionId}/documents' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -338,11 +338,11 @@ class VectorsDB extends Service { '/vectorsdb/{databaseId}/collections/{collectionId}/documents/query' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ); final Map apiParams = { @@ -399,15 +399,15 @@ class VectorsDB extends Service { '/vectorsdb/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -464,15 +464,15 @@ class VectorsDB extends Service { '/vectorsdb/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -529,15 +529,15 @@ class VectorsDB extends Service { '/vectorsdb/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { @@ -591,15 +591,15 @@ class VectorsDB extends Service { '/vectorsdb/{databaseId}/collections/{collectionId}/documents/{documentId}' .replaceAll( '{databaseId}', - databaseId, + _encodePath(databaseId), ) .replaceAll( '{collectionId}', - collectionId, + _encodePath(collectionId), ) .replaceAll( '{documentId}', - documentId, + _encodePath(documentId), ); final Map apiParams = { diff --git a/lib/src/client_browser.dart b/lib/src/client_browser.dart index ab689f04..21a52772 100644 --- a/lib/src/client_browser.dart +++ b/lib/src/client_browser.dart @@ -40,8 +40,8 @@ class ClientBrowser extends ClientBase with ClientMixin { 'x-sdk-name': 'Flutter', 'x-sdk-platform': 'client', 'x-sdk-language': 'flutter', - 'x-sdk-version': '28.1.0', - 'X-Appwrite-Response-Format': '2.5.0', + 'x-sdk-version': '28.2.0', + 'X-Appwrite-Response-Format': '2.6.2', }; config = {}; @@ -233,11 +233,15 @@ class ClientBrowser extends ClientBase with ClientMixin { var offset = 0; String? uploadId; if (idParamName.isNotEmpty && params[idParamName] != null) { + final idValue = params[idParamName].toString(); + if (idValue == '.' || idValue == '..') { + throw AppwriteException('Path parameter cannot be "." or ".."'); + } //make a request to check if a file already exists try { res = await call( HttpMethod.get, - path: '$path/${params[idParamName]}', + path: '$path/${Uri.encodeComponent(idValue)}', headers: headers, ); final int chunksUploaded = res.data['chunksUploaded'] as int; diff --git a/lib/src/client_io.dart b/lib/src/client_io.dart index 5d91c62c..cd74662a 100644 --- a/lib/src/client_io.dart +++ b/lib/src/client_io.dart @@ -59,8 +59,8 @@ class ClientIO extends ClientBase with ClientMixin { 'x-sdk-name': 'Flutter', 'x-sdk-platform': 'client', 'x-sdk-language': 'flutter', - 'x-sdk-version': '28.1.0', - 'X-Appwrite-Response-Format': '2.5.0', + 'x-sdk-version': '28.2.0', + 'X-Appwrite-Response-Format': '2.6.2', }; config = {}; @@ -364,11 +364,15 @@ class ClientIO extends ClientBase with ClientMixin { var offset = 0; String? uploadId; if (idParamName.isNotEmpty && params[idParamName] != null) { + final idValue = params[idParamName].toString(); + if (idValue == '.' || idValue == '..') { + throw AppwriteException('Path parameter cannot be "." or ".."'); + } //make a request to check if a file already exists try { res = await call( HttpMethod.get, - path: '$path/${params[idParamName]}', + path: '$path/${Uri.encodeComponent(idValue)}', headers: headers, ); final int chunksUploaded = res.data['chunksUploaded'] as int; diff --git a/pubspec.yaml b/pubspec.yaml index 2147f32e..78e84c3f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,5 +1,5 @@ name: appwrite -version: 28.1.0 +version: 28.2.0 description: Appwrite is an open-source self-hosted backend server that abstracts and simplifies complex and repetitive development tasks behind a very simple REST API homepage: https://appwrite.io repository: https://github.com/appwrite/sdk-for-flutter diff --git a/test/services/account_test.dart b/test/services/account_test.dart index 3a712b73..3b64c48e 100644 --- a/test/services/account_test.dart +++ b/test/services/account_test.dart @@ -113,7 +113,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -151,6 +151,7 @@ void main() { userId: "", email: "email@example.com", password: "password", + name: "", ); final Map params = verify( client.call( @@ -161,7 +162,12 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "email", "password"])); + expect(params, { + "userId": "", + "email": "email@example.com", + "password": "password", + "name": "", + }); expect(response, isA()); }); @@ -181,7 +187,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.listConsents(); + final response = await account.listConsents( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -191,7 +200,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -226,13 +238,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/account/consents/", + path: "/account/consents/%3CCONSENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -255,13 +267,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/account/consents/", + path: "/account/consents/%3CCONSENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method listConsentTokens()', () async { @@ -282,17 +294,22 @@ void main() { final response = await account.listConsentTokens( consentId: "", + queries: [], + total: false, ); final Map params = verify( client.call( HttpMethod.get, - path: "/account/consents//tokens", + path: "/account/consents/%3CCONSENT_ID%3E/tokens", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -329,13 +346,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/account/consents//tokens/", + path: "/account/consents/%3CCONSENT_ID%3E/tokens/%3CTOKEN_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -359,13 +376,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/account/consents//tokens/", + path: "/account/consents/%3CCONSENT_ID%3E/tokens/%3CTOKEN_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method updateEmail()', () async { @@ -411,7 +428,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["email", "password"])); + expect(params, { + "email": "email@example.com", + "password": "password", + }); expect(response, isA()); }); @@ -431,7 +451,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.listIdentities(); + final response = await account.listIdentities( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -441,7 +464,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -464,13 +490,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/account/identities/", + path: "/account/identities/%3CIDENTITY_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method createJWT()', () async { @@ -489,7 +515,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.createJWT(); + final response = await account.createJWT( + duration: 1, + ); final Map params = verify( client.call( HttpMethod.post, @@ -499,7 +527,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "duration": 1, + }); expect(response, isA()); }); @@ -519,7 +549,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.listMemberships(); + final response = await account.listMemberships( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -529,7 +562,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -564,7 +600,7 @@ void main() { ).thenAnswer((_) async => Response(data: data)); final response = await account.updateMFA( - mfa: true, + mfa: false, ); final Map params = verify( client.call( @@ -575,7 +611,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["mfa"])); + expect(params, { + "mfa": false, + }); expect(response, isA()); }); @@ -608,7 +646,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -641,7 +679,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -688,7 +726,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["otp"])); + expect(params, { + "otp": "", + }); expect(response, isA()); }); @@ -735,7 +775,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["otp"])); + expect(params, { + "otp": "", + }); expect(response, isA()); }); @@ -764,7 +806,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method deleteMFAAuthenticator()', () async { @@ -792,7 +834,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method createMfaChallenge()', () async { @@ -825,7 +867,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["factor"])); + expect(params, { + "factor": enums.AuthenticationFactor.email.value, + }); expect(response, isA()); }); @@ -859,7 +903,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["factor"])); + expect(params, { + "factor": enums.AuthenticationFactor.email.value, + }); expect(response, isA()); }); @@ -919,7 +965,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["challengeId", "otp"])); + expect(params, { + "challengeId": "", + "otp": "", + }); expect(response, isA()); }); @@ -979,7 +1028,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["challengeId", "otp"])); + expect(params, { + "challengeId": "", + "otp": "", + }); expect(response, isA()); }); @@ -1012,7 +1064,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1045,7 +1097,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1074,7 +1126,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1103,7 +1155,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1132,7 +1184,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1161,7 +1213,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1190,7 +1242,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1219,7 +1271,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1265,7 +1317,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["name"])); + expect(params, { + "name": "", + }); expect(response, isA()); }); @@ -1285,7 +1339,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.listPasskeys(); + final response = await account.listPasskeys( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -1295,7 +1352,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -1318,7 +1378,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.createPasskey(); + final response = await account.createPasskey( + passkeyId: "", + name: "", + ); final Map params = verify( client.call( HttpMethod.post, @@ -1328,7 +1391,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "passkeyId": "", + "name": "", + }); expect(response, isA()); }); @@ -1357,13 +1423,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/account/passkeys/", + path: "/account/passkeys/%3CPASSKEY_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1393,13 +1459,15 @@ void main() { final Map params = verify( client.call( HttpMethod.patch, - path: "/account/passkeys/", + path: "/account/passkeys/%3CPASSKEY_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["name"])); + expect(params, { + "name": "", + }); expect(response, isA()); }); @@ -1422,13 +1490,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/account/passkeys/", + path: "/account/passkeys/%3CPASSKEY_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method updatePasskeyVerification()', () async { @@ -1457,13 +1525,15 @@ void main() { final Map params = verify( client.call( HttpMethod.put, - path: "/account/passkeys//verification", + path: "/account/passkeys/%3CPASSKEY_ID%3E/verification", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["credential"])); + expect(params, { + "credential": isA(), + }); expect(response, isA()); }); @@ -1499,6 +1569,7 @@ void main() { final response = await account.updatePassword( password: "password", + oldPassword: "password", ); final Map params = verify( client.call( @@ -1509,7 +1580,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["password"])); + expect(params, { + "password": "password", + "oldPassword": "password", + }); expect(response, isA()); }); @@ -1556,7 +1630,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["phone", "password"])); + expect(params, { + "phone": "+12065550100", + "password": "password", + }); expect(response, isA()); }); @@ -1583,7 +1660,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1629,7 +1706,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["prefs"])); + expect(params, { + "prefs": isA(), + }); expect(response, isA()); }); @@ -1666,7 +1745,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["email", "url"])); + expect(params, { + "email": "email@example.com", + "url": "https://example.com", + }); expect(response, isA()); }); @@ -1704,7 +1786,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret", "password"])); + expect(params, { + "userId": "", + "secret": "", + "password": "password", + }); expect(response, isA()); }); @@ -1730,6 +1816,7 @@ void main() { final response = await account.createRecoveryOTP( email: "email@example.com", + phrase: false, ); final Map params = verify( client.call( @@ -1740,7 +1827,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["email"])); + expect(params, { + "email": "email@example.com", + "phrase": false, + }); expect(response, isA()); }); @@ -1778,7 +1868,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret", "password"])); + expect(params, { + "userId": "", + "secret": "", + "password": "password", + }); expect(response, isA()); }); @@ -1798,7 +1892,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.listSessions(); + final response = await account.listSessions( + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -1808,7 +1904,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "total": false, + }); expect(response, isA()); }); @@ -1825,7 +1923,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.deleteSessions(); + final response = await account.deleteSessions( + current: false, + ); final Map params = verify( client.call( HttpMethod.delete, @@ -1835,7 +1935,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "current": false, + }); }); test('test method createAnonymousSession()', () async { @@ -1891,7 +1993,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -1941,6 +2043,7 @@ void main() { final response = await account.createEmailPasswordSession( email: "email@example.com", password: "password", + duration: 1, ); final Map params = verify( client.call( @@ -1951,7 +2054,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["email", "password"])); + expect(params, { + "email": "email@example.com", + "password": "password", + "duration": 1, + }); expect(response, isA()); }); @@ -2001,6 +2108,10 @@ void main() { final response = await account.createIdTokenSession( provider: enums.IdTokenProvider.apple, idToken: "", + nonce: "", + accessToken: "", + accessTokenExpiry: 1, + name: "", ); final Map params = verify( client.call( @@ -2011,7 +2122,14 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["provider", "idToken"])); + expect(params, { + "provider": enums.IdTokenProvider.apple.value, + "idToken": "", + "nonce": "", + "accessToken": "", + "accessTokenExpiry": 1, + "name": "", + }); expect(response, isA()); }); @@ -2071,7 +2189,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret"])); + expect(params, { + "userId": "", + "secret": "", + }); expect(response, isA()); }); @@ -2082,9 +2203,16 @@ void main() { final response = await account.createOAuth2Session( provider: enums.OAuthProvider.amazon, + success: "https://example.com", + failure: "https://example.com", + scopes: [], + state: "", ); final Uri url = verify(client.webAuth(captureAny)).captured.single; expect(Uri.decodeFull(url.path), "/v1/account/sessions/oauth2/amazon"); + expect(url.queryParameters["success"], "https://example.com"); + expect(url.queryParameters["failure"], "https://example.com"); + expect(url.queryParameters["state"], ""); expect(response, equals('done')); }); @@ -2144,7 +2272,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret"])); + expect(params, { + "userId": "", + "secret": "", + }); expect(response, isA()); }); @@ -2204,7 +2335,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret"])); + expect(params, { + "userId": "", + "secret": "", + }); expect(response, isA()); }); @@ -2257,13 +2391,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/account/sessions/", + path: "/account/sessions/%3CSESSION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -2316,13 +2450,13 @@ void main() { final Map params = verify( client.call( HttpMethod.patch, - path: "/account/sessions/", + path: "/account/sessions/%3CSESSION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -2345,13 +2479,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/account/sessions/", + path: "/account/sessions/%3CSESSION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method updateStatus()', () async { @@ -2394,7 +2528,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -2423,6 +2557,9 @@ void main() { final response = await account.createPushTarget( targetId: "", identifier: "", + providerId: "", + bundleId: "", + environment: "sandbox", ); final Map params = verify( client.call( @@ -2433,7 +2570,13 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["targetId", "identifier"])); + expect(params, { + "targetId": "", + "identifier": "", + "providerId": "", + "bundleId": "", + "environment": "sandbox", + }); expect(response, isA()); }); @@ -2462,17 +2605,23 @@ void main() { final response = await account.updatePushTarget( targetId: "", identifier: "", + bundleId: "", + environment: "sandbox", ); final Map params = verify( client.call( HttpMethod.put, - path: "/account/targets//push", + path: "/account/targets/%3CTARGET_ID%3E/push", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["identifier"])); + expect(params, { + "identifier": "", + "bundleId": "", + "environment": "sandbox", + }); expect(response, isA()); }); @@ -2495,13 +2644,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/account/targets//push", + path: "/account/targets/%3CTARGET_ID%3E/push", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method createEmailToken()', () async { @@ -2527,6 +2676,7 @@ void main() { final response = await account.createEmailToken( userId: "", email: "email@example.com", + phrase: false, ); final Map params = verify( client.call( @@ -2537,7 +2687,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "email"])); + expect(params, { + "userId": "", + "email": "email@example.com", + "phrase": false, + }); expect(response, isA()); }); @@ -2564,6 +2718,8 @@ void main() { final response = await account.createMagicURLToken( userId: "", email: "email@example.com", + url: "https://example.com", + phrase: false, ); final Map params = verify( client.call( @@ -2574,7 +2730,12 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "email"])); + expect(params, { + "userId": "", + "email": "email@example.com", + "url": "https://example.com", + "phrase": false, + }); expect(response, isA()); }); @@ -2585,9 +2746,16 @@ void main() { final response = await account.createOAuth2Token( provider: enums.OAuthProvider.amazon, + success: "https://example.com", + failure: "https://example.com", + scopes: [], + state: "", ); final Uri url = verify(client.webAuth(captureAny)).captured.single; expect(Uri.decodeFull(url.path), "/v1/account/tokens/oauth2/amazon"); + expect(url.queryParameters["success"], "https://example.com"); + expect(url.queryParameters["failure"], "https://example.com"); + expect(url.queryParameters["state"], ""); expect(response, equals('done')); }); @@ -2620,7 +2788,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -2657,7 +2825,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["challengeId", "credential"])); + expect(params, { + "challengeId": "", + "credential": isA(), + }); expect(response, isA()); }); @@ -2694,7 +2865,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "phone"])); + expect(params, { + "userId": "", + "phone": "+12065550100", + }); expect(response, isA()); }); @@ -2730,7 +2904,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["url"])); + expect(params, { + "url": "https://example.com", + }); expect(response, isA()); }); @@ -2766,7 +2942,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["url"])); + expect(params, { + "url": "https://example.com", + }); expect(response, isA()); }); @@ -2803,7 +2981,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret"])); + expect(params, { + "userId": "", + "secret": "", + }); expect(response, isA()); }); @@ -2840,7 +3021,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret"])); + expect(params, { + "userId": "", + "secret": "", + }); expect(response, isA()); }); @@ -2864,7 +3048,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await account.createEmailVerificationOTP(); + final response = await account.createEmailVerificationOTP( + phrase: false, + ); final Map params = verify( client.call( HttpMethod.post, @@ -2874,7 +3060,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "phrase": false, + }); expect(response, isA()); }); @@ -2911,7 +3099,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret"])); + expect(params, { + "userId": "", + "secret": "", + }); expect(response, isA()); }); @@ -2945,7 +3136,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -2982,7 +3173,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret"])); + expect(params, { + "userId": "", + "secret": "", + }); expect(response, isA()); }); }); diff --git a/test/services/analytics_test.dart b/test/services/analytics_test.dart index 559e6e1b..b270a8fd 100644 --- a/test/services/analytics_test.dart +++ b/test/services/analytics_test.dart @@ -90,17 +90,40 @@ void main() { propertyId: "", name: "", url: "https://example.com", + domain: "", + referrer: "", + screenWidth: 1, + sessionHash: "", + scrollDepth: 1, + engagementTime: 1, + props: [], + userId: "", + ip: "", + userAgent: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/analytics/properties//events", + path: "/analytics/properties/%3CPROPERTY_ID%3E/events", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["name", "url"])); + expect(params, { + "name": "", + "url": "https://example.com", + "domain": "", + "referrer": "", + "screenWidth": 1, + "sessionHash": "", + "scrollDepth": 1, + "engagementTime": 1, + "props": isA(), + "userId": "", + "ip": "", + "userAgent": "", + }); }); }); } diff --git a/test/services/apps_test.dart b/test/services/apps_test.dart index f5d6e730..93ad5926 100644 --- a/test/services/apps_test.dart +++ b/test/services/apps_test.dart @@ -89,7 +89,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await apps.list(); + final response = await apps.list( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -99,7 +102,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -147,6 +153,22 @@ void main() { appId: "", name: "", redirectUris: [], + description: "", + clientUri: "https://example.com", + logoUri: "https://example.com", + privacyPolicyUrl: "https://example.com", + termsUrl: "https://example.com", + contacts: [], + tagline: "", + tags: [], + images: [], + supportUrl: "https://example.com", + dataDeletionUrl: "https://example.com", + postLogoutRedirectUris: [], + enabled: false, + type: "public", + deviceFlow: false, + teamId: "", ); final Map params = verify( client.call( @@ -157,7 +179,27 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["appId", "name", "redirectUris"])); + expect(params, { + "appId": "", + "name": "", + "description": "", + "clientUri": "https://example.com", + "logoUri": "https://example.com", + "privacyPolicyUrl": "https://example.com", + "termsUrl": "https://example.com", + "contacts": isA(), + "tagline": "", + "tags": isA(), + "images": isA(), + "supportUrl": "https://example.com", + "dataDeletionUrl": "https://example.com", + "redirectUris": isA(), + "postLogoutRedirectUris": isA(), + "enabled": false, + "type": "public", + "deviceFlow": false, + "teamId": "", + }); expect(response, isA()); }); @@ -187,7 +229,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -217,7 +259,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -267,13 +309,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/apps/", + path: "/apps/%3CAPP_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -320,17 +362,55 @@ void main() { final response = await apps.update( appId: "", name: "", + description: "", + clientUri: "https://example.com", + logoUri: "https://example.com", + privacyPolicyUrl: "https://example.com", + termsUrl: "https://example.com", + contacts: [], + tagline: "", + tags: [], + images: [], + supportUrl: "https://example.com", + dataDeletionUrl: "https://example.com", + enabled: false, + redirectUris: [], + postLogoutRedirectUris: [], + type: "public", + deviceFlow: false, + installationScopes: [], + installationRedirectUrl: "https://example.com", ); final Map params = verify( client.call( HttpMethod.put, - path: "/apps/", + path: "/apps/%3CAPP_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["name"])); + expect(params, { + "name": "", + "description": "", + "clientUri": "https://example.com", + "logoUri": "https://example.com", + "privacyPolicyUrl": "https://example.com", + "termsUrl": "https://example.com", + "contacts": isA(), + "tagline": "", + "tags": isA(), + "images": isA(), + "supportUrl": "https://example.com", + "dataDeletionUrl": "https://example.com", + "enabled": false, + "redirectUris": isA(), + "postLogoutRedirectUris": isA(), + "type": "public", + "deviceFlow": false, + "installationScopes": isA(), + "installationRedirectUrl": "https://example.com", + }); expect(response, isA()); }); @@ -353,13 +433,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/apps/", + path: "/apps/%3CAPP_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method listInstallations()', () async { @@ -380,17 +460,22 @@ void main() { final response = await apps.listInstallations( appId: "", + queries: [], + total: false, ); final Map params = verify( client.call( HttpMethod.get, - path: "/apps//installations", + path: "/apps/%3CAPP_ID%3E/installations", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -424,13 +509,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/apps//installations/", + path: "/apps/%3CAPP_ID%3E/installations/%3CINSTALLATION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -454,13 +539,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/apps//installations/", + path: "/apps/%3CAPP_ID%3E/installations/%3CINSTALLATION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method createInstallationToken()', () async { @@ -489,13 +574,13 @@ void main() { final Map params = verify( client.call( HttpMethod.post, - path: "/apps//installations//tokens", + path: "/apps/%3CAPP_ID%3E/installations/%3CINSTALLATION_ID%3E/tokens", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -517,17 +602,22 @@ void main() { final response = await apps.listKeys( appId: "", + queries: [], + total: false, ); final Map params = verify( client.call( HttpMethod.get, - path: "/apps//keys", + path: "/apps/%3CAPP_ID%3E/keys", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -560,13 +650,13 @@ void main() { final Map params = verify( client.call( HttpMethod.post, - path: "/apps//keys", + path: "/apps/%3CAPP_ID%3E/keys", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -600,13 +690,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/apps//keys/", + path: "/apps/%3CAPP_ID%3E/keys/%3CKEY_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -630,13 +720,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/apps//keys/", + path: "/apps/%3CAPP_ID%3E/keys/%3CKEY_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method listSecrets()', () async { @@ -657,17 +747,22 @@ void main() { final response = await apps.listSecrets( appId: "", + queries: [], + total: false, ); final Map params = verify( client.call( HttpMethod.get, - path: "/apps//secrets", + path: "/apps/%3CAPP_ID%3E/secrets", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -700,13 +795,13 @@ void main() { final Map params = verify( client.call( HttpMethod.post, - path: "/apps//secrets", + path: "/apps/%3CAPP_ID%3E/secrets", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -739,13 +834,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/apps//secrets/", + path: "/apps/%3CAPP_ID%3E/secrets/%3CSECRET_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -769,13 +864,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/apps//secrets/", + path: "/apps/%3CAPP_ID%3E/secrets/%3CSECRET_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method updateTeam()', () async { @@ -825,13 +920,15 @@ void main() { final Map params = verify( client.call( HttpMethod.patch, - path: "/apps//team", + path: "/apps/%3CAPP_ID%3E/team", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["teamId"])); + expect(params, { + "teamId": "", + }); expect(response, isA()); }); @@ -854,13 +951,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/apps//tokens", + path: "/apps/%3CAPP_ID%3E/tokens", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); }); } diff --git a/test/services/avatars_test.dart b/test/services/avatars_test.dart index 16f91365..aff83830 100644 --- a/test/services/avatars_test.dart +++ b/test/services/avatars_test.dart @@ -88,6 +88,9 @@ void main() { final response = await avatars.getBrowser( code: enums.Browser.avantBrowser, + width: 1, + height: 1, + quality: 1, ); final Map params = verify( client.call( @@ -98,7 +101,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "width": 1, + "height": 1, + "quality": 1, + }); expect(response, isA()); }); @@ -117,6 +124,9 @@ void main() { final response = await avatars.getCreditCard( code: enums.CreditCard.americanExpress, + width: 1, + height: 1, + quality: 1, ); final Map params = verify( client.call( @@ -127,7 +137,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "width": 1, + "height": 1, + "quality": 1, + }); expect(response, isA()); }); @@ -156,7 +170,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["url"])); + expect(params, { + "url": "https://example.com", + }); expect(response, isA()); }); @@ -175,6 +191,9 @@ void main() { final response = await avatars.getFlag( code: enums.Flag.afghanistan, + width: 1, + height: 1, + quality: 1, ); final Map params = verify( client.call( @@ -185,7 +204,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "width": 1, + "height": 1, + "quality": 1, + }); expect(response, isA()); }); @@ -204,6 +227,8 @@ void main() { final response = await avatars.getImage( url: "https://example.com", + width: 1, + height: 1, ); final Map params = verify( client.call( @@ -214,7 +239,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["url"])); + expect(params, { + "url": "https://example.com", + "width": 1, + "height": 1, + }); expect(response, isA()); }); @@ -231,7 +260,12 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await avatars.getInitials(); + final response = await avatars.getInitials( + name: "", + width: 1, + height: 1, + background: "FFFFFF", + ); final Map params = verify( client.call( HttpMethod.get, @@ -241,7 +275,12 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "name": "", + "width": 1, + "height": 1, + "background": "FFFFFF", + }); expect(response, isA()); }); @@ -258,7 +297,16 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await avatars.getPhoto(); + final response = await avatars.getPhoto( + width: 1, + height: 1, + quality: 1, + output: "png", + rating: "g", + userId: "current()", + emailHash: "", + name: "", + ); final Map params = verify( client.call( HttpMethod.get, @@ -268,7 +316,16 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "width": 1, + "height": 1, + "quality": 1, + "output": "png", + "rating": "g", + "userId": "current()", + "emailHash": "", + "name": "", + }); expect(response, isA()); }); @@ -316,7 +373,9 @@ void main() { method: HttpMethod.put, ), ).captured.single; - expect(params.keys, unorderedEquals(["file"])); + expect(params, { + "file": isA(), + }); expect(response, isA()); }); @@ -343,7 +402,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method getQR()', () async { @@ -361,6 +420,9 @@ void main() { final response = await avatars.getQR( text: "", + size: 1, + margin: 1, + download: false, ); final Map params = verify( client.call( @@ -371,7 +433,12 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["text"])); + expect(params, { + "text": "", + "size": 1, + "margin": 1, + "download": false, + }); expect(response, isA()); }); @@ -390,6 +457,25 @@ void main() { final response = await avatars.getScreenshot( url: "https://example.com", + headers: {}, + viewportWidth: 1, + viewportHeight: 1, + scale: 1.0, + theme: enums.BrowserTheme.dark, + userAgent: "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15", + fullpage: false, + locale: "en-US", + timezone: enums.Timezone.africaAbidjan, + latitude: 1.0, + longitude: 1.0, + accuracy: 1.0, + touch: false, + permissions: [enums.BrowserPermission.geolocation, enums.BrowserPermission.notifications], + sleep: 1, + width: 1, + height: 1, + quality: 1, + output: enums.ImageFormat.jpeg, ); final Map params = verify( client.call( @@ -400,7 +486,28 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["url"])); + expect(params, { + "url": "https://example.com", + "headers": isA(), + "viewportWidth": 1, + "viewportHeight": 1, + "scale": 1.0, + "theme": enums.BrowserTheme.dark.value, + "userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15", + "fullpage": false, + "locale": "en-US", + "timezone": enums.Timezone.africaAbidjan.value, + "latitude": 1.0, + "longitude": 1.0, + "accuracy": 1.0, + "touch": false, + "permissions": isA(), + "sleep": 1, + "width": 1, + "height": 1, + "quality": 1, + "output": enums.ImageFormat.jpeg.value, + }); expect(response, isA()); }); }); diff --git a/test/services/databases_test.dart b/test/services/databases_test.dart index f341f304..0523d431 100644 --- a/test/services/databases_test.dart +++ b/test/services/databases_test.dart @@ -89,7 +89,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await databases.listTransactions(); + final response = await databases.listTransactions( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -99,7 +102,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -123,7 +129,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await databases.createTransaction(); + final response = await databases.createTransaction( + ttl: 1, + ); final Map params = verify( client.call( HttpMethod.post, @@ -133,7 +141,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "ttl": 1, + }); expect(response, isA()); }); @@ -163,13 +173,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/databases/transactions/", + path: "/databases/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -195,17 +205,22 @@ void main() { final response = await databases.updateTransaction( transactionId: "", + commit: false, + rollback: false, ); final Map params = verify( client.call( HttpMethod.patch, - path: "/databases/transactions/", + path: "/databases/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "commit": false, + "rollback": false, + }); expect(response, isA()); }); @@ -228,13 +243,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/databases/transactions/", + path: "/databases/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method createOperations()', () async { @@ -259,17 +274,20 @@ void main() { final response = await databases.createOperations( transactionId: "", + operations: [], ); final Map params = verify( client.call( HttpMethod.post, - path: "/databases/transactions//operations", + path: "/databases/transactions/%3CTRANSACTION_ID%3E/operations", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "operations": isA(), + }); expect(response, isA()); }); @@ -292,17 +310,26 @@ void main() { final response = await databases.listDocuments( databaseId: "", collectionId: "", + queries: [], + transactionId: "", + total: false, + ttl: 1, ); final Map params = verify( client.call( HttpMethod.get, - path: "/databases//collections//documents", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -332,17 +359,24 @@ void main() { collectionId: "", documentId: "", data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/databases//collections//documents", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["documentId", "data"])); + expect(params, { + "documentId": "", + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -365,17 +399,26 @@ void main() { final response = await databases.createQuery( databaseId: "", collectionId: "", + queries: [], + transactionId: "", + total: false, + ttl: 1, ); final Map params = verify( client.call( HttpMethod.post, - path: "/databases//collections//documents/query", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/query", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -404,17 +447,22 @@ void main() { databaseId: "", collectionId: "", documentId: "", + queries: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.get, - path: "/databases//collections//documents/", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -443,17 +491,24 @@ void main() { databaseId: "", collectionId: "", documentId: "", + data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.put, - path: "/databases//collections//documents/", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -482,17 +537,24 @@ void main() { databaseId: "", collectionId: "", documentId: "", + data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/databases//collections//documents/", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -513,17 +575,20 @@ void main() { databaseId: "", collectionId: "", documentId: "", + transactionId: "", ); final Map params = verify( client.call( HttpMethod.delete, - path: "/databases//collections//documents/", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "transactionId": "", + }); }); test('test method decrementDocumentAttribute()', () async { @@ -552,17 +617,24 @@ void main() { collectionId: "", documentId: "", attribute: "", + value: 1.0, + min: 1.0, + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/databases//collections//documents///decrement", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E/%3CATTRIBUTE%3E/decrement", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "value": 1.0, + "min": 1.0, + "transactionId": "", + }); expect(response, isA()); }); @@ -592,17 +664,24 @@ void main() { collectionId: "", documentId: "", attribute: "", + value: 1.0, + max: 1.0, + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/databases//collections//documents///increment", + path: "/databases/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E/%3CATTRIBUTE%3E/increment", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "value": 1.0, + "max": 1.0, + "transactionId": "", + }); expect(response, isA()); }); }); diff --git a/test/services/documents_db_test.dart b/test/services/documents_db_test.dart index e6cd7d0b..d69530b4 100644 --- a/test/services/documents_db_test.dart +++ b/test/services/documents_db_test.dart @@ -89,7 +89,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await documentsDB.listTransactions(); + final response = await documentsDB.listTransactions( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -99,7 +102,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -123,7 +129,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await documentsDB.createTransaction(); + final response = await documentsDB.createTransaction( + ttl: 1, + ); final Map params = verify( client.call( HttpMethod.post, @@ -133,7 +141,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "ttl": 1, + }); expect(response, isA()); }); @@ -163,13 +173,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/documentsdb/transactions/", + path: "/documentsdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -195,17 +205,22 @@ void main() { final response = await documentsDB.updateTransaction( transactionId: "", + commit: false, + rollback: false, ); final Map params = verify( client.call( HttpMethod.patch, - path: "/documentsdb/transactions/", + path: "/documentsdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "commit": false, + "rollback": false, + }); expect(response, isA()); }); @@ -228,13 +243,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/documentsdb/transactions/", + path: "/documentsdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method createOperations()', () async { @@ -259,17 +274,20 @@ void main() { final response = await documentsDB.createOperations( transactionId: "", + operations: [], ); final Map params = verify( client.call( HttpMethod.post, - path: "/documentsdb/transactions//operations", + path: "/documentsdb/transactions/%3CTRANSACTION_ID%3E/operations", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "operations": isA(), + }); expect(response, isA()); }); @@ -292,17 +310,26 @@ void main() { final response = await documentsDB.listDocuments( databaseId: "", collectionId: "", + queries: [], + transactionId: "", + total: false, + ttl: 1, ); final Map params = verify( client.call( HttpMethod.get, - path: "/documentsdb//collections//documents", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -332,17 +359,24 @@ void main() { collectionId: "", documentId: "", data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/documentsdb//collections//documents", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["documentId", "data"])); + expect(params, { + "documentId": "", + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -366,17 +400,21 @@ void main() { databaseId: "", collectionId: "", documents: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/documentsdb//collections//documents", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["documents"])); + expect(params, { + "documents": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -399,17 +437,26 @@ void main() { final response = await documentsDB.createQuery( databaseId: "", collectionId: "", + queries: [], + transactionId: "", + total: false, + ttl: 1, ); final Map params = verify( client.call( HttpMethod.post, - path: "/documentsdb//collections//documents/query", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/query", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -438,17 +485,22 @@ void main() { databaseId: "", collectionId: "", documentId: "", + queries: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.get, - path: "/documentsdb//collections//documents/", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -477,17 +529,24 @@ void main() { databaseId: "", collectionId: "", documentId: "", + data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.put, - path: "/documentsdb//collections//documents/", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -516,17 +575,24 @@ void main() { databaseId: "", collectionId: "", documentId: "", + data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/documentsdb//collections//documents/", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -547,17 +613,20 @@ void main() { databaseId: "", collectionId: "", documentId: "", + transactionId: "", ); final Map params = verify( client.call( HttpMethod.delete, - path: "/documentsdb//collections//documents/", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "transactionId": "", + }); }); test('test method decrementDocumentAttribute()', () async { @@ -586,17 +655,24 @@ void main() { collectionId: "", documentId: "", attribute: "", + value: 1.0, + min: 1.0, + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/documentsdb//collections//documents///decrement", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E/%3CATTRIBUTE%3E/decrement", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "value": 1.0, + "min": 1.0, + "transactionId": "", + }); expect(response, isA()); }); @@ -626,17 +702,24 @@ void main() { collectionId: "", documentId: "", attribute: "", + value: 1.0, + max: 1.0, + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/documentsdb//collections//documents///increment", + path: "/documentsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E/%3CATTRIBUTE%3E/increment", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "value": 1.0, + "max": 1.0, + "transactionId": "", + }); expect(response, isA()); }); }); diff --git a/test/services/functions_test.dart b/test/services/functions_test.dart index 05edea49..14a0c530 100644 --- a/test/services/functions_test.dart +++ b/test/services/functions_test.dart @@ -91,17 +91,22 @@ void main() { final response = await functions.listExecutions( functionId: "", + queries: [], + total: false, ); final Map params = verify( client.call( HttpMethod.get, - path: "/functions//executions", + path: "/functions/%3CFUNCTION_ID%3E/executions", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -139,17 +144,30 @@ void main() { final response = await functions.createExecution( functionId: "", + body: "", + xasync: false, + path: "", + method: enums.ExecutionMethod.gET, + headers: {}, + scheduledAt: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/functions//executions", + path: "/functions/%3CFUNCTION_ID%3E/executions", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "body": "", + "async": false, + "path": "", + "method": enums.ExecutionMethod.gET.value, + "headers": isA(), + "scheduledAt": "", + }); expect(response, isA()); }); @@ -192,13 +210,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/functions//executions/", + path: "/functions/%3CFUNCTION_ID%3E/executions/%3CEXECUTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); }); diff --git a/test/services/graphql_test.dart b/test/services/graphql_test.dart index 0afd4fa7..734afba3 100644 --- a/test/services/graphql_test.dart +++ b/test/services/graphql_test.dart @@ -98,7 +98,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["query"])); + expect(params, { + "query": isA(), + }); }); test('test method mutation()', () async { @@ -126,7 +128,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["query"])); + expect(params, { + "query": isA(), + }); }); }); } diff --git a/test/services/locale_test.dart b/test/services/locale_test.dart index b58bdcb3..48ae11e5 100644 --- a/test/services/locale_test.dart +++ b/test/services/locale_test.dart @@ -104,7 +104,7 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -124,7 +124,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await locale.listCodes(); + final response = await locale.listCodes( + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -134,7 +136,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "total": false, + }); expect(response, isA()); }); @@ -154,7 +158,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await locale.listContinents(); + final response = await locale.listContinents( + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -164,7 +170,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "total": false, + }); expect(response, isA()); }); @@ -184,7 +192,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await locale.listCountries(); + final response = await locale.listCountries( + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -194,7 +204,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "total": false, + }); expect(response, isA()); }); @@ -214,7 +226,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await locale.listCountriesEU(); + final response = await locale.listCountriesEU( + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -224,7 +238,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "total": false, + }); expect(response, isA()); }); @@ -244,7 +260,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await locale.listCountriesPhones(); + final response = await locale.listCountriesPhones( + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -254,7 +272,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "total": false, + }); expect(response, isA()); }); @@ -274,7 +294,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await locale.listCurrencies(); + final response = await locale.listCurrencies( + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -284,7 +306,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "total": false, + }); expect(response, isA()); }); @@ -304,7 +328,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await locale.listLanguages(); + final response = await locale.listLanguages( + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -314,7 +340,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "total": false, + }); expect(response, isA()); }); }); diff --git a/test/services/messaging_test.dart b/test/services/messaging_test.dart index 11fba0b9..db237091 100644 --- a/test/services/messaging_test.dart +++ b/test/services/messaging_test.dart @@ -113,13 +113,16 @@ void main() { final Map params = verify( client.call( HttpMethod.post, - path: "/messaging/topics//subscribers", + path: "/messaging/topics/%3CTOPIC_ID%3E/subscribers", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["subscriberId", "targetId"])); + expect(params, { + "subscriberId": "", + "targetId": "", + }); expect(response, isA()); }); @@ -143,13 +146,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/messaging/topics//subscribers/", + path: "/messaging/topics/%3CTOPIC_ID%3E/subscribers/%3CSUBSCRIBER_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); }); } diff --git a/test/services/oauth2_test.dart b/test/services/oauth2_test.dart index a8429a5f..7eea84ba 100644 --- a/test/services/oauth2_test.dart +++ b/test/services/oauth2_test.dart @@ -90,6 +90,8 @@ void main() { final response = await oauth2.approve( grantId: "", + authorizationDetails: "", + scope: "", ); final Map params = verify( client.call( @@ -100,7 +102,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["grant_id"])); + expect(params, { + "grant_id": "", + "authorization_details": "", + "scope": "", + }); expect(response, isA()); }); @@ -120,7 +126,22 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await oauth2.authorize(); + final response = await oauth2.authorize( + clientId: "", + redirectUri: "https://example.com", + responseType: "response_type", + scope: "", + state: "", + nonce: "", + codeChallenge: "", + codeChallengeMethod: "s256", + prompt: "", + maxAge: 1, + authorizationDetails: "", + resource: [], + audience: "", + requestUri: "", + ); final Map params = verify( client.call( HttpMethod.get, @@ -130,7 +151,22 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "client_id": "", + "redirect_uri": "https://example.com", + "response_type": "response_type", + "scope": "", + "state": "", + "nonce": "", + "code_challenge": "", + "code_challenge_method": "s256", + "prompt": "", + "max_age": 1, + "authorization_details": "", + "resource": isA(), + "audience": "", + "request_uri": "", + }); expect(response, isA()); }); @@ -150,7 +186,22 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await oauth2.authorizePost(); + final response = await oauth2.authorizePost( + clientId: "", + redirectUri: "https://example.com", + responseType: "response_type", + scope: "", + state: "", + nonce: "", + codeChallenge: "", + codeChallengeMethod: "s256", + prompt: "", + maxAge: 1, + authorizationDetails: "", + resource: [], + audience: "", + requestUri: "", + ); final Map params = verify( client.call( HttpMethod.post, @@ -160,7 +211,22 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "client_id": "", + "redirect_uri": "https://example.com", + "response_type": "response_type", + "scope": "", + "state": "", + "nonce": "", + "code_challenge": "", + "code_challenge_method": "s256", + "prompt": "", + "max_age": 1, + "authorization_details": "", + "resource": isA(), + "audience": "", + "request_uri": "", + }); expect(response, isA()); }); @@ -186,7 +252,13 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await oauth2.createDeviceAuthorization(); + final response = await oauth2.createDeviceAuthorization( + clientId: "", + scope: "", + authorizationDetails: "", + resource: [], + audience: "", + ); final Map params = verify( client.call( HttpMethod.post, @@ -196,7 +268,13 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "client_id": "", + "scope": "", + "authorization_details": "", + "resource": isA(), + "audience": "", + }); expect(response, isA()); }); @@ -239,7 +317,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["user_code"])); + expect(params, { + "user_code": "", + }); expect(response, isA()); }); @@ -276,13 +356,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/oauth2/testproject/grants/", + path: "/oauth2/testproject/grants/%3CGRANT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -299,7 +379,14 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await oauth2.logout(); + final response = await oauth2.logout( + idTokenHint: "", + logoutHint: "", + clientId: "", + postLogoutRedirectUri: "https://example.com", + state: "", + uiLocales: "", + ); final Map params = verify( client.call( HttpMethod.get, @@ -309,7 +396,14 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "id_token_hint": "", + "logout_hint": "", + "client_id": "", + "post_logout_redirect_uri": "https://example.com", + "state": "", + "ui_locales": "", + }); }); test('test method logoutPost()', () async { @@ -325,7 +419,14 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await oauth2.logoutPost(); + final response = await oauth2.logoutPost( + idTokenHint: "", + logoutHint: "", + clientId: "", + postLogoutRedirectUri: "https://example.com", + state: "", + uiLocales: "", + ); final Map params = verify( client.call( HttpMethod.post, @@ -335,7 +436,14 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "id_token_hint": "", + "logout_hint": "", + "client_id": "", + "post_logout_redirect_uri": "https://example.com", + "state": "", + "ui_locales": "", + }); }); test('test method listOrganizations()', () async { @@ -354,7 +462,11 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await oauth2.listOrganizations(); + final response = await oauth2.listOrganizations( + limit: 1, + offset: 1, + search: "", + ); final Map params = verify( client.call( HttpMethod.get, @@ -364,7 +476,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "limit": 1, + "offset": 1, + "search": "", + }); expect(response, isA()); }); @@ -388,6 +504,16 @@ void main() { clientId: "", redirectUri: "https://example.com", responseType: "code", + scope: "", + state: "", + nonce: "", + codeChallenge: "", + codeChallengeMethod: "s256", + prompt: "", + maxAge: 1, + authorizationDetails: "", + resource: [], + audience: "", ); final Map params = verify( client.call( @@ -398,7 +524,21 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["client_id", "redirect_uri", "response_type"])); + expect(params, { + "client_id": "", + "redirect_uri": "https://example.com", + "response_type": "code", + "scope": "", + "state": "", + "nonce": "", + "code_challenge": "", + "code_challenge_method": "s256", + "prompt": "", + "max_age": 1, + "authorization_details": "", + "resource": isA(), + "audience": "", + }); expect(response, isA()); }); @@ -418,7 +558,11 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await oauth2.listProjects(); + final response = await oauth2.listProjects( + limit: 1, + offset: 1, + search: "", + ); final Map params = verify( client.call( HttpMethod.get, @@ -428,7 +572,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "limit": 1, + "offset": 1, + "search": "", + }); expect(response, isA()); }); @@ -460,7 +608,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["grant_id"])); + expect(params, { + "grant_id": "", + }); expect(response, isA()); }); @@ -479,6 +629,9 @@ void main() { final response = await oauth2.revoke( token: "", + tokenTypeHint: "access_token", + clientId: "", + clientSecret: "", ); final Map params = verify( client.call( @@ -489,7 +642,12 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["token"])); + expect(params, { + "token": "", + "token_type_hint": "access_token", + "client_id": "", + "client_secret": "", + }); }); test('test method createToken()', () async { @@ -513,6 +671,15 @@ void main() { final response = await oauth2.createToken( grantType: "", + code: "", + refreshToken: "", + deviceCode: "", + clientId: "", + clientSecret: "", + codeVerifier: "", + redirectUri: "https://example.com", + resource: [], + audience: "", ); final Map params = verify( client.call( @@ -523,7 +690,18 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["grant_type"])); + expect(params, { + "grant_type": "", + "code": "", + "refresh_token": "", + "device_code": "", + "client_id": "", + "client_secret": "", + "code_verifier": "", + "redirect_uri": "https://example.com", + "resource": isA(), + "audience": "", + }); expect(response, isA()); }); }); diff --git a/test/services/organization_test.dart b/test/services/organization_test.dart index 4e39beda..e675582b 100644 --- a/test/services/organization_test.dart +++ b/test/services/organization_test.dart @@ -89,7 +89,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await organization.listInstallations(); + final response = await organization.listInstallations( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -99,7 +102,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -128,6 +134,7 @@ void main() { final response = await organization.createInstallation( appId: "", + authorizationDetails: "", ); final Map params = verify( client.call( @@ -138,7 +145,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["appId"])); + expect(params, { + "appId": "", + "authorizationDetails": "", + }); expect(response, isA()); }); @@ -171,13 +181,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/organization/installations/", + path: "/organization/installations/%3CINSTALLATION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -206,17 +216,20 @@ void main() { final response = await organization.updateInstallation( installationId: "", + authorizationDetails: "", ); final Map params = verify( client.call( HttpMethod.put, - path: "/organization/installations/", + path: "/organization/installations/%3CINSTALLATION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "authorizationDetails": "", + }); expect(response, isA()); }); @@ -239,13 +252,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/organization/installations/", + path: "/organization/installations/%3CINSTALLATION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); }); } diff --git a/test/services/presences_test.dart b/test/services/presences_test.dart index 13c02de0..baf04899 100644 --- a/test/services/presences_test.dart +++ b/test/services/presences_test.dart @@ -89,7 +89,11 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await presences.list(); + final response = await presences.list( + queries: [], + total: false, + ttl: 1, + ); final Map params = verify( client.call( HttpMethod.get, @@ -99,7 +103,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -129,13 +137,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/presences/", + path: "/presences/%3CPRESENCE_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -162,17 +170,25 @@ void main() { final response = await presences.upsert( presenceId: "", status: "", + permissions: [], + expiresAt: "2020-10-15T06:38:00.000+00:00", + metadata: {}, ); final Map params = verify( client.call( HttpMethod.put, - path: "/presences/", + path: "/presences/%3CPRESENCE_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["status"])); + expect(params, { + "status": "", + "permissions": isA(), + "expiresAt": "2020-10-15T06:38:00.000+00:00", + "metadata": isA(), + }); expect(response, isA()); }); @@ -198,17 +214,28 @@ void main() { final response = await presences.update( presenceId: "", + status: "", + expiresAt: "2020-10-15T06:38:00.000+00:00", + metadata: {}, + permissions: [], + purge: false, ); final Map params = verify( client.call( HttpMethod.patch, - path: "/presences/", + path: "/presences/%3CPRESENCE_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "status": "", + "expiresAt": "2020-10-15T06:38:00.000+00:00", + "metadata": isA(), + "permissions": isA(), + "purge": false, + }); expect(response, isA()); }); @@ -231,13 +258,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/presences/", + path: "/presences/%3CPRESENCE_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); }); } diff --git a/test/services/storage_test.dart b/test/services/storage_test.dart index 72b05be7..3750cc01 100644 --- a/test/services/storage_test.dart +++ b/test/services/storage_test.dart @@ -91,17 +91,24 @@ void main() { final response = await storage.listFiles( bucketId: "", + queries: [], + search: "", + total: false, ); final Map params = verify( client.call( HttpMethod.get, - path: "/storage/buckets//files", + path: "/storage/buckets/%3CBUCKET_ID%3E/files", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "search": "", + "total": false, + }); expect(response, isA()); }); @@ -140,10 +147,12 @@ void main() { bucketId: "", fileId: "", file: InputFile.fromPath(path: './image.png'), + permissions: [], + folder: "photos/2026", ); final Map params = verify( client.chunkedUpload( - path: "/storage/buckets//files", + path: "/storage/buckets/%3CBUCKET_ID%3E/files", params: captureAnyNamed('params'), paramName: anyNamed('paramName'), idParamName: anyNamed('idParamName'), @@ -151,7 +160,12 @@ void main() { method: HttpMethod.post, ), ).captured.single; - expect(params.keys, unorderedEquals(["fileId", "file"])); + expect(params, { + "fileId": "", + "file": isA(), + "permissions": isA(), + "folder": "photos/2026", + }); expect(response, isA()); }); @@ -192,13 +206,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/storage/buckets//files/", + path: "/storage/buckets/%3CBUCKET_ID%3E/files/%3CFILE_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -235,17 +249,22 @@ void main() { final response = await storage.updateFile( bucketId: "", fileId: "", + name: "name", + permissions: [], ); final Map params = verify( client.call( HttpMethod.put, - path: "/storage/buckets//files/", + path: "/storage/buckets/%3CBUCKET_ID%3E/files/%3CFILE_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "name": "name", + "permissions": isA(), + }); expect(response, isA()); }); @@ -269,13 +288,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/storage/buckets//files/", + path: "/storage/buckets/%3CBUCKET_ID%3E/files/%3CFILE_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method getFileDownload()', () async { @@ -294,17 +313,20 @@ void main() { final response = await storage.getFileDownload( bucketId: "", fileId: "", + token: "", ); final Map params = verify( client.call( HttpMethod.get, - path: "/storage/buckets//files//download", + path: "/storage/buckets/%3CBUCKET_ID%3E/files/%3CFILE_ID%3E/download", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "token": "", + }); expect(response, isA()); }); @@ -324,17 +346,42 @@ void main() { final response = await storage.getFilePreview( bucketId: "", fileId: "", + width: 1, + height: 1, + gravity: enums.ImageGravity.auto, + quality: 1, + borderWidth: 1, + borderColor: "FFFFFF", + borderRadius: 1, + opacity: 1.0, + rotation: 1, + background: "FFFFFF", + output: enums.ImageFormat.jpg, + token: "", ); final Map params = verify( client.call( HttpMethod.get, - path: "/storage/buckets//files//preview", + path: "/storage/buckets/%3CBUCKET_ID%3E/files/%3CFILE_ID%3E/preview", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "width": 1, + "height": 1, + "gravity": enums.ImageGravity.auto.value, + "quality": 1, + "borderWidth": 1, + "borderColor": "FFFFFF", + "borderRadius": 1, + "opacity": 1.0, + "rotation": 1, + "background": "FFFFFF", + "output": enums.ImageFormat.jpg.value, + "token": "", + }); expect(response, isA()); }); @@ -354,17 +401,20 @@ void main() { final response = await storage.getFileView( bucketId: "", fileId: "", + token: "", ); final Map params = verify( client.call( HttpMethod.get, - path: "/storage/buckets//files//view", + path: "/storage/buckets/%3CBUCKET_ID%3E/files/%3CFILE_ID%3E/view", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "token": "", + }); expect(response, isA()); }); }); diff --git a/test/services/tables_db_test.dart b/test/services/tables_db_test.dart index 526bd009..99b1d079 100644 --- a/test/services/tables_db_test.dart +++ b/test/services/tables_db_test.dart @@ -89,7 +89,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await tablesDB.listTransactions(); + final response = await tablesDB.listTransactions( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -99,7 +102,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -123,7 +129,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await tablesDB.createTransaction(); + final response = await tablesDB.createTransaction( + ttl: 1, + ); final Map params = verify( client.call( HttpMethod.post, @@ -133,7 +141,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "ttl": 1, + }); expect(response, isA()); }); @@ -163,13 +173,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/tablesdb/transactions/", + path: "/tablesdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -195,17 +205,22 @@ void main() { final response = await tablesDB.updateTransaction( transactionId: "", + commit: false, + rollback: false, ); final Map params = verify( client.call( HttpMethod.patch, - path: "/tablesdb/transactions/", + path: "/tablesdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "commit": false, + "rollback": false, + }); expect(response, isA()); }); @@ -228,13 +243,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/tablesdb/transactions/", + path: "/tablesdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method createOperations()', () async { @@ -259,17 +274,20 @@ void main() { final response = await tablesDB.createOperations( transactionId: "", + operations: [], ); final Map params = verify( client.call( HttpMethod.post, - path: "/tablesdb/transactions//operations", + path: "/tablesdb/transactions/%3CTRANSACTION_ID%3E/operations", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "operations": isA(), + }); expect(response, isA()); }); @@ -292,17 +310,26 @@ void main() { final response = await tablesDB.listRows( databaseId: "", tableId: "", + queries: [], + transactionId: "", + total: false, + ttl: 1, ); final Map params = verify( client.call( HttpMethod.get, - path: "/tablesdb//tables//rows", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -332,17 +359,24 @@ void main() { tableId: "", rowId: "", data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/tablesdb//tables//rows", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["rowId", "data"])); + expect(params, { + "rowId": "", + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -365,17 +399,26 @@ void main() { final response = await tablesDB.createQuery( databaseId: "", tableId: "", + queries: [], + transactionId: "", + total: false, + ttl: 1, ); final Map params = verify( client.call( HttpMethod.post, - path: "/tablesdb//tables//rows/query", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows/query", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -404,17 +447,22 @@ void main() { databaseId: "", tableId: "", rowId: "", + queries: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.get, - path: "/tablesdb//tables//rows/", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows/%3CROW_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -443,17 +491,24 @@ void main() { databaseId: "", tableId: "", rowId: "", + data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.put, - path: "/tablesdb//tables//rows/", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows/%3CROW_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -482,17 +537,24 @@ void main() { databaseId: "", tableId: "", rowId: "", + data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/tablesdb//tables//rows/", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows/%3CROW_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -513,17 +575,20 @@ void main() { databaseId: "", tableId: "", rowId: "", + transactionId: "", ); final Map params = verify( client.call( HttpMethod.delete, - path: "/tablesdb//tables//rows/", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows/%3CROW_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "transactionId": "", + }); }); test('test method decrementRowColumn()', () async { @@ -552,17 +617,24 @@ void main() { tableId: "", rowId: "", column: "", + value: 1.0, + min: 1.0, + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/tablesdb//tables//rows///decrement", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows/%3CROW_ID%3E/%3CCOLUMN%3E/decrement", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "value": 1.0, + "min": 1.0, + "transactionId": "", + }); expect(response, isA()); }); @@ -592,17 +664,24 @@ void main() { tableId: "", rowId: "", column: "", + value: 1.0, + max: 1.0, + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/tablesdb//tables//rows///increment", + path: "/tablesdb/%3CDATABASE_ID%3E/tables/%3CTABLE_ID%3E/rows/%3CROW_ID%3E/%3CCOLUMN%3E/increment", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "value": 1.0, + "max": 1.0, + "transactionId": "", + }); expect(response, isA()); }); }); diff --git a/test/services/teams_test.dart b/test/services/teams_test.dart index fcf47c3f..724ab2a5 100644 --- a/test/services/teams_test.dart +++ b/test/services/teams_test.dart @@ -89,7 +89,11 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await teams.list(); + final response = await teams.list( + queries: [], + search: "", + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -99,7 +103,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "search": "", + "total": false, + }); expect(response, isA()); }); @@ -126,6 +134,7 @@ void main() { final response = await teams.create( teamId: "", name: "", + roles: [], ); final Map params = verify( client.call( @@ -136,7 +145,11 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["teamId", "name"])); + expect(params, { + "teamId": "", + "name": "", + "roles": isA(), + }); expect(response, isA()); }); @@ -166,13 +179,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/teams/", + path: "/teams/%3CTEAM_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -203,13 +216,15 @@ void main() { final Map params = verify( client.call( HttpMethod.put, - path: "/teams/", + path: "/teams/%3CTEAM_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["name"])); + expect(params, { + "name": "", + }); expect(response, isA()); }); @@ -232,13 +247,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/teams/", + path: "/teams/%3CTEAM_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method listInstallations()', () async { @@ -259,17 +274,22 @@ void main() { final response = await teams.listInstallations( teamId: "", + queries: [], + total: false, ); final Map params = verify( client.call( HttpMethod.get, - path: "/teams//installations", + path: "/teams/%3CTEAM_ID%3E/installations", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -299,17 +319,21 @@ void main() { final response = await teams.createInstallation( teamId: "", appId: "", + authorizationDetails: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/teams//installations", + path: "/teams/%3CTEAM_ID%3E/installations", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["appId"])); + expect(params, { + "appId": "", + "authorizationDetails": "", + }); expect(response, isA()); }); @@ -343,13 +367,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/teams//installations/", + path: "/teams/%3CTEAM_ID%3E/installations/%3CINSTALLATION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -379,17 +403,20 @@ void main() { final response = await teams.updateInstallation( teamId: "", installationId: "", + authorizationDetails: "", ); final Map params = verify( client.call( HttpMethod.put, - path: "/teams//installations/", + path: "/teams/%3CTEAM_ID%3E/installations/%3CINSTALLATION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "authorizationDetails": "", + }); expect(response, isA()); }); @@ -413,13 +440,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/teams//installations/", + path: "/teams/%3CTEAM_ID%3E/installations/%3CINSTALLATION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method listMemberships()', () async { @@ -440,17 +467,24 @@ void main() { final response = await teams.listMemberships( teamId: "", + queries: [], + search: "", + total: false, ); final Map params = verify( client.call( HttpMethod.get, - path: "/teams//memberships", + path: "/teams/%3CTEAM_ID%3E/memberships", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "search": "", + "total": false, + }); expect(response, isA()); }); @@ -486,17 +520,31 @@ void main() { final response = await teams.createMembership( teamId: "", roles: [], + email: "email@example.com", + userId: "", + phone: "+12065550100", + url: "https://example.com", + name: "", + membershipId: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/teams//memberships", + path: "/teams/%3CTEAM_ID%3E/memberships", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["roles"])); + expect(params, { + "email": "email@example.com", + "userId": "", + "phone": "+12065550100", + "roles": isA(), + "url": "https://example.com", + "name": "", + "membershipId": "", + }); expect(response, isA()); }); @@ -536,13 +584,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/teams//memberships/", + path: "/teams/%3CTEAM_ID%3E/memberships/%3CMEMBERSHIP_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -583,13 +631,15 @@ void main() { final Map params = verify( client.call( HttpMethod.patch, - path: "/teams//memberships/", + path: "/teams/%3CTEAM_ID%3E/memberships/%3CMEMBERSHIP_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["roles"])); + expect(params, { + "roles": isA(), + }); expect(response, isA()); }); @@ -613,13 +663,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/teams//memberships/", + path: "/teams/%3CTEAM_ID%3E/memberships/%3CMEMBERSHIP_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method updateMembershipStatus()', () async { @@ -660,13 +710,16 @@ void main() { final Map params = verify( client.call( HttpMethod.patch, - path: "/teams//memberships//status", + path: "/teams/%3CTEAM_ID%3E/memberships/%3CMEMBERSHIP_ID%3E/status", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["userId", "secret"])); + expect(params, { + "userId": "", + "secret": "", + }); expect(response, isA()); }); @@ -689,13 +742,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/teams//prefs", + path: "/teams/%3CTEAM_ID%3E/prefs", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -719,13 +772,15 @@ void main() { final Map params = verify( client.call( HttpMethod.put, - path: "/teams//prefs", + path: "/teams/%3CTEAM_ID%3E/prefs", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["prefs"])); + expect(params, { + "prefs": isA(), + }); expect(response, isA()); }); }); diff --git a/test/services/vectors_db_test.dart b/test/services/vectors_db_test.dart index 066686f6..fc4036eb 100644 --- a/test/services/vectors_db_test.dart +++ b/test/services/vectors_db_test.dart @@ -89,7 +89,10 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await vectorsDB.listTransactions(); + final response = await vectorsDB.listTransactions( + queries: [], + total: false, + ); final Map params = verify( client.call( HttpMethod.get, @@ -99,7 +102,10 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "total": false, + }); expect(response, isA()); }); @@ -123,7 +129,9 @@ void main() { ), ).thenAnswer((_) async => Response(data: data)); - final response = await vectorsDB.createTransaction(); + final response = await vectorsDB.createTransaction( + ttl: 1, + ); final Map params = verify( client.call( HttpMethod.post, @@ -133,7 +141,9 @@ void main() { responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "ttl": 1, + }); expect(response, isA()); }); @@ -163,13 +173,13 @@ void main() { final Map params = verify( client.call( HttpMethod.get, - path: "/vectorsdb/transactions/", + path: "/vectorsdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); expect(response, isA()); }); @@ -195,17 +205,22 @@ void main() { final response = await vectorsDB.updateTransaction( transactionId: "", + commit: false, + rollback: false, ); final Map params = verify( client.call( HttpMethod.patch, - path: "/vectorsdb/transactions/", + path: "/vectorsdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "commit": false, + "rollback": false, + }); expect(response, isA()); }); @@ -228,13 +243,13 @@ void main() { final Map params = verify( client.call( HttpMethod.delete, - path: "/vectorsdb/transactions/", + path: "/vectorsdb/transactions/%3CTRANSACTION_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, isEmpty); }); test('test method createOperations()', () async { @@ -259,17 +274,20 @@ void main() { final response = await vectorsDB.createOperations( transactionId: "", + operations: [], ); final Map params = verify( client.call( HttpMethod.post, - path: "/vectorsdb/transactions//operations", + path: "/vectorsdb/transactions/%3CTRANSACTION_ID%3E/operations", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "operations": isA(), + }); expect(response, isA()); }); @@ -292,17 +310,26 @@ void main() { final response = await vectorsDB.listDocuments( databaseId: "", collectionId: "", + queries: [], + transactionId: "", + total: false, + ttl: 1, ); final Map params = verify( client.call( HttpMethod.get, - path: "/vectorsdb//collections//documents", + path: "/vectorsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -332,17 +359,24 @@ void main() { collectionId: "", documentId: "", data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.post, - path: "/vectorsdb//collections//documents", + path: "/vectorsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, unorderedEquals(["documentId", "data"])); + expect(params, { + "documentId": "", + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -365,17 +399,26 @@ void main() { final response = await vectorsDB.createQuery( databaseId: "", collectionId: "", + queries: [], + transactionId: "", + total: false, + ttl: 1, ); final Map params = verify( client.call( HttpMethod.post, - path: "/vectorsdb//collections//documents/query", + path: "/vectorsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/query", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + "total": false, + "ttl": 1, + }); expect(response, isA()); }); @@ -404,17 +447,22 @@ void main() { databaseId: "", collectionId: "", documentId: "", + queries: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.get, - path: "/vectorsdb//collections//documents/", + path: "/vectorsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "queries": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -443,17 +491,24 @@ void main() { databaseId: "", collectionId: "", documentId: "", + data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.put, - path: "/vectorsdb//collections//documents/", + path: "/vectorsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -482,17 +537,24 @@ void main() { databaseId: "", collectionId: "", documentId: "", + data: {}, + permissions: [], + transactionId: "", ); final Map params = verify( client.call( HttpMethod.patch, - path: "/vectorsdb//collections//documents/", + path: "/vectorsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "data": isA(), + "permissions": isA(), + "transactionId": "", + }); expect(response, isA()); }); @@ -513,17 +575,20 @@ void main() { databaseId: "", collectionId: "", documentId: "", + transactionId: "", ); final Map params = verify( client.call( HttpMethod.delete, - path: "/vectorsdb//collections//documents/", + path: "/vectorsdb/%3CDATABASE_ID%3E/collections/%3CCOLLECTION_ID%3E/documents/%3CDOCUMENT_ID%3E", headers: anyNamed('headers'), params: captureAnyNamed('params'), responseType: anyNamed('responseType'), ), ).captured.single; - expect(params.keys, isEmpty); + expect(params, { + "transactionId": "", + }); }); }); }