#include "dbus/dbusactiveread.hpp"

#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <sdbusplus/test/sdbus_mock.hpp>
#include <string>

#include "test/dbushelper_mock.hpp"

using ::testing::Invoke;
using ::testing::NotNull;
using ::testing::_;

TEST(DbusActiveReadTest, BoringConstructorTest) {
    // Verify we can construct it.

    sdbusplus::SdBusMock sdbus_mock;
    auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
    DbusHelperMock helper;
    std::string path = "/asdf";
    std::string service = "asdfasdf.asdfasdf";

    DbusActiveRead ar(bus_mock, path, service, &helper);
}

TEST(DbusActiveReadTest, Read_VerifyCallsToDbusForValue) {
    // Verify it calls to get the value from dbus when requested.

    sdbusplus::SdBusMock sdbus_mock;
    auto bus_mock = sdbusplus::get_mocked_new(&sdbus_mock);
    DbusHelperMock helper;
    std::string path = "/asdf";
    std::string service = "asdfasdf.asdfasdf";

    DbusActiveRead ar(bus_mock, path, service, &helper);

    EXPECT_CALL(helper, GetProperties(_, service, path, NotNull()))
        .WillOnce(Invoke([&](sdbusplus::bus::bus& bus,
                             const std::string& service,
                             const std::string& path,
                             struct SensorProperties* prop) {
            prop->scale = -3;
            prop->value = 10000;
            prop->unit = "x";
        }));

    ReadReturn r = ar.read();
    EXPECT_EQ(10, r.value);
}

// WARN: GetProperties will raise an exception on failure
// Instead of just not updating the value.