From faeee8ce05e546822c3a41c8453143713f28aadb Mon Sep 17 00:00:00 2001
From: Malte E <malte.e@mailbox.org>
Date: Fri, 9 Dec 2022 10:24:00 +0800
Subject: [PATCH] add default parameter for limit, comment about synapse
 returning limit+1

---
 include/mtx/requests.hpp          |  2 +-
 include/mtxclient/http/client.hpp |  4 ++--
 lib/http/client.cpp               | 12 ++++++------
 lib/structs/requests.cpp          |  7 -------
 tests/client_api.cpp              | 28 +++++++++++++++++-----------
 tests/requests.cpp                | 13 -------------
 6 files changed, 26 insertions(+), 40 deletions(-)

diff --git a/include/mtx/requests.hpp b/include/mtx/requests.hpp
index 20ebb7835..b1cefd8a3 100644
--- a/include/mtx/requests.hpp
+++ b/include/mtx/requests.hpp
@@ -443,7 +443,7 @@ struct SetPusher
 struct userDirectorySearch
 {
     //! The maximum number of results to return. Defaults to 10.
-    int limit;
+    std::optional<int> limit;
     //! Required: The term to search for
     std::string search_term;
 
diff --git a/include/mtxclient/http/client.hpp b/include/mtxclient/http/client.hpp
index fed026a70..2ef3dc756 100644
--- a/include/mtxclient/http/client.hpp
+++ b/include/mtxclient/http/client.hpp
@@ -764,8 +764,8 @@ public:
 
     //! Searches the user directory
     void search_user_directory(const std::string &search_term,
-                               int limit,
-                               Callback<mtx::responses::Users> callback);
+                               Callback<mtx::responses::Users> callback,
+                               int limit = -1);
 
 private:
     template<class Request, class Response>
diff --git a/lib/http/client.cpp b/lib/http/client.cpp
index 4fc4b2581..1eff94746 100644
--- a/lib/http/client.cpp
+++ b/lib/http/client.cpp
@@ -1662,13 +1662,13 @@ Client::set_pusher(const mtx::requests::SetPusher &req, Callback<mtx::responses:
 
 void
 Client::search_user_directory(const std::string &search_term,
-                              int limit,
-                              Callback<mtx::responses::Users> callback)
+                              Callback<mtx::responses::Users> callback,
+                              int limit)
 {
-    mtx::requests::userDirectorySearch req;
-    req.search_term = search_term;
-    req.limit       = limit;
-    post<mtx::requests::userDirectorySearch, mtx::responses::Users>(
+    nlohmann::json req = {{"search_term", search_term}};
+    if (limit >= 0)
+        req["limit"] = limit;
+    post<nlohmann::json, mtx::responses::Users>(
       "/client/v3/user_directory/search", req, std::move(callback));
 }
 
diff --git a/lib/structs/requests.cpp b/lib/structs/requests.cpp
index c7133c3c3..badc7709f 100644
--- a/lib/structs/requests.cpp
+++ b/lib/structs/requests.cpp
@@ -287,12 +287,5 @@ to_json(json &obj, const SetPusher &req)
     obj["append"] = req.append;
 }
 
-void
-to_json(json &obj, const userDirectorySearch &request)
-{
-    obj["limit"]       = request.limit;
-    obj["search_term"] = request.search_term;
-}
-
 } // namespace requests
 } // namespace mtx
diff --git a/tests/client_api.cpp b/tests/client_api.cpp
index 6c2a94f7f..ee3cd5d6f 100644
--- a/tests/client_api.cpp
+++ b/tests/client_api.cpp
@@ -1884,25 +1884,31 @@ TEST(ClientAPI, Users)
                         [](const mtx::responses::RoomId &, RequestErr err) { check_error(err); });
     });
 
+    alice->search_user_directory("carl",
+                                 [alice](const mtx::responses::Users &users, RequestErr err) {
+                                     check_error(err);
+                                     EXPECT_EQ(users.results.size(), 1);
+                                     EXPECT_EQ(users.results[0].display_name, "Bobby");
+                                     EXPECT_EQ(users.limited, false);
+                                 });
+    // synapse appears to return limit+1 results, this does not seem to
+    // be spec compliant. To make the tests work, we pass 0 to get 1 result
     alice->search_user_directory(
-      "carl", 10, [alice](const mtx::responses::Users &users, RequestErr err) {
-          check_error(err);
-          EXPECT_EQ(users.results.size(), 1);
-          EXPECT_EQ(users.results[0].display_name, "Bobby");
-          EXPECT_EQ(users.limited, false);
-      });
-    alice->search_user_directory(
-      "Bob", 0, [alice](const mtx::responses::Users &users, RequestErr err) {
+      "Bob",
+      [alice](const mtx::responses::Users &users, RequestErr err) {
           check_error(err);
           EXPECT_EQ(users.results.size(), 1);
           EXPECT_EQ(users.limited, true);
-      });
+      },
+      0);
     alice->search_user_directory(
-      "Bob", 10, [alice](const mtx::responses::Users &users, RequestErr err) {
+      "Bob",
+      [alice](const mtx::responses::Users &users, RequestErr err) {
           check_error(err);
           EXPECT_EQ(users.results.size(), 2);
           EXPECT_EQ(users.limited, false);
-      });
+      },
+      -1);
 
     alice->close();
     bob->close();
diff --git a/tests/requests.cpp b/tests/requests.cpp
index 17a71ea9d..94fecf2bb 100644
--- a/tests/requests.cpp
+++ b/tests/requests.cpp
@@ -354,16 +354,3 @@ TEST(Requests, PublicRooms)
 
     EXPECT_THROW(json req = b3, std::invalid_argument);
 }
-
-TEST(Requests, userDirectorySearch)
-{
-    userDirectorySearch search;
-    search.search_term = "foo";
-    search.limit       = 10;
-
-    json j = search;
-    EXPECT_EQ(j, R"({
-    "limit": 10,
-    "search_term": "foo"
-  })"_json);
-}
-- 
GitLab