summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--battleNetApi/include/apiUrl.hpp2
-rw-r--r--battleNetApi/include/hearthstoneApi.hpp3
-rw-r--r--battleNetApi/src/apiUrl.cpp2
-rw-r--r--battleNetApi/src/hearthstoneApi.cpp14
-rw-r--r--battleNetApi/tests/tests.cpp28
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<json> makeApiRequest(const std::vector<ApiUrl> &iApiUrls, const std::string &iTokenText);
static std::vector<json> makeApiRequest(const std::vector<std::string> &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<json> HearthstoneApi::makeApiRequest(const std::vector<ApiUrl> &iApiUrls, const std::string &iTokenText) {
+ std::vector<std::string> aApiUrls(iApiUrls.size());
+ std::ranges::transform(iApiUrls, aApiUrls.begin(), [](const ApiUrl &iApiUrl) { return iApiUrl.text(); });
+ return makeApiRequest(aApiUrls, iTokenText);
+}
+
std::vector<json> HearthstoneApi::makeApiRequest(const std::vector<std::string> &iUrls, const std::string &iTokenText) {
std::vector<std::string> aResponses(iUrls.size());
CURLM *curlm = curl_multi_init();
@@ -101,12 +107,12 @@ std::vector<json> HearthstoneApi::makeApiRequest(const std::vector<std::string>
json HearthstoneApi::downloadCards(ApiUrl &iApiUrl, Token &iToken) {
iApiUrl.setPage("1");
std::vector<std::string> 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<json> 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 <fstream>
#include <nlohmann/json.hpp>
#include <string>
+#include <tokenPool.hpp>
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<std::string> 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<json> kApiResponses = aHearthstoneApi.makeApiRequest(aRequests);
+ std::vector<json> kApiResponses = HearthstoneApi::makeApiRequest(aRequests, kTokenText);
kApiResponses.emplace(kApiResponses.begin(), kFirstPageJson);
REQUIRE(kApiResponses.size() == kNumberOfRetrievals);
for (const json &kApiResponse : kApiResponses) {