#include "dbus/dbusactiveread.hpp"
#include "test/dbushelper_mock.hpp"

#include <sdbusplus/test/sdbus_mock.hpp>

#include <memory>
#include <string>

#include <gmock/gmock.h>
#include <gtest/gtest.h>

namespace pid_control
{
namespace
{

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

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

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

    DbusActiveRead ar(bus_mock, path, service, std::move(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);
    auto helper = std::make_unique<DbusHelperMock>();
    std::string path = "/asdf";
    std::string service = "asdfasdf.asdfasdf";

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

    DbusActiveRead ar(bus_mock, path, service, std::move(helper));

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

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

} // namespace
} // namespace pid_control
