Commit cd2d06af authored by Pavel Vainerman's avatar Pavel Vainerman

(REST API): добавил тест /get?..

parent 28e56b2f
......@@ -85,5 +85,99 @@ TEST_CASE("[REST API: /]", "[restapi][info]")
REQUIRE( jret->get("lostMessages").convert<long>() == 0 );
}
// -----------------------------------------------------------------------------
static void check_get( const std::string& query )
{
// QUERY: /get?xxx
// REPLY:
// {"object":
// {"id":5003,"isActive":true,"lostMessages":0,"maxSizeOfMessageQueue":1000,"msgCount":0,"name":"SharedMemory","objectType":"IONotifyController"},
// "sensors":[
// {"name":"Input2_S","id":"2","calibration":{"cmax":0,"cmin":0,"precision":0,"rmax":0,"rmin":0},"dbignore":false,"default_val":0,"nchanges":0,"real_value":0,"tv_nsec":369597308,"tv_sec":1483733666,"type":"DI","value":0}
// ]}
std::string s = shm->apiRequest(query);
Poco::JSON::Parser parser;
auto result = parser.parse(s);
Poco::JSON::Object::Ptr json = result.extract<Poco::JSON::Object::Ptr>();
REQUIRE(json);
auto jarr = json->get("sensors").extract<Poco::JSON::Array::Ptr>();
REQUIRE(jarr);
Poco::JSON::Object::Ptr jret = jarr->getObject(0);
REQUIRE(jret);
REQUIRE( jret->get("id").convert<ObjectId>() == 122 );
REQUIRE( jret->get("name").convert<std::string>() == "API_Sensor_AS" );
REQUIRE( jret->get("type").convert<std::string>() == "AI" );
REQUIRE( jret->get("value").convert<long>() == 10 );
REQUIRE( jret->get("real_value").convert<long>() == 10 );
REQUIRE( jret->get("default_val").convert<long>() == 10 );
auto jcal = jret->get("calibration").extract<Poco::JSON::Object::Ptr>();
REQUIRE( jcal->get("cmin").convert<long>() == 10 );
REQUIRE( jcal->get("cmax").convert<long>() == 20 );
REQUIRE( jcal->get("rmin").convert<long>() == 100 );
REQUIRE( jcal->get("rmax").convert<long>() == 200 );
REQUIRE( jcal->get("precision").convert<long>() == 1 );
}
// -----------------------------------------------------------------------------
TEST_CASE("[REST API: /get]", "[restapi][get]")
{
init_test();
SECTION("getByName")
{
check_get("/get?API_Sensor_AS");
}
SECTION("getByID")
{
check_get("/get?122");
}
SECTION("BadFormat")
{
// Запрос без ответа
// QUERY: /get
// Ожидаемый формат ответа:
// {"ecode":500,"error":"SharedMemory(request): 'get'. Unknown ID or Name. Use parameters: get?ID1,name2,ID3,..."}
std::string s = shm->apiRequest("/get");
Poco::JSON::Parser parser;
auto result = parser.parse(s);
Poco::JSON::Object::Ptr json = result.extract<Poco::JSON::Object::Ptr>();
REQUIRE(json);
REQUIRE( json->get("ecode").convert<int>() == 500 );
}
SECTION("NotFound")
{
// QUERY: /get?dummy
// Ожидаемый формат ответа:
// {"object":{"id":5003,"isActive":true,"lostMessages":0,"maxSizeOfMessageQueue":1000,"msgCount":0,"name":"SharedMemory","objectType":"IONotifyController"},
// "sensors":[{"error":"Sensor not found","name":"dummy"}]}
std::string s = shm->apiRequest("/get?dummy");
Poco::JSON::Parser parser;
auto result = parser.parse(s);
Poco::JSON::Object::Ptr json = result.extract<Poco::JSON::Object::Ptr>();
REQUIRE(json);
auto jarr = json->get("sensors").extract<Poco::JSON::Array::Ptr>();
REQUIRE(jarr);
Poco::JSON::Object::Ptr jret = jarr->getObject(0);
REQUIRE(jret);
// просто проверем что 'error' не пустой..
REQUIRE( jret->get("error").convert<std::string>().empty() == false );
}
}
// -----------------------------------------------------------------------------
//if( req == "sensors"
//if( req == "consumers" )
//if( req == "lost"
// -----------------------------------------------------------------------------
#endif // ifndef DISABLE_REST_API
// -----------------------------------------------------------------------------
......@@ -272,6 +272,8 @@
<item id="120" iotype="AI" name="FasAO_S" textname="FasAO" precsision="1"/>
<item id="121" iotype="DI" name="FasDI_S" textname="FasDI"/>
<!-- REST API test -->
<item id="122" iotype="AI" name="API_Sensor_AS" textname="SensorAI" precision="1" default="10" cmin="10" cmax="20" rmin="100" rmax="200"/>
</sensors>
<thresholds name="thresholds">
......
......@@ -394,15 +394,7 @@ namespace uniset
Poco::JSON::Object::Ptr UniSetObject::httpGet( const Poco::URI::QueryParameters& p )
{
Poco::JSON::Object::Ptr jret = new Poco::JSON::Object();
Poco::JSON::Object::Ptr jdata = uniset::json::make_child(jret, "object");
jdata->set("name", myname);
jdata->set("id", getId());
jdata->set("msgCount", countMessages());
jdata->set("lostMessages", getCountOfLostMessages());
jdata->set("maxSizeOfMessageQueue", getMaxSizeOfMessageQueue());
jdata->set("isActive", isActive());
jdata->set("objectType", getStrType());
httpGetMyInfo(jret);
return jret;
}
// ------------------------------------------------------------------------------------------
......
......@@ -903,21 +903,19 @@ Poco::JSON::Object::Ptr IOController::request_get( const string& req, const Poco
if( p.size() > 1 && p[1].first == "shortInfo" )
shortInfo = true;
// ulog1 << myname << "(GET): " << p[0].first << " size=" << slist.size() << endl;
// myname {
// sensors: [
// sid:
// value: long
// error: string
// ]
// {
// "sensors" [
// { name: string, value: long, error: string, ...},
// { name: string, value: long, error: string, ...},
// ...
// ],
//
// "object" { mydata... }
// }
Poco::JSON::Object::Ptr jdata = new Poco::JSON::Object();
Poco::JSON::Array::Ptr jsens = new Poco::JSON::Array();
jdata->set("sensors", jsens);
auto my = httpGetMyInfo(jdata);
Poco::JSON::Object::Ptr nullObject = new Poco::JSON::Object();
auto jsens = uniset::json::make_child_array(jdata, "sensors");
for( const auto& s : slist )
{
......@@ -927,9 +925,10 @@ Poco::JSON::Object::Ptr IOController::request_get( const string& req, const Poco
if( sinf == ioList.end() )
{
string sid( std::to_string(s.si.id) );
jsens->add(json::make_object(sid, json::make_object("value", nullObject)));
jsens->add(json::make_object(sid, json::make_object("error", "Sensor not found")));
Poco::JSON::Object::Ptr jr = new Poco::JSON::Object();
jr->set("name", s.fname);
jr->set("error", "Sensor not found");
jsens->add(jr);
continue;
}
......@@ -937,15 +936,17 @@ Poco::JSON::Object::Ptr IOController::request_get( const string& req, const Poco
}
catch( IOController_i::NameNotFound& ex )
{
string sid( std::to_string(s.si.id) );
jsens->add(json::make_object(sid, uniset::json::make_object("value", nullObject)));
jsens->add(json::make_object(sid, uniset::json::make_object("error", string(ex.err))));
Poco::JSON::Object::Ptr jr = new Poco::JSON::Object();
jr->set("name", s.fname);
jr->set("error", string(ex.err));
jsens->add(jr);
}
catch( std::exception& ex )
{
string sid( std::to_string(s.si.id) );
jsens->add(json::make_object(sid, uniset::json::make_object("value", nullObject)));
jsens->add(json::make_object(sid, uniset::json::make_object("error", ex.what())));
Poco::JSON::Object::Ptr jr = new Poco::JSON::Object();
jr->set("name", s.fname);
jr->set("error", string(ex.what()));
jsens->add(jr);
}
}
......@@ -954,13 +955,8 @@ Poco::JSON::Object::Ptr IOController::request_get( const string& req, const Poco
// -----------------------------------------------------------------------------
void IOController::getSensorInfo( Poco::JSON::Array::Ptr& jdata, std::shared_ptr<USensorInfo>& s, bool shortInfo )
{
Poco::JSON::Object::Ptr mydata = new Poco::JSON::Object();
Poco::JSON::Object::Ptr jsens = new Poco::JSON::Object();
jdata->add(mydata);
std::string sid(to_string(s->si.id));
mydata->set(sid, jsens);
jdata->add(jsens);
{
uniset_rwmutex_rlock lock(s->val_lock);
......@@ -968,7 +964,7 @@ void IOController::getSensorInfo( Poco::JSON::Array::Ptr& jdata, std::shared_ptr
jsens->set("real_value", s->real_value);
}
jsens->set("id", sid);
jsens->set("id", s->si.id);
jsens->set("name", ORepHelpers::getShortName(uniset_conf()->oind->getMapName(s->si.id)));
jsens->set("tv_sec", s->tv_sec);
jsens->set("tv_nsec", s->tv_nsec);
......
......@@ -1193,7 +1193,7 @@ Poco::JSON::Object::Ptr IONotifyController::httpHelp(const Poco::URI::QueryParam
{
// 'lost'
uniset::json::help::item cmd("et lost consumers list");
uniset::json::help::item cmd("get lost consumers list");
myhelp.add(cmd);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment