/**
 * 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.
 */
package org.apache.pulsar.manager.dao;

import com.github.pagehelper.Page;
import org.apache.pulsar.manager.PulsarManagerApplication;
import org.apache.pulsar.manager.entity.RoleInfoEntity;
import org.apache.pulsar.manager.entity.RolesRepository;
import org.apache.pulsar.manager.profiles.HerdDBTestProfile;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@RunWith(SpringRunner.class)
@SpringBootTest(
        classes = {
                PulsarManagerApplication.class,
                HerdDBTestProfile.class
        }
)
@ActiveProfiles("test")
public class RolesRepositoryImplTest {

    @Autowired
    private RolesRepository rolesRepository;

    private void initRole(RoleInfoEntity roleInfoEntity) {
        roleInfoEntity.setRoleName("test-role-name");
        roleInfoEntity.setRoleSource("test-tenant");
        roleInfoEntity.setResourceType("tenants");
        roleInfoEntity.setResourceName("tenants");
        roleInfoEntity.setResourceVerbs("admin");
        roleInfoEntity.setResourceId(2);
        roleInfoEntity.setDescription("This is tenants permissions");
        roleInfoEntity.setFlag(0);
    }

    private void validateRole(RoleInfoEntity role) {
        Assert.assertEquals(role.getRoleName(), "test-role-name");
        Assert.assertEquals(role.getRoleSource(), "test-tenant");
        Assert.assertEquals(role.getResourceType(), "tenants");
        Assert.assertEquals(role.getResourceName(), "tenants");
        Assert.assertEquals(role.getResourceVerbs(), "admin");
        Assert.assertEquals(role.getResourceId(), 2);
        Assert.assertEquals(role.getDescription(), "This is tenants permissions");
        Assert.assertEquals(role.getFlag(), 0);
    }

    @Test
    public void getRolesListTest() {
        RoleInfoEntity roleInfoEntity = new RoleInfoEntity();
        initRole(roleInfoEntity);

        rolesRepository.save(roleInfoEntity);

        Page<RoleInfoEntity> rolesList = rolesRepository.findRolesList(1, 10);
        rolesList.count(true);
        rolesList.getResult().forEach((role) -> {
            validateRole(role);
            rolesRepository.delete(role.getRoleName(), role.getRoleSource());
        });
    }

    @Test
    public void findRolesListByRoleSourceTest() {
        RoleInfoEntity roleInfoEntity = new RoleInfoEntity();
        initRole(roleInfoEntity);

        rolesRepository.save(roleInfoEntity);

        List<RoleInfoEntity> rolesList = rolesRepository.findRolesListByRoleSource("test-tenant");
        rolesList.forEach((role) -> {
            validateRole(role);
            rolesRepository.delete(role.getRoleName(), role.getRoleSource());
        });
    }

    @Test
    public void getRoleInfoTest() {
        RoleInfoEntity roleInfoEntity = new RoleInfoEntity();
        initRole(roleInfoEntity);

        rolesRepository.save(roleInfoEntity);

        Optional<RoleInfoEntity> getRoleInfo = rolesRepository.findByRoleName(
                roleInfoEntity.getRoleName(), roleInfoEntity.getRoleSource());
        RoleInfoEntity getRoleInfoEntity = getRoleInfo.get();
        validateRole(getRoleInfoEntity);

        roleInfoEntity.setResourceType("clusters");
        roleInfoEntity.setResourceVerbs("admin,produce,consume");
        roleInfoEntity.setDescription("This is update role");
        roleInfoEntity.setFlag(1);

        rolesRepository.update(roleInfoEntity);
        Optional<RoleInfoEntity> updateRoleInfo = rolesRepository.findByRoleName(
                roleInfoEntity.getRoleName(), roleInfoEntity.getRoleSource());
        RoleInfoEntity updateRoleInfoEntity = updateRoleInfo.get();
        Assert.assertEquals(updateRoleInfoEntity.getResourceType(), "clusters");
        Assert.assertEquals(updateRoleInfoEntity.getResourceVerbs(), "admin,produce,consume");
        Assert.assertEquals(updateRoleInfoEntity.getDescription(), "This is update role");
        Assert.assertEquals(updateRoleInfoEntity.getFlag(), 1);

        rolesRepository.delete(roleInfoEntity.getRoleName(), roleInfoEntity.getRoleSource());
        Optional<RoleInfoEntity> deleteRoleInfo = rolesRepository.findByRoleName(
                roleInfoEntity.getRoleName(), roleInfoEntity.getRoleSource());
        Assert.assertFalse(deleteRoleInfo.isPresent());
    }

    @Test
    public void findMultiIdTest() {
        RoleInfoEntity roleInfoEntity = new RoleInfoEntity();
        initRole(roleInfoEntity);

        long roleId = rolesRepository.save(roleInfoEntity);
        List<Long> roleIdList = new ArrayList<>();
        roleIdList.add(roleId);
        roleIdList.add(roleInfoEntity.getRoleId());
        Page<RoleInfoEntity> roleInfoEntities = rolesRepository.findRolesMultiId(1, 2, roleIdList);
        roleInfoEntities.count(true);
        for (RoleInfoEntity infoEntity : roleInfoEntities.getResult()) {
            validateRole(infoEntity);
            rolesRepository.delete(infoEntity.getRoleName(), infoEntity.getRoleSource());
        }
    }
}
