/*
* Copyright 2021 The casbin Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This is a test file for testing built in functions in casbin
*/

#include <gtest/gtest.h>
#include <casbin/casbin.h>
#include <fstream>
#include "config_path.h"

namespace {

std::shared_ptr<casbin::Config> basic_config;
void InitTest() {
    basic_config = casbin::Config::NewConfig(basic_model_path);
}

TEST(TestModel, TestNewModel) {
    std::shared_ptr<casbin::Model> model = casbin::Model::NewModel();
    ASSERT_NE(model, nullptr);
}

TEST(TestModel, TestNewModelFromFile) {
    std::shared_ptr<casbin::Model> model = casbin::Model::NewModelFromFile(basic_model_path);
    ASSERT_NE(model, nullptr);
}

TEST(TestModel, TestNewModelFromString) {
    std::ifstream infile;
    infile.open(basic_model_path);
    std::string content;
    std::getline(infile, content, '\0');
     std::shared_ptr<casbin::Model> model = casbin::Model::NewModelFromString(content);

    ASSERT_NE(model, nullptr);
}

TEST(TestModel, TestLoadModelFromConfig) {
    InitTest();
    std::shared_ptr<casbin::Model> model = casbin::Model::NewModel();
    model->LoadModelFromConfig(basic_config);

    model = casbin::Model::NewModel();
    std::shared_ptr<casbin::Config> config = casbin::Config::NewConfigFromText("");
    try {
        model->LoadModelFromConfig(config);
        FAIL();
    }
    catch (casbin::MissingRequiredSections e) {
    }
}

TEST(TestModel, TestHasSection) {
    InitTest();
     std::shared_ptr<casbin::Model> model = casbin::Model::NewModel();
    model->LoadModelFromConfig(basic_config);

    for (int i = 0; i < (casbin::Model::required_sections).size(); i++) {
        ASSERT_TRUE(model->HasSection((casbin::Model::required_sections)[i]));
    }

    model = casbin::Model::NewModel();
    std::shared_ptr<casbin::Config> config = casbin::Config::NewConfigFromText("");
    try {
        model->LoadModelFromConfig(config);
        FAIL();
    }
    catch (casbin::MissingRequiredSections e) {
    }

    for (const auto& section : casbin::Model::required_sections)
        ASSERT_FALSE(model->HasSection(section));
}

TEST(TestModel, TestModel_AddDef) {
    std::shared_ptr<casbin::Model> model = casbin::Model::NewModel();
    std::string s = "r";
    std::string v = "sub, obj, act";

    bool ok = model->AddDef(s, s, v);
    ASSERT_TRUE(ok);

    ok = model->AddDef(s, s, "");
    ASSERT_FALSE(ok);
}

} // namespace
