#include "cable.hpp"

#include <memory>
#include <string>
#include <system_error>  // NOLINT

#include <gtest/gtest.h>
#include "http_request.hpp"
#include "utility.hpp"
#include "test/redfish-core/lib/snapshot_fixture.hpp"
#include <nlohmann/json.hpp>
#include "managed_store.hpp"
#include "test/g3/mock_managed_store_test.hpp"

#ifdef SNAPSHOT_FIXTURE_G3
#include "devtools/build/runtime/get_runfiles_dir.h"
#endif

namespace redfish {
namespace {

class SnapshotFixture_CableFru : public redfish::SnapshotFixture {
 protected:
  static void SetUpTestSuite() {
    // Have to manually call this as defining this current function prevents
    // its parent's Setup from being called
    ::managedStore::MockManagedStoreTest::SetUpTestSuite();
#ifdef SNAPSHOT_FIXTURE_G3
    std::string snapshotFilepath_cableFruLocal =
        ::devtools_build::GetDataDependencyFilepath(
            "google3/third_party/openbmc_build_scripts/additional/"
            "scrubbed_gBMCwebManagedStore_platform5_3_2024_08_26.json");
    EXPECT_TRUE(managedStore::GetManagedObjectStore()->deserialize(
        snapshotFilepath_cableFruLocal));
#else
    EXPECT_TRUE(managedStore::GetManagedObjectStore()->deserialize(
        snapshotFilepath_cableFru));
#endif
  }
  // 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);
  }
};

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
