You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
272 lines
12 KiB
272 lines
12 KiB
#include <Catch/catch.hpp> |
|
#include <ConfigContext.hpp> |
|
#include <ServerContext.hpp> |
|
#include <SessionContext.hpp> |
|
#include <torrents.hpp> |
|
|
|
using namespace std; |
|
|
|
const nlohmann::json torrent = { |
|
{"hash", "12a12a12a12a12a12a12"}, |
|
{"paused", false}, |
|
{"seeding", false}, |
|
{"state", 0}, |
|
{"priority", 0}, |
|
{"name", "Arch"}}; |
|
|
|
SCENARIO("We are running a GET /session/torrents resource") { |
|
auto torrent_session = TestSession(); |
|
auto response = std::make_shared<TestResponse>(); |
|
auto request = std::make_shared<TestRequest>(); |
|
GIVEN("the server is not working properly") { |
|
WHEN("we recive a request") { |
|
tr::session::torrents::get(torrent_session, response, request); |
|
THEN("the server should reply with service unavailable") { |
|
CommonResponse::service_unavailable(response); |
|
} |
|
} |
|
} |
|
GIVEN("the server is working properly") { |
|
torrent_session.valid = true; |
|
WHEN("we recive a valid request") { |
|
GIVEN("we have no torrents") { |
|
THEN("the server should reply with an empty array") { |
|
tr::session::torrents::get(torrent_session, response, request); |
|
CommonResponse::ok(response, {{"torrents", nlohmann::json::array()}}); |
|
} |
|
} |
|
GIVEN("we have at least one torrent") { |
|
auto t_torrent = TestTorrent(); |
|
libtorrent::sha1_hash sha; |
|
sha.assign("12a12a12a12a12a12a12"); |
|
t_torrent.hash_ = sha; |
|
torrent_session.get_torrents().emplace_back(t_torrent); |
|
THEN("the server should reply with an array of torrents") { |
|
tr::session::torrents::get(torrent_session, response, request); |
|
CommonResponse::ok(response, {{"torrents", {torrent}}}); |
|
}; |
|
} |
|
} |
|
} |
|
} |
|
|
|
const std::string torrent_id = "c0b0a90089710812fe8c37385a4cc2978eabf3e8"; |
|
const auto magnet_uri = "magnet:?xt=urn:btih:" + torrent_id + "&dn=Taylor Swift&tr=http://tracker.sout.no"; |
|
const auto torrent_url = "http://sout.no/torrent.torrent"; |
|
|
|
SCENARIO("We are running a POST /session/torrents resource") { |
|
auto torrent_session = TestSession(); |
|
auto settings = Config(); |
|
auto response = std::make_shared<TestResponse>(); |
|
auto request = std::make_shared<TestRequest>(); |
|
GIVEN("the server is not working properly") { |
|
AND_WHEN("we recive a request") { |
|
tr::session::torrents::post(settings, torrent_session, response, request); |
|
THEN("the server should reply with service unavailable") { |
|
CommonResponse::service_unavailable(response); |
|
} |
|
} |
|
} |
|
GIVEN("the server is working properly") { |
|
torrent_session.valid = true; |
|
WHEN("we recive a valid request") { |
|
GIVEN("we use the default download directory") { |
|
AND_WHEN("we fill the magnet uri field"){ |
|
THEN("the server should reply with created") { |
|
request->content << nlohmann::json::object({{"magnet_uri", magnet_uri}}); |
|
tr::session::torrents::post(settings, torrent_session, response, request); |
|
CommonResponse::created(response, request, "/session/torrents/" + torrent_id); |
|
REQUIRE(torrent_session.get_torrents().size() == 1); |
|
REQUIRE((torrent_session.get_torrents()[0]).status().save_path == "/toREST"); |
|
} |
|
} |
|
// AND_WHEN("we fill the magnet url field"){ |
|
// THEN("the server should reply with created") { |
|
// request->content << nlohmann::json::object({{"url", torrent_url}}); |
|
// tr::session::torrents::post(settings, torrent_session, response, request); |
|
// CommonResponse::created(response, request, "/session/torrents/" + std::string("0000000000000000000000000000000000000000")); |
|
// REQUIRE(torrent_session.get_torrents().size() == 1); |
|
// REQUIRE((torrent_session.get_torrents()[0]).status().save_path == "/toREST"); |
|
// } |
|
// } |
|
} |
|
GIVEN("we specify a absolute save path") { |
|
request->content << nlohmann::json::object( |
|
{{"magnet_uri", magnet_uri}, |
|
{"save_path", "/music"}}); |
|
tr::session::torrents::post(settings, torrent_session, response, request); |
|
THEN("the server should reply with bad request") { |
|
CommonResponse::bad_request(response); |
|
REQUIRE(torrent_session.get_torrents().size() == 0); |
|
} |
|
} |
|
GIVEN("we specify a relative save path") { |
|
request->content << nlohmann::json::object( |
|
{{"magnet_uri", magnet_uri}, |
|
{"save_path", "music"}}); |
|
THEN("the server should reply created") { |
|
tr::session::torrents::post(settings, torrent_session, response, request); |
|
CommonResponse::created(response, request, "/session/torrents/" + torrent_id); |
|
REQUIRE(torrent_session.get_torrents().size() == 1); |
|
REQUIRE_FALSE(torrent_session.get_torrents()[0].status().paused); |
|
REQUIRE(torrent_session.get_torrents()[0].upload_limit() == -1); |
|
REQUIRE(torrent_session.get_torrents()[0].download_limit() == -1); |
|
REQUIRE((torrent_session.get_torrents()[0]).status().save_path == "/music"); |
|
} |
|
} |
|
GIVEN("we specify the torrent field to be paused") { |
|
request->content << nlohmann::json::object( |
|
{{"magnet_uri", magnet_uri}, |
|
{"save_path", "music"}, |
|
{"paused", "true"}}); |
|
THEN("the server should reply with bad request") { |
|
tr::session::torrents::post(settings, torrent_session, response, request); |
|
CommonResponse::created(response, request, "/session/torrents/" + torrent_id); |
|
REQUIRE(torrent_session.get_torrents().size() == 1); |
|
REQUIRE(torrent_session.get_torrents()[0].status().paused); |
|
REQUIRE(torrent_session.get_torrents()[0].upload_limit() == -1); |
|
REQUIRE(torrent_session.get_torrents()[0].download_limit() == -1); |
|
REQUIRE((torrent_session.get_torrents()[0]).status().save_path == "/music"); |
|
} |
|
} |
|
GIVEN("we specify up an down speed") { |
|
const std::string name = "Dent"; |
|
request->content << nlohmann::json::object( |
|
{{"magnet_uri", magnet_uri}, |
|
{"save_path", "music"}, |
|
{"up_speed", "100"}, |
|
{"down_speed", "100"}, |
|
{"name", name}}); |
|
THEN("the server should reply with bad request") { |
|
tr::session::torrents::post(settings, torrent_session, response, request); |
|
CommonResponse::created(response, request, "/session/torrents/" + torrent_id); |
|
REQUIRE(torrent_session.get_torrents().size() == 1); |
|
REQUIRE_FALSE(torrent_session.get_torrents()[0].status().paused); |
|
REQUIRE(torrent_session.get_torrents()[0].status().name == name); |
|
REQUIRE(torrent_session.get_torrents()[0].upload_limit() == 100); |
|
REQUIRE(torrent_session.get_torrents()[0].download_limit() == 100); |
|
REQUIRE((torrent_session.get_torrents()[0]).status().save_path == "/music"); |
|
} |
|
} |
|
GIVEN("we specify up an down speed") { |
|
const std::string name = "Dent"; |
|
request->content << nlohmann::json::object( |
|
{{"magnet_uri", magnet_uri}, |
|
{"save_path", "music"}, |
|
{"up_speed", 90}, |
|
{"down_speed", "100"}, |
|
{"name", name}}); |
|
THEN("the server should reply with bad request") { |
|
tr::session::torrents::post(settings, torrent_session, response, request); |
|
CommonResponse::created(response, request, "/session/torrents/" + torrent_id); |
|
REQUIRE(torrent_session.get_torrents().size() == 1); |
|
REQUIRE_FALSE(torrent_session.get_torrents()[0].status().paused); |
|
REQUIRE(torrent_session.get_torrents()[0].status().name == name); |
|
REQUIRE(torrent_session.get_torrents()[0].upload_limit() == 90); |
|
REQUIRE(torrent_session.get_torrents()[0].download_limit() == 100); |
|
REQUIRE((torrent_session.get_torrents()[0]).status().save_path == "/music"); |
|
} |
|
} |
|
} |
|
WHEN("we recive an invalid request") { |
|
GIVEN("the request doesn't contain valid json") { |
|
request->content << "Not valid"; |
|
THEN("the server should reply with bad request") { |
|
tr::session::torrents::post(settings, torrent_session, response, request); |
|
CommonResponse::bad_request(response); |
|
} |
|
} |
|
GIVEN("it is valid json but are missing requred field") { |
|
request->content << nlohmann::json({{"up_speed", "100"}}); |
|
THEN("the server should reply with bad request") { |
|
tr::session::torrents::post(settings, torrent_session, response, request); |
|
CommonResponse::bad_request(response); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
void theTorrentExists(TestSession &torrent_session) { |
|
torrent_session.torrents_.emplace_back(); |
|
libtorrent::sha1_hash sha1_hash; |
|
std::stringstream ss; |
|
ss << torrent_id; |
|
ss >> sha1_hash; |
|
torrent_session.torrents_[0].hash_ = sha1_hash; |
|
torrent_session.torrents_[0].valid = true; |
|
REQUIRE(torrent_session.get_torrents().size() == 1); |
|
}; |
|
|
|
SCENARIO("We are running a DELETE /session/torrents resource") { |
|
auto torrent_session = TestSession(); |
|
auto response = std::make_shared<TestResponse>(); |
|
auto request = std::make_shared<TestRequest>(); |
|
GIVEN("the server is not working properly") { |
|
AND_WHEN("we recive a request") { |
|
tr::session::torrents::del(torrent_session, response, request); |
|
THEN("the server should reply with service unavailable") { |
|
CommonResponse::service_unavailable(response); |
|
} |
|
} |
|
} |
|
GIVEN("the server is working properly") { |
|
torrent_session.valid = true; |
|
WHEN("we recive an invalid request") { |
|
GIVEN("the request doesn't contain valid json") { |
|
request->content << "Not valid"; |
|
THEN("the server should reply with bad request") { |
|
tr::session::torrents::del(torrent_session, response, request); |
|
CommonResponse::bad_request(response); |
|
} |
|
} |
|
GIVEN("it is valid json but are missing requred field") { |
|
request->content << nlohmann::json({{"up_speed", "100"}}); |
|
THEN("the server should reply with bad request") { |
|
tr::session::torrents::del(torrent_session, response, request); |
|
CommonResponse::bad_request(response); |
|
} |
|
} |
|
GIVEN("required field is wrong type") { |
|
request->content << nlohmann::json({{"info_hash", 1}}); |
|
THEN("the server should reply with bad request") { |
|
tr::session::torrents::del(torrent_session, response, request); |
|
CommonResponse::bad_request(response); |
|
} |
|
} |
|
GIVEN("fields are correct") { |
|
GIVEN("the torrent exists") { |
|
theTorrentExists(torrent_session); |
|
THEN("the server should reply no content") { |
|
request->content << nlohmann::json({{"info_hash", torrent_id}}); |
|
tr::session::torrents::del(torrent_session, response, request); |
|
CommonResponse::no_content(response); |
|
REQUIRE(torrent_session.get_torrents().size() == 0); |
|
} |
|
GIVEN("we want to remove files") { |
|
THEN("the should reply with no content") { |
|
request->content << nlohmann::json({{"info_hash", torrent_id}, |
|
{"remove_files", true}}); |
|
tr::session::torrents::del(torrent_session, response, request); |
|
CommonResponse::no_content(response); |
|
REQUIRE(torrent_session.get_torrents().size() == 0); |
|
} |
|
THEN("we should reply with no content") { |
|
request->content << nlohmann::json({{"info_hash", torrent_id}, |
|
{"remove_files", "true"}}); |
|
tr::session::torrents::del(torrent_session, response, request); |
|
CommonResponse::no_content(response); |
|
REQUIRE(torrent_session.get_torrents().size() == 0); |
|
} |
|
} |
|
} |
|
GIVEN("the torrent doesn't exist") { |
|
THEN("the server should reply with bad request") { |
|
tr::session::torrents::del(torrent_session, response, request); |
|
CommonResponse::bad_request(response); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
}
|
|
|