diff --git a/server/rest/devicesresource.cpp b/server/rest/devicesresource.cpp index 2dde5a0d..69249b1d 100644 --- a/server/rest/devicesresource.cpp +++ b/server/rest/devicesresource.cpp @@ -202,7 +202,7 @@ HttpReply *DevicesResource::proccessPostRequest(const HttpRequest &request, cons // POST /api/v1/devices/{deviceId} if (urlTokens.count() == 4) - return createErrorReply(HttpReply::BadRequest); + return editDevice(request.payload()); // POST /api/v1/devices/{deviceId}/execute/{actionTypeId} if (urlTokens.count() >= 6 && urlTokens.at(4) == "execute") { @@ -393,6 +393,22 @@ HttpReply *DevicesResource::addConfiguredDevice(const QByteArray &payload) const return reply; } +HttpReply *DevicesResource::editDevice(const QByteArray &payload) const +{ + QPair verification = RestResource::verifyPayload(payload); + if (!verification.first) + return createErrorReply(HttpReply::BadRequest); + + QVariantMap params = verification.second.toMap(); + QString name = params.value("name").toString(); + DeviceManager::DeviceError status = GuhCore::instance()->deviceManager()->editDevice(m_device->id(), name); + + if (status != DeviceManager::DeviceErrorNoError) + return createDeviceErrorReply(HttpReply::BadRequest, status); + + return createDeviceErrorReply(HttpReply::Ok, status); +} + HttpReply *DevicesResource::pairDevice(const QByteArray &payload) const { QPair verification = RestResource::verifyPayload(payload); diff --git a/server/rest/devicesresource.h b/server/rest/devicesresource.h index 4d9fa4db..f6e9418d 100644 --- a/server/rest/devicesresource.h +++ b/server/rest/devicesresource.h @@ -69,6 +69,7 @@ private: // Post methods HttpReply *executeAction(Device *device, const ActionTypeId &actionTypeId, const QByteArray &payload) const; HttpReply *addConfiguredDevice(const QByteArray &payload) const; + HttpReply *editDevice(const QByteArray &payload) const; HttpReply *pairDevice(const QByteArray &payload) const; HttpReply *confirmPairDevice(const QByteArray &payload) const; diff --git a/tests/auto/devices/testdevices.cpp b/tests/auto/devices/testdevices.cpp index 0c49afed..33c270c1 100644 --- a/tests/auto/devices/testdevices.cpp +++ b/tests/auto/devices/testdevices.cpp @@ -87,7 +87,6 @@ private slots: void editDevices_data(); void editDevices(); - void reconfigureDevices_data(); void reconfigureDevices(); @@ -757,9 +756,16 @@ void TestDevices::editDevices() QString originalName = "Test device"; // add device + QVariantList deviceParams; + QVariantMap httpportParam; + httpportParam.insert("name", "httpport"); + httpportParam.insert("value", 8888); + deviceParams.append(httpportParam); + QVariantMap params; - params.insert("deviceClassId", mockParentDeviceClassId); + params.insert("deviceClassId", mockDeviceClassId); params.insert("name", originalName); + params.insert("deviceParams", deviceParams); QVariant response = injectAndWait("Devices.AddConfiguredDevice", params); verifyDeviceError(response); DeviceId deviceId = DeviceId(response.toMap().value("params").toMap().value("deviceId").toString()); diff --git a/tests/auto/restdevices/testrestdevices.cpp b/tests/auto/restdevices/testrestdevices.cpp index 69843817..d55d8c33 100644 --- a/tests/auto/restdevices/testrestdevices.cpp +++ b/tests/auto/restdevices/testrestdevices.cpp @@ -61,11 +61,14 @@ private slots: void getStateValue_data(); void getStateValue(); + void editDevices_data(); + void editDevices(); + void reconfigureDevices_data(); void reconfigureDevices(); - void editByDiscovery_data(); - void editByDiscovery(); + void reconfigureByDiscovery_data(); + void reconfigureByDiscovery(); }; @@ -519,6 +522,57 @@ void TestRestDevices::getStateValue() } +void TestRestDevices::editDevices_data() +{ + QTest::addColumn("name"); + + QTest::newRow("change name") << "New device name"; + QTest::newRow("change name") << "Foo device"; + QTest::newRow("change name") << "Bar device"; +} + +void TestRestDevices::editDevices() +{ + QFETCH(QString, name); + QString originalName = "Test device"; + + QVariantList deviceParams; + QVariantMap httpportParam; + httpportParam.insert("name", "httpport"); + httpportParam.insert("value", m_mockDevice1Port - 2); + deviceParams.append(httpportParam); + + QVariantMap params; + params.insert("deviceClassId", mockDeviceClassId.toString()); + params.insert("name", originalName); + params.insert("deviceParams", deviceParams); + + QNetworkRequest addRequest(QUrl("http://localhost:3333/api/v1/devices")); + addRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + + QVariant response = postAndWait(addRequest, params); + DeviceId deviceId = DeviceId(response.toMap().value("id").toString()); + QVERIFY2(!deviceId.isNull(), "invalid device id"); + + // edit device + params.clear(); + params.insert("name", name); + + QNetworkRequest deviceRequest(QUrl(QString("http://localhost:3333/api/v1/devices/%1").arg(deviceId.toString()))); + deviceRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + + response = postAndWait(deviceRequest, params); + QVERIFY2(response.toMap().value("error").toString() == JsonTypes::deviceErrorToString(DeviceManager::DeviceErrorNoError), "Could not edit device name"); + + // check device name + response = getAndWait(deviceRequest); + QCOMPARE(response.toMap().value("name").toString(), name); + + // Remove the device + response = deleteAndWait(deviceRequest); + QVERIFY2(response.toMap().value("error").toString() == JsonTypes::deviceErrorToString(DeviceManager::DeviceErrorNoError), "Could not remove device"); +} + void TestRestDevices::reconfigureDevices_data() { QVariantList asyncChangeDeviceParams; @@ -594,7 +648,7 @@ void TestRestDevices::reconfigureDevices() DeviceId deviceId = DeviceId(response.toMap().value("id").toString()); QVERIFY2(deviceId != DeviceId(), "DeviceId not returned"); - // now EDIT the added device + // now RECONFIGURE the added device QVariantMap editParams; editParams.insert("deviceId", deviceId); editParams.insert("deviceParams", newDeviceParams); @@ -605,7 +659,7 @@ void TestRestDevices::reconfigureDevices() response = putAndWait(request, editParams, expectedStatusCode); QVERIFY2(!response.isNull(), "Could not read edit device response"); - // if the edit should have been successfull + // if the reconfigure should have been successfull if (expectedStatusCode == 200) { request.setUrl(QUrl(QString("http://localhost:3333/api/v1/devices/%1").arg(deviceId.toString()))); request.setHeader(QNetworkRequest::ContentTypeHeader, "text/json"); @@ -622,7 +676,7 @@ void TestRestDevices::reconfigureDevices() QVERIFY2(!response.isNull(), "Could not delete device"); } -void TestRestDevices::editByDiscovery_data() +void TestRestDevices::reconfigureByDiscovery_data() { QTest::addColumn("deviceClassId"); QTest::addColumn("resultCount"); @@ -638,7 +692,7 @@ void TestRestDevices::editByDiscovery_data() QTest::newRow("discover 2 devices with params") << mockDeviceClassId << 2 << discoveryParams << 200; } -void TestRestDevices::editByDiscovery() +void TestRestDevices::reconfigureByDiscovery() { QFETCH(DeviceClassId, deviceClassId); QFETCH(int, resultCount); @@ -711,7 +765,7 @@ void TestRestDevices::editByDiscovery() QVERIFY(!descriptorId2.isNull()); qDebug() << "edit device 1 (55555) with descriptor 2 (55556) " << descriptorId2; - // EDIT + // RECONFIGURE response.clear(); params.clear(); params.insert("deviceId", deviceId.toString());