#include "cable.hpp"
#include "nlohmann/json.hpp"
#include "snapshot_fixture.hpp"

#include <gtest/gtest.h>

namespace redfish
{
namespace
{

class SnapshotFixture_CableFru : public redfish::SnapshotFixture
{
  protected:
    SnapshotFixture_CableFru() : app_(false)
    {
        share_async_resp_ = std::make_shared<bmcweb::AsyncResp>();
    };

    static void SetUpTestSuite()
    {
        // Have to manually call this as defining this current function prevents
        // its parent's Setup from being called
        ::managedStore::MockManagedStoreTest::SetUpTestSuite();
        EXPECT_TRUE(managedStore::GetManagedObjectStore()->deserialize(
            snapshotFilepath_cableFru));
    }
    // Use this to create a crow request for use in handlers
    static crow::Request CreateRequest(const std::string& reqIn = "")
    {
        // Dont need this error code ever
        std::error_code ec;
        return crow::Request(reqIn, ec);
    }
    std::shared_ptr<bmcweb::AsyncResp> share_async_resp_;
    App app_;
};

TEST_F(SnapshotFixture_CableFru, handleCableGetTest)
{
    constexpr char kCable[] = "ioadapter_x16_1";
    handleCableGet(app_, CreateRequest(), share_async_resp_, kCable);

    RunIoUntilDone();

    nlohmann::json& json = share_async_resp_->res.jsonValue;

    EXPECT_EQ(json["@odata.type"], "#Cable.v1_0_0.Cable");
    EXPECT_EQ(json["@odata.id"],
              crow::utility::urlFromPieces("redfish", "v1", "Cables", kCable));
    EXPECT_EQ(json["Id"], kCable);
    EXPECT_EQ(json["Name"], "Cable");
    EXPECT_EQ(json["Status"]["State"], "Enabled");

    EXPECT_TRUE(json.contains("Model"));
    EXPECT_TRUE(json.contains("Manufacturer"));
    EXPECT_TRUE(json.contains("PartNumber"));
    EXPECT_TRUE(json.contains("SerialNumber"));
}

TEST_F(SnapshotFixture_CableFru, getCableChassisAssociationTest)
{
    constexpr char kCable[] = "NcsiCable";
    handleCableGet(app_, CreateRequest(), share_async_resp_, kCable);

    RunIoUntilDone();

    nlohmann::json& json = share_async_resp_->res.jsonValue;

    EXPECT_EQ(json["@odata.type"], "#Cable.v1_0_0.Cable");
    EXPECT_EQ(json["@odata.id"],
              crow::utility::urlFromPieces("redfish", "v1", "Cables", kCable));
    EXPECT_EQ(json["Id"], kCable);
    EXPECT_EQ(json["Links"]["DownstreamChassis"][0]["@odata.id"],
              crow::utility::urlFromPieces("redfish", "v1", "Chassis", "chassis3_1"));
    EXPECT_EQ(json["Links"]["UpstreamChassis"][0]["@odata.id"],
              crow::utility::urlFromPieces("redfish", "v1", "Chassis", "platform5"));
    EXPECT_EQ(json["Name"], "Cable");
    EXPECT_EQ(json["Status"]["State"], "Enabled");

    EXPECT_TRUE(json.contains("Model"));
}

} // namespace
} // namespace redfish
