diff options
| author | Aotrix <[email protected]> | 2026-07-13 00:23:36 +0200 |
|---|---|---|
| committer | Aotrix <[email protected]> | 2026-07-13 00:23:36 +0200 |
| commit | 552017342ed077ec9a516b02ea4b6855a7c17007 (patch) | |
| tree | aca50984a334049392cd0d3eb8e4c4efe65a2909 /battleNetApi/tests/src | |
| parent | a0632d299b85dc4ef7c0e03898f38e6deca0edc2 (diff) | |
Added test file for Token
Diffstat (limited to 'battleNetApi/tests/src')
| -rw-r--r-- | battleNetApi/tests/src/tests.cpp | 144 | ||||
| -rw-r--r-- | battleNetApi/tests/src/tokenTests.cpp | 20 |
2 files changed, 164 insertions, 0 deletions
diff --git a/battleNetApi/tests/src/tests.cpp b/battleNetApi/tests/src/tests.cpp new file mode 100644 index 0000000..d3c09c7 --- /dev/null +++ b/battleNetApi/tests/src/tests.cpp @@ -0,0 +1,144 @@ +#include "apiUrl.hpp" +#include "hearthstoneApi.hpp" +#include <catch2/benchmark/catch_benchmark.hpp> +#include <catch2/benchmark/catch_chronometer.hpp> +#include <catch2/benchmark/detail/catch_analyse.hpp> +#include <catch2/benchmark/detail/catch_benchmark_function.hpp> +#include <catch2/benchmark/detail/catch_estimate_clock.hpp> +#include <catch2/catch_approx.hpp> +#include <catch2/catch_config.hpp> +#include <catch2/catch_test_macros.hpp> +#include <cstdint> +#include <fstream> +#include <nlohmann/json.hpp> +#include <string> +#include <tokenBuilder.hpp> + +TEST_CASE("Retrieve API Token", "[generateApiToken]") { + const std::string aCredentialsFile{"tests/resources/credentials.json"}; + Token aToken(aCredentialsFile); + const std::string aTokenContent{aToken.text()}; + const std::string::size_type aTokenSize{aTokenContent.size()}; + REQUIRE(aTokenSize >= 30); + REQUIRE(aTokenSize <= 40); +} + +TEST_CASE("Retrieve number of cards", "[countCards]") { + const std::string aCredentialsFile{}; + const std::string aContentType{"cards"}; + const std::string aRegion{"eu"}; + ApiUrl aApiUrl(aContentType, aRegion); + aApiUrl.setLocale("fr_FR"); + aApiUrl.setGameMode("constructed"); + aApiUrl.setPageSize("1"); + TokenPool::feedTokenSource("tests/resources/credentials.json"); + const json aResponse = + HearthstoneApi::makeApiRequest(aApiUrl, TokenPool::build().value().text()); + REQUIRE(aResponse.size() > 0); + REQUIRE(aResponse.contains("pageCount")); + std::uint64_t aNumberOfCards{aResponse["pageCount"]}; + std::uint64_t aExpectedNumberOfCards{6178}; + REQUIRE(aNumberOfCards == aExpectedNumberOfCards); +} + +TEST_CASE("Retrieve page once", "[retrievePageOnce]") { + const std::string aCredentialsFile{"tests/resources/credentials.json"}; + Token aToken(kCredentialsFile); + const std::string aContentType{"cards"}; + const std::string aRegion{"eu"}; + ApiUrl aApiUrl(aContentType, aRegion); + aApiUrl.setLocale("fr_FR"); + aApiUrl.setGameMode("constructed"); + aApiUrl.setPageSize("16"); + TokenPool::feedTokenSource("tests/resources/credentials.json"); + const json aApiResponse = + HearthstoneApi::makeApiRequest(aApiUrl, TokenPool::build().value().text()); + REQUIRE(aApiResponse["cards"].size() == 16); +} + +TEST_CASE("Retrieve pages 10 times without parallelization", "[retrievePagesNoParallel]") { + const std::string aCredentialsFile{"tests/resources/credentials.json"}; + Token aToken(aCredentialsFile); + const std::string aContentType{"cards"}; + const std::string aRegion{"eu"}; + ApiUrl aApiUrl(aContentType, aRegion); + aApiUrl.setLocale("fr_FR"); + aApiUrl.setGameMode("constructed"); + aApiUrl.setPageSize("16"); + aApiUrl.setPage("1"); + TokenPool::feedTokenSource("tests/resources/credentials.json"); + std::string aTokenText{TokenPool::build().value().text()}; + json aApiResponse = HearthstoneApi::makeApiRequest(aApiUrl, aTokenText); + + // Retrieve number of pages + const int aNumberOfRetrievals{10}; + const int aNumberOfPages{aApiResponse["pageCount"]}; + REQUIRE(aNumberOfPages >= aNumberOfRetrievals); + for (int i{1}; i < aNumberOfRetrievals; ++i) { + REQUIRE(aApiResponse["cards"].size() == 16); + aApiUrl.setPage(std::to_string(i + 1)); + aApiResponse = HearthstoneApi::makeApiRequest(aApiUrl, aTokenText); + } + REQUIRE(aApiResponse["cards"].size() >= 1); + REQUIRE(aApiResponse["cards"].size() <= 16); +} + +TEST_CASE("Retrieve pages 10 times with parallelization", "[retrievePagesParallel]") { + const std::string aCredentialsFile{"tests/resources/credentials.json"}; + Token aToken(kCredentialsFile); + const std::string aContentType{"cards"}; + const std::string aRegion{"eu"}; + ApiUrl aApiUrl(aContentType, aRegion); + aApiUrl.setLocale("fr_FR"); + aApiUrl.setGameMode("constructed"); + aApiUrl.setPageSize("16"); + aApiUrl.setPage("1"); + std::vector<std::string> aRequests; + TokenPool::feedTokenSource("tests/resources/credentials.json"); + std::string aTokenText{TokenPool::build().value().text()}; + json aFirstPageJson = HearthstoneApi::makeApiRequest(aApiUrl, aTokenText); + + int kNumberOfPages{aFirstPageJson["pageCount"]}; + const int aNumberOfRetrievals{10}; + REQUIRE(aNumberOfPages >= aNumberOfRetrievals); + for (int i{1}; i < aNumberOfRetrievals; ++i) { + aApiUrl.setPage(std::to_string(i + 1)); + aRequests.push_back(aApiUrl.text()); + } + std::vector<json> aApiResponses = HearthstoneApi::makeApiRequest(aRequests, aTokenText); + aApiResponses.emplace(aApiResponses.begin(), aFirstPageJson); + REQUIRE(aApiResponses.size() == aNumberOfRetrievals); + for (const json &aApiResponse : aApiResponses) { + REQUIRE(aApiResponse["cards"].size() == 16); + } +} + +TEST_CASE("Merge two card lists from two page requests", "[Merge pages]") { + std::ifstream aFirstPageFile{"tests/resources/page_merge_00.json"}; + json aFirstPageJson = json::parse(aFirstPageFile); + std::ifstream aSecondPageFile{"tests/resources/page_merge_01.json"}; + const json aSecondPageJson = json::parse(aSecondPageFile); + + json::reference aMergedCards = aFirstPageJson["cards"]; + for (auto &card : aSecondPageJson["cards"]) { + aMergedCards.push_back(std::move(card)); + } + REQUIRE(aMergedCards.size() == 32); + std::ofstream aOutputJson("build/output_pages_merge.json"); + aOutputJson << aMergedCards.dump(4); +} + +TEST_CASE("Retrieve a single page with HearthstoneApi::downloadCards", + "[retrievePageOnceHearthstoneApi]") { + const std::string aContentType{"cards"}; + const std::string aRegion{"eu"}; + ApiUrl aApiUrl(aContentType, aRegion); + aApiUrl.setPage(3); + TokenPool::feedTokenSource("tests/resources/credentials.json"); + json aApiResponse = HearthstoneApi::makeApiRequest(aApiUrl, TokenPool::build().value().text()); + const json::size_type aExpectedNumberOfCards{aApiResponse["cards"].size()}; + TokenPool::feedTokenSource("tests/resources/credentials.json"); + aApiResponse = HearthstoneApi::downloadCards(aApiUrl, TokenPool::build().value()); + const json::size_type aCurrentNumberOfCards{aApiResponse["cards"].size()}; + REQUIRE(aCurrentNumberOfCards == aExpectedNumberOfCards); +} diff --git a/battleNetApi/tests/src/tokenTests.cpp b/battleNetApi/tests/src/tokenTests.cpp new file mode 100644 index 0000000..89e4039 --- /dev/null +++ b/battleNetApi/tests/src/tokenTests.cpp @@ -0,0 +1,20 @@ +#include <catch2/benchmark/catch_benchmark.hpp> +#include <catch2/benchmark/catch_chronometer.hpp> +#include <catch2/benchmark/detail/catch_analyse.hpp> +#include <catch2/benchmark/detail/catch_benchmark_function.hpp> +#include <catch2/benchmark/detail/catch_estimate_clock.hpp> +#include <catch2/catch_approx.hpp> +#include <catch2/catch_config.hpp> +#include <catch2/catch_test_macros.hpp> +#include <nlohmann/json.hpp> +#include <string> +#include <tokenBuilder.hpp> + +TEST_CASE("Retrieve API Token", "[generateApiToken]") { + const std::string aCredentialsFile{"../tests/resources/credentials.json"}; + Token aToken(aCredentialsFile, std::chrono::seconds(0)); + const std::string aTokenContent{aToken.text()}; + const std::string::size_type aTokenSize{aTokenContent.size()}; + REQUIRE(aTokenSize >= 30); + REQUIRE(aTokenSize <= 40); +} |
