Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add methods for first and last block #183

Merged
merged 4 commits into from
Feb 25, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/api/blocks/blocks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,18 @@ std::string Blocks::get(const char* blockId) {

/**/

std::string Blocks::first() {
return http_->get(paths::Blocks::first(this->host_).c_str());
}

/**/

std::string Blocks::last() {
return http_->get(paths::Blocks::last(this->host_).c_str());
}

/**/

std::string Blocks::all(const char* const query) {
return http_->get(paths::Blocks::all(this->host_, query).c_str());
}
Expand Down
22 changes: 22 additions & 0 deletions src/api/paths.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,28 @@ std::string Blocks::get(Host& newHost, const char* blockId) {

////////////////////////////////////////////////////////////////////////////////

std::string Blocks::first(Host& newHost) {
std::string url;
url.reserve(URL_MAX_LEN);
url += newHost.toString().c_str();
url += Blocks::base();
url += "/first";
return url;
}

////////////////////////////////////////////////////////////////////////////////

std::string Blocks::last(Host& newHost) {
std::string url;
url.reserve(URL_MAX_LEN);
url += newHost.toString().c_str();
url += Blocks::base();
url += "/last";
return url;
}

////////////////////////////////////////////////////////////////////////////////

std::string Blocks::all(Host& newHost, const char* const query) {
std::string url;
url.reserve(URL_MAX_LEN);
Expand Down
4 changes: 4 additions & 0 deletions src/include/cpp-client/api/blocks/blocks.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ class IBlocks : public Base {
public:
virtual ~IBlocks() {}
virtual std::string get(const char* const blockId) = 0;
virtual std::string first() = 0;
virtual std::string last() = 0;
virtual std::string all(const char* const query) = 0;
virtual std::string transactions(const char* const blockId) = 0;
virtual std::string search(const std::map<std::string, std::string>& bodyParameters, const char* const query) = 0;
Expand All @@ -39,6 +41,8 @@ class Blocks : public IBlocks {
Blocks(Host& host, IHTTP& http) : IBlocks(host, http) {}

std::string get(const char* const blockId) override;
std::string first() override;
std::string last() override;
std::string all(const char* const query) override;
std::string transactions(const char* const blockId) override;
std::string search(const std::map<std::string, std::string>& bodyParameters, const char* const query) override;
Expand Down
2 changes: 2 additions & 0 deletions src/include/cpp-client/api/paths.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ struct Blockchain {
struct Blocks { // NOLINT
static std::string base();
static std::string get(Host& newHost, const char* const blockId);
static std::string first(Host& newHost);
static std::string last(Host& newHost);
static std::string all(Host& newHost, const char* const query = DEFAULT_QUERY);
static std::string transactions(Host& newHost, const char* const blockId);
static std::pair<std::string, std::string> search(Host& newHost,
Expand Down
95 changes: 95 additions & 0 deletions test/api/blocks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,101 @@ TEST(api, test_block) { // NOLINT

/**/

TEST(api, test_block_first) { // NOLINT
Ark::Client::Connection<MockApi> connection(tIp, tPort);

const std::string expected_response = R"({
"data": {
"id": "13114381566690093367",
"version": 0,
"height": 1,
"previous": "0",
"forged": {
"reward": "0",
"fee": "0",
"total": "0",
"amount": "12500000000000000"
},
"payload": {
"hash": "2a44f340d76ffc3df204c5f38cd355b7496c9065a1ade2ef92071436bd72e867",
"length": 11395
},
"generator": {
"address": "D6Z26L69gdk9qYmTv5uzk3uGepigtHY4ax",
"publicKey": "03d3fdad9c5b25bf8880e6b519eb3611a5c0b31adebc8455f0e096175b28321aff"
},
"signature": "3044022035694a9b99a9236655c658eb07fc3b02ce5edcc24b76424a7287c54ed3822b0602203621e92defb360490610f763d85e94c2db2807a4bd7756cc8a6a585463ef7bae",
"confirmations": 4346566,
"transactions": 52,
"timestamp": {
"epoch": 0,
"unix": 1490101200,
"human": "2017-03-21T13:00:00.000Z"
}
}
})";

EXPECT_CALL(connection.api.blocks, first())
.Times(1)
.WillOnce(Return(expected_response));

const auto block = connection.api.blocks.first();

auto responseMatches = strcmp(expected_response.c_str(),
block.c_str()) == 0;
ASSERT_TRUE(responseMatches);
}

/**/

TEST(api, test_block_last) { // NOLINT
Ark::Client::Connection<MockApi> connection(tIp, tPort);

const std::string expected_response = R"({
"data": {
"id": "5768900e27621b95dc201fc4e6ce16e72a39e0c625a1c659a23e83eac69605e0",
"version": 0,
"height": 4346647,
"previous": "4deae70324c919d3a79f0f065cfa085a475a7245bcd04d4e558d3205658fc706",
"forged": {
"reward": "200000000",
"fee": "10000000",
"total": "210000000",
"amount": "900000000"
},
"payload": {
"hash": "b48f23356cc70d13b0a0c0ba6811be0144a9fc673cc9f723f036187c3bb67f2d",
"length": 32
},
"generator": {
"username": "genesis_40",
"address": "D8xN3Nsa3KfC3H68Ek9xnkfdSwzv8Kkh3q",
"publicKey": "026a423b3323de175dd82788c7eab57850c6a37ea6a470308ebadd7007baf8ceb3"
},
"signature": "304402203b6251780c8baead56882aa5aee188f85f8941a1bca272ef6ff3bf9d26cfeed602207634d5268a130937603b774a7282e44065370785dc4b809cf0e98f0e56252bcc",
"confirmations": 0,
"transactions": 1,
"timestamp": {
"epoch": 92536208,
"unix": 1582637408,
"human": "2020-02-25T13:30:08.000Z"
}
}
})";

EXPECT_CALL(connection.api.blocks, last())
.Times(1)
.WillOnce(Return(expected_response));

const auto block = connection.api.blocks.last();

auto responseMatches = strcmp(expected_response.c_str(),
block.c_str()) == 0;
ASSERT_TRUE(responseMatches);
}

/**/

TEST(api, test_block_transactions) { // NOLINT
Ark::Client::Connection<MockApi> connection(tIp, tPort);

Expand Down
6 changes: 6 additions & 0 deletions test/api/paths.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@ TEST(paths, test_blocks) {
const auto get = paths::Blocks::get(testHost, "58328125061111756");
ASSERT_STREQ("0.0.0.0:4003/api/blocks/58328125061111756", get.c_str());

const auto first = paths::Blocks::first(testHost);
ASSERT_STREQ("0.0.0.0:4003/api/blocks/first", first.c_str());

const auto last = paths::Blocks::last(testHost);
ASSERT_STREQ("0.0.0.0:4003/api/blocks/last", last.c_str());

const auto all = paths::Blocks::all(testHost, "?limit=1&page=5");
ASSERT_STREQ("0.0.0.0:4003/api/blocks?limit=1&page=5", all.c_str());

Expand Down
2 changes: 2 additions & 0 deletions test/mocks/mock_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ class MockBlocks : public Ark::Client::api::IBlocks { // NOLINT
MockBlocks(Ark::Client::Host& host, Ark::Client::IHTTP& http) : IBlocks(host, http) {}

MOCK_METHOD1(get, std::string(const char* const));
MOCK_METHOD0(first, std::string());
MOCK_METHOD0(last, std::string());
MOCK_METHOD1(all, std::string(const char* const));
MOCK_METHOD1(transactions, std::string(const char* const));
MOCK_METHOD2(search, std::string(const std::map<std::string, std::string>&, const char* const));
Expand Down