/*
 *
 * This file is a part of the CaosDB Project.
 *
 * Copyright (C) 2021 Timm Fitschen <t.fitschen@indiscale.com>
 * Copyright (C) 2021 IndiScale GmbH <info@indiscale.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <https://www.gnu.org/licenses/>.
 *
 */

#include "boost/json/object.hpp"              // for object
#include "boost/json/value.hpp"               // for value
#include "caosdb/utility.h"                   // for base64_encode, load_js...
#include "caosdb_test_utility.h"              // for TEST_DATA_DIR
#include "gmock/gmock-matchers.h"             // for ElementsAre, EXPECT_THAT
#include <boost/beast/core/detail/base64.hpp> // for encoded_size
#include <gtest/gtest-message.h>              // for Message
#include <gtest/gtest-test-part.h>            // for TestPartResult, SuiteA...
#include <gtest/gtest_pred_impl.h>            // for Test, EXPECT_EQ, TestInfo
#include <string>                             // for allocator, string, ope...

namespace caosdb::utility {
using ::testing::ElementsAre;

TEST(test_utility, base64_encode) {
  auto test_plain = std::string("admin:caosdb");
  auto test_encoded = std::string("YWRtaW46Y2Fvc2Ri");
  EXPECT_EQ(12, test_plain.size());
  EXPECT_EQ(16, boost::beast::detail::base64::encoded_size(test_plain.size()));
  EXPECT_EQ(test_encoded, base64_encode(test_plain));
}

TEST(test_utility, test_load_json_file) {
  auto json = load_json_file(TEST_DATA_DIR + "/test.json").as_object();

  EXPECT_EQ(json["it"], "tests");
  EXPECT_EQ(json["null values"], nullptr);
  EXPECT_THAT(json["this"].as_array(), ElementsAre("is", "a", "test"));
  EXPECT_THAT(json["numbers"].as_array(), ElementsAre(1, 2, 3.3));
  auto sub = json["arrays and objects"].as_object();
  EXPECT_THAT(sub["see?"].as_array(), ElementsAre(true, false));
}

} // namespace caosdb::utility