#include #include #include #include #include using namespace std; const nlohmann::json torrent = { {"hash", "12a"}, {"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(); auto request = std::make_shared(); GIVEN("the server is not working properly") { AND_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(); 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}}}); }; } } } } SCENARIO("We are running a POST /session/torrents resource") { auto torrent_session = TestSession(); auto settings = Config(); auto response = std::make_shared(); auto request = std::make_shared(); const std::string magnet_hash = "c0b0a90089710812fe8c37385a4cc2978eabf3e8"; const auto magnet_uri = "magnet:?xt=urn:btih:" + magnet_hash + "&dn=Taylor Swift&tr=http://tracker.sout.no"; 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") { request->content << nlohmann::json::object({{"magnet_uri", magnet_uri}}); THEN("the server should reply with created") { tr::session::torrents::post(settings, torrent_session, response, request); CommonResponse::created(response, request, "/session/torrents/" + magnet_hash); 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"}}); tr::session::torrents::post(settings, torrent_session, response, request); THEN("the server should reply created") { CommonResponse::created(response, request, "/session/torrents/" + magnet_hash); REQUIRE(torrent_session.get_torrents().size() == 1); REQUIRE_FALSE(torrent_session.get_torrents()[0].status().paused); 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/" + magnet_hash); REQUIRE(torrent_session.get_torrents().size() == 1); REQUIRE(torrent_session.get_torrents()[0].status().paused); REQUIRE((torrent_session.get_torrents()[0]).status().save_path == "/music"); } } GIVEN("we specify up an ddown speed") { request->content << nlohmann::json::object( {{"magnet_uri", magnet_uri}, {"save_path", "music"}, {"up_speed", "100"}, {"down_speed", "100"}}); THEN("the server should reply with bad request") { tr::session::torrents::post(settings, torrent_session, response, request); CommonResponse::created(response, request, "/session/torrents/" + magnet_hash); REQUIRE(torrent_session.get_torrents().size() == 1); REQUIRE_FALSE(torrent_session.get_torrents()[0].status().paused); 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"); } } } 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); } } } } }