From 8837de4783b25255b6a1799be210c9e580dd2d4f Mon Sep 17 00:00:00 2001 From: Aotrix <9aotrix@protonmail.com> Date: Sat, 18 Apr 2026 22:20:26 +0200 Subject: Replace operator() with text method --- battleNetApi/include/apiUrl.hpp | 2 +- battleNetApi/include/hearthstoneApi.hpp | 3 ++- battleNetApi/src/apiUrl.cpp | 2 +- battleNetApi/src/hearthstoneApi.cpp | 14 ++++++++++---- battleNetApi/tests/tests.cpp | 28 +++++++++++++++------------- 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/battleNetApi/include/apiUrl.hpp b/battleNetApi/include/apiUrl.hpp index 9c051f1..881e593 100644 --- a/battleNetApi/include/apiUrl.hpp +++ b/battleNetApi/include/apiUrl.hpp @@ -12,7 +12,7 @@ class ApiUrl { void setPage(const std::string &iPage); void setPageSize(const std::string &iPageSize); void setValue(const std::string &iKey, const std::string &iValue); - std::string operator()() const; + std::string text() const; private: std::string mContentType; diff --git a/battleNetApi/include/hearthstoneApi.hpp b/battleNetApi/include/hearthstoneApi.hpp index ecf785a..f2bdf04 100644 --- a/battleNetApi/include/hearthstoneApi.hpp +++ b/battleNetApi/include/hearthstoneApi.hpp @@ -8,7 +8,8 @@ using json = nlohmann::json; class HearthstoneApi { public: - static json makeApiRequest(const std::string &iUrl, const std::string &iTokenText); + static json makeApiRequest(const ApiUrl &iApiUrl, const std::string &iTokenText); + static std::vector makeApiRequest(const std::vector &iApiUrls, const std::string &iTokenText); static std::vector makeApiRequest(const std::vector &iUrls, const std::string &iTokenText); static json downloadCards(ApiUrl &iApiUrl, Token &iToken); diff --git a/battleNetApi/src/apiUrl.cpp b/battleNetApi/src/apiUrl.cpp index 5435fd9..ac8171b 100644 --- a/battleNetApi/src/apiUrl.cpp +++ b/battleNetApi/src/apiUrl.cpp @@ -41,7 +41,7 @@ void ApiUrl::setPageSize(const std::string &iPageSize) { void ApiUrl::setValue(const std::string &iKey, const std::string &iValue) { aParameters[iKey] = iValue; } -std::string ApiUrl::operator()() const { +std::string ApiUrl::text() const { std::string aFormattedParameters; for (const auto &[key, value] : aParameters) { aFormattedParameters += std::format("&{}={}", key, value); diff --git a/battleNetApi/src/hearthstoneApi.cpp b/battleNetApi/src/hearthstoneApi.cpp index 32c3164..d6becc1 100644 --- a/battleNetApi/src/hearthstoneApi.cpp +++ b/battleNetApi/src/hearthstoneApi.cpp @@ -21,11 +21,11 @@ size_t HearthstoneApi::curlCallbackStringOutput(void *iContent, size_t iSize, si return kNewLength; } -json HearthstoneApi::makeApiRequest(const std::string &iUrl, const std::string &iTokenText) { +json HearthstoneApi::makeApiRequest(const ApiUrl &iApiUrl, const std::string &iTokenText) { CURL *curl = curl_easy_init(); std::string aRequestOutput; if (curl) { - curl_easy_setopt(curl, CURLOPT_URL, iUrl.c_str()); + curl_easy_setopt(curl, CURLOPT_URL, iApiUrl.text().c_str()); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlCallbackStringOutput); @@ -40,6 +40,12 @@ json HearthstoneApi::makeApiRequest(const std::string &iUrl, const std::string & return aOutputJson; } +std::vector HearthstoneApi::makeApiRequest(const std::vector &iApiUrls, const std::string &iTokenText) { + std::vector aApiUrls(iApiUrls.size()); + std::ranges::transform(iApiUrls, aApiUrls.begin(), [](const ApiUrl &iApiUrl) { return iApiUrl.text(); }); + return makeApiRequest(aApiUrls, iTokenText); +} + std::vector HearthstoneApi::makeApiRequest(const std::vector &iUrls, const std::string &iTokenText) { std::vector aResponses(iUrls.size()); CURLM *curlm = curl_multi_init(); @@ -101,12 +107,12 @@ std::vector HearthstoneApi::makeApiRequest(const std::vector json HearthstoneApi::downloadCards(ApiUrl &iApiUrl, Token &iToken) { iApiUrl.setPage("1"); std::vector aRequests; - json aFirstPageJson = makeApiRequest(iApiUrl(), iToken.text()); + json aFirstPageJson = makeApiRequest(iApiUrl, iToken.text()); int kNumberOfPages{aFirstPageJson["pageCount"]}; for (int i{1}; i < kNumberOfPages; ++i) { iApiUrl.setPage(std::to_string(i + 1)); - aRequests.push_back(iApiUrl()); + aRequests.push_back(iApiUrl.text()); } json::reference &aOutputJson = aFirstPageJson["cards"]; std::vector kApiResponses = makeApiRequest(aRequests, iToken.text()); diff --git a/battleNetApi/tests/tests.cpp b/battleNetApi/tests/tests.cpp index cfb22e4..e669506 100644 --- a/battleNetApi/tests/tests.cpp +++ b/battleNetApi/tests/tests.cpp @@ -12,6 +12,7 @@ #include #include #include +#include TEST_CASE("Retrieve API Token", "[generateApiToken]") { const std::string kCredentialsFile{"tests/resources/credentials.json"}; @@ -23,16 +24,15 @@ TEST_CASE("Retrieve API Token", "[generateApiToken]") { } TEST_CASE("Retrieve number of cards", "[countCards]") { - const std::string kCredentialsFile{"tests/resources/credentials.json"}; - Token aToken(kCredentialsFile); - HearthstoneApi aHearthstoneApi(aToken); + const std::string kCredentialsFile{}; const std::string kContentType{"cards"}; const std::string kRegion{"eu"}; ApiUrl aApiUrl(kContentType, kRegion); aApiUrl.setLocale("fr_FR"); aApiUrl.setGameMode("constructed"); aApiUrl.setPageSize("1"); - const json kResponse = aHearthstoneApi.makeApiRequest(aApiUrl()); + TokenPool::fillTokenSource("tests/resources/credentials.json"); + const json kResponse = HearthstoneApi::makeApiRequest(aApiUrl, TokenPool::unusedToken().value()); REQUIRE(kResponse.size() > 0); REQUIRE(kResponse.contains("pageCount")); std::uint64_t kNumberOfCards{kResponse["pageCount"]}; @@ -42,21 +42,20 @@ TEST_CASE("Retrieve number of cards", "[countCards]") { TEST_CASE("Retrieve page once", "[retrievePageOnce]") { const std::string kCredentialsFile{"tests/resources/credentials.json"}; Token aToken(kCredentialsFile); - HearthstoneApi aHearthstoneApi(aToken); const std::string kContentType{"cards"}; const std::string kRegion{"eu"}; ApiUrl aApiUrl(kContentType, kRegion); aApiUrl.setLocale("fr_FR"); aApiUrl.setGameMode("constructed"); aApiUrl.setPageSize("16"); - const json kApiResponse = aHearthstoneApi.makeApiRequest(aApiUrl()); + TokenPool::fillTokenSource("tests/resources/credentials.json"); + const json kApiResponse = HearthstoneApi::makeApiRequest(aApiUrl, TokenPool::unusedToken().value()); REQUIRE(kApiResponse["cards"].size() == 16); } TEST_CASE("Retrieve pages 10 times without parallelization", "[retrievePagesNoParallel]") { const std::string kCredentialsFile{"tests/resources/credentials.json"}; Token aToken(kCredentialsFile); - HearthstoneApi aHearthstoneApi(aToken); const std::string kContentType{"cards"}; const std::string kRegion{"eu"}; ApiUrl aApiUrl(kContentType, kRegion); @@ -64,7 +63,9 @@ TEST_CASE("Retrieve pages 10 times without parallelization", "[retrievePagesNoPa aApiUrl.setGameMode("constructed"); aApiUrl.setPageSize("16"); aApiUrl.setPage("1"); - json kApiResponse = aHearthstoneApi.makeApiRequest(aApiUrl()); + TokenPool::fillTokenSource("tests/resources/credentials.json"); + std::string kTokenText{TokenPool::unusedToken().value()}; + json kApiResponse = HearthstoneApi::makeApiRequest(aApiUrl, kTokenText); // Retrieve number of pages const int kNumberOfRetrievals{10}; @@ -73,7 +74,7 @@ TEST_CASE("Retrieve pages 10 times without parallelization", "[retrievePagesNoPa for (int i{1}; i < kNumberOfRetrievals; ++i) { REQUIRE(kApiResponse["cards"].size() == 16); aApiUrl.setPage(std::to_string(i + 1)); - kApiResponse = aHearthstoneApi.makeApiRequest(aApiUrl()); + kApiResponse = HearthstoneApi::makeApiRequest(aApiUrl, kTokenText); } REQUIRE(kApiResponse["cards"].size() >= 1); REQUIRE(kApiResponse["cards"].size() <= 16); @@ -82,7 +83,6 @@ TEST_CASE("Retrieve pages 10 times without parallelization", "[retrievePagesNoPa TEST_CASE("Retrieve pages 10 times with parallelization", "[retrievePagesParallel]") { const std::string kCredentialsFile{"tests/resources/credentials.json"}; Token aToken(kCredentialsFile); - HearthstoneApi aHearthstoneApi(aToken); const std::string kContentType{"cards"}; const std::string kRegion{"eu"}; ApiUrl aApiUrl(kContentType, kRegion); @@ -91,16 +91,18 @@ TEST_CASE("Retrieve pages 10 times with parallelization", "[retrievePagesParalle aApiUrl.setPageSize("16"); aApiUrl.setPage("1"); std::vector aRequests; - json kFirstPageJson = aHearthstoneApi.makeApiRequest(aApiUrl()); + TokenPool::fillTokenSource("tests/resources/credentials.json"); + std::string kTokenText{TokenPool::unusedToken().value()}; + json kFirstPageJson = HearthstoneApi::makeApiRequest(aApiUrl, kTokenText); int kNumberOfPages{kFirstPageJson["pageCount"]}; const int kNumberOfRetrievals{10}; REQUIRE(kNumberOfPages >= kNumberOfRetrievals); for (int i{1}; i < kNumberOfRetrievals; ++i) { aApiUrl.setPage(std::to_string(i + 1)); - aRequests.push_back(aApiUrl()); + aRequests.push_back(aApiUrl.text()); } - std::vector kApiResponses = aHearthstoneApi.makeApiRequest(aRequests); + std::vector kApiResponses = HearthstoneApi::makeApiRequest(aRequests, kTokenText); kApiResponses.emplace(kApiResponses.begin(), kFirstPageJson); REQUIRE(kApiResponses.size() == kNumberOfRetrievals); for (const json &kApiResponse : kApiResponses) { -- cgit v1.2.3