/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.atlas.repository.store.graph.v1;

import com.google.inject.Inject;
import org.apache.atlas.ApplicationProperties;
import org.apache.atlas.AtlasErrorCode;
import org.apache.atlas.AtlasException;
import org.apache.atlas.TestModules;
import org.apache.atlas.exception.AtlasBaseException;
import org.apache.atlas.model.typedef.AtlasRelationshipDef;
import org.apache.atlas.model.typedef.AtlasRelationshipEndDef;
import org.apache.atlas.model.typedef.AtlasStructDef;
import org.apache.atlas.repository.graph.AtlasGraphProvider;
import org.apache.atlas.type.AtlasTypeUtil;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;

import static org.testng.AssertJUnit.fail;

/**
 * Tests for AtlasRelationshipStoreV1
 */
@Guice(modules = TestModules.TestOnlyModule.class)
public class AtlasRelationshipDefStoreV1Test {

    @Inject
    private
    AtlasRelationshipDefStoreV1 relationshipDefStore;

    @DataProvider
    public Object[][] invalidAttributeNameWithReservedKeywords(){
        AtlasRelationshipDef invalidAttrNameType =
            AtlasTypeUtil.createRelationshipTypeDef("Invalid_Attribute_Type", "description","" ,
                    AtlasRelationshipDef.RelationshipCategory.ASSOCIATION,
                    AtlasRelationshipDef.PropagateTags.BOTH,
                    new AtlasRelationshipEndDef("typeA", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),
                    new AtlasRelationshipEndDef("typeB", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),

                    AtlasTypeUtil.createRequiredAttrDef("order", "string"),
                    AtlasTypeUtil.createRequiredAttrDef("limit", "string"));

        return new Object[][] {{
            invalidAttrNameType
        }};
    }
    @DataProvider
    public Object[][] updateValidProperties(){
        AtlasRelationshipDef existingType =
                AtlasTypeUtil.createRelationshipTypeDef("basicType", "description","0" ,
                        AtlasRelationshipDef.RelationshipCategory.ASSOCIATION,
                        AtlasRelationshipDef.PropagateTags.ONE_TO_TWO,
                        new AtlasRelationshipEndDef("typeC", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),
                        new AtlasRelationshipEndDef("typeD", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),

                        AtlasTypeUtil.createRequiredAttrDef("aaaa", "string"),
                        AtlasTypeUtil.createRequiredAttrDef("bbbb", "string"));
        AtlasRelationshipDef newType =
                AtlasTypeUtil.createRelationshipTypeDef("basicType",
                        "description1", // updated
                        "1" , // updated
                        AtlasRelationshipDef.RelationshipCategory.ASSOCIATION,
                        AtlasRelationshipDef.PropagateTags.BOTH, // updated
                        new AtlasRelationshipEndDef("typeC", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),
                        new AtlasRelationshipEndDef("typeD", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),

                        AtlasTypeUtil.createRequiredAttrDef("aaaa", "string"),
                        AtlasTypeUtil.createRequiredAttrDef("bbbb", "string"));


        return new Object[][] {{
                existingType,
                newType
        }};
    }


    @DataProvider
    public Object[][] updateRename(){
        AtlasRelationshipDef existingType =
                AtlasTypeUtil.createRelationshipTypeDef("basicType", "description","" ,
                        AtlasRelationshipDef.RelationshipCategory.ASSOCIATION,
                        AtlasRelationshipDef.PropagateTags.BOTH,
                        new AtlasRelationshipEndDef("typeC", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),
                        new AtlasRelationshipEndDef("typeD", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),

                        AtlasTypeUtil.createRequiredAttrDef("aaaa", "string"),
                        AtlasTypeUtil.createRequiredAttrDef("bbbb", "string"));
        AtlasRelationshipDef newType =
                AtlasTypeUtil.createRelationshipTypeDef("basicType2", "description","" ,
                        AtlasRelationshipDef.RelationshipCategory.ASSOCIATION,
                        AtlasRelationshipDef.PropagateTags.BOTH,
                        new AtlasRelationshipEndDef("typeC", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),
                        new AtlasRelationshipEndDef("typeD", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),

                        AtlasTypeUtil.createRequiredAttrDef("aaaa", "string"),
                        AtlasTypeUtil.createRequiredAttrDef("bbbb", "string"));


        return new Object[][] {{
                existingType,
                newType
        }};
    }
    @DataProvider
    public Object[][] updateRelCat(){
        AtlasRelationshipDef existingType =
                AtlasTypeUtil.createRelationshipTypeDef("basicType", "description","" ,
                        AtlasRelationshipDef.RelationshipCategory.ASSOCIATION,
                        AtlasRelationshipDef.PropagateTags.BOTH,
                        new AtlasRelationshipEndDef("typeC", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),
                        new AtlasRelationshipEndDef("typeD", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),

                        AtlasTypeUtil.createRequiredAttrDef("aaaa", "string"),
                        AtlasTypeUtil.createRequiredAttrDef("bbbb", "string"));
        AtlasRelationshipDef newType =
                AtlasTypeUtil.createRelationshipTypeDef("basicType", "description","" ,
                        AtlasRelationshipDef.RelationshipCategory.AGGREGATION,
                        AtlasRelationshipDef.PropagateTags.BOTH,
                        new AtlasRelationshipEndDef("typeC", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),
                        new AtlasRelationshipEndDef("typeD", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),

                        AtlasTypeUtil.createRequiredAttrDef("aaaa", "string"),
                        AtlasTypeUtil.createRequiredAttrDef("bbbb", "string"));


        return new Object[][] {{
                existingType,
                newType
        }};
    }
    @DataProvider
    public Object[][] updateEnd1(){
        AtlasRelationshipDef existingType =
                AtlasTypeUtil.createRelationshipTypeDef("basicType", "description","" ,
                        AtlasRelationshipDef.RelationshipCategory.ASSOCIATION,
                        AtlasRelationshipDef.PropagateTags.BOTH,
                        new AtlasRelationshipEndDef("typeC", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),
                        new AtlasRelationshipEndDef("typeD", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),

                        AtlasTypeUtil.createRequiredAttrDef("aaaa", "string"),
                        AtlasTypeUtil.createRequiredAttrDef("bbbb", "string"));
        AtlasRelationshipDef changeType =
                AtlasTypeUtil.createRelationshipTypeDef("basicType", "description","" ,
                        AtlasRelationshipDef.RelationshipCategory.ASSOCIATION,
                        AtlasRelationshipDef.PropagateTags.BOTH,
                        new AtlasRelationshipEndDef("typeE", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),
                        new AtlasRelationshipEndDef("typeD", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),

                        AtlasTypeUtil.createRequiredAttrDef("aaaa", "string"),
                        AtlasTypeUtil.createRequiredAttrDef("bbbb", "string"));
        AtlasRelationshipDef changeAttr =
                AtlasTypeUtil.createRelationshipTypeDef("basicType", "description","" ,
                        AtlasRelationshipDef.RelationshipCategory.ASSOCIATION,
                        AtlasRelationshipDef.PropagateTags.BOTH,
                        new AtlasRelationshipEndDef("typeC", "attr2", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),
                        new AtlasRelationshipEndDef("typeD", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),

                        AtlasTypeUtil.createRequiredAttrDef("aaaa", "string"),
                        AtlasTypeUtil.createRequiredAttrDef("bbbb", "string"));
        AtlasRelationshipDef changeCardinality =
                AtlasTypeUtil.createRelationshipTypeDef("basicType", "description","" ,
                        AtlasRelationshipDef.RelationshipCategory.ASSOCIATION,
                        AtlasRelationshipDef.PropagateTags.BOTH,
                        new AtlasRelationshipEndDef("typeC", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.LIST),
                        new AtlasRelationshipEndDef("typeD", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),

                        AtlasTypeUtil.createRequiredAttrDef("aaaa", "string"),
                        AtlasTypeUtil.createRequiredAttrDef("bbbb", "string"));


        return new Object[][]{
                {
                        existingType,
                        changeType
                },
                {
                        existingType,
                        changeAttr
                },
                {
                        existingType,
                        changeCardinality
                }
        };
    }
    @DataProvider
    public Object[][] updateEnd2(){
        AtlasRelationshipDef existingType =
                AtlasTypeUtil.createRelationshipTypeDef("basicType", "description","" ,
                        AtlasRelationshipDef.RelationshipCategory.ASSOCIATION,
                        AtlasRelationshipDef.PropagateTags.BOTH,
                        new AtlasRelationshipEndDef("typeC", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),
                        new AtlasRelationshipEndDef("typeD", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),

                        AtlasTypeUtil.createRequiredAttrDef("aaaa", "string"),
                        AtlasTypeUtil.createRequiredAttrDef("bbbb", "string"));

        AtlasRelationshipDef changeType =
                AtlasTypeUtil.createRelationshipTypeDef("basicType", "description","" ,
                        AtlasRelationshipDef.RelationshipCategory.ASSOCIATION,
                        AtlasRelationshipDef.PropagateTags.BOTH,
                        new AtlasRelationshipEndDef("typeC", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),
                        new AtlasRelationshipEndDef("typeE", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),

                        AtlasTypeUtil.createRequiredAttrDef("aaaa", "string"),
                        AtlasTypeUtil.createRequiredAttrDef("bbbb", "string"));
        AtlasRelationshipDef changeAttr =
                AtlasTypeUtil.createRelationshipTypeDef("basicType", "description","" ,
                        AtlasRelationshipDef.RelationshipCategory.ASSOCIATION,
                        AtlasRelationshipDef.PropagateTags.BOTH,
                        new AtlasRelationshipEndDef("typeC", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),
                        new AtlasRelationshipEndDef("typeD", "attr2", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),

                        AtlasTypeUtil.createRequiredAttrDef("aaaa", "string"),
                        AtlasTypeUtil.createRequiredAttrDef("bbbb", "string"));
        AtlasRelationshipDef changeCardinality =
                AtlasTypeUtil.createRelationshipTypeDef("basicType", "description","" ,
                        AtlasRelationshipDef.RelationshipCategory.ASSOCIATION,
                        AtlasRelationshipDef.PropagateTags.BOTH,
                        new AtlasRelationshipEndDef("typeC", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.SINGLE),
                        new AtlasRelationshipEndDef("typeD", "attr1", AtlasStructDef.AtlasAttributeDef.Cardinality.LIST),

                        AtlasTypeUtil.createRequiredAttrDef("aaaa", "string"),
                        AtlasTypeUtil.createRequiredAttrDef("bbbb", "string"));


        return new Object[][]{
                {
                        existingType,
                        changeType
                },
                {
                        existingType,
                        changeAttr
                },
                {
                        existingType,
                        changeCardinality
                }
        };
    }

    @Test(dataProvider = "invalidAttributeNameWithReservedKeywords")
    public void testCreateTypeWithReservedKeywords(AtlasRelationshipDef atlasRelationshipDef) throws AtlasException {
        try {
            ApplicationProperties.get().setProperty(AtlasAbstractDefStoreV1.ALLOW_RESERVED_KEYWORDS, false);
            relationshipDefStore.create(atlasRelationshipDef, null);
        } catch (AtlasBaseException e) {
            Assert.assertEquals(e.getAtlasErrorCode(), AtlasErrorCode.ATTRIBUTE_NAME_INVALID);
        }
    }

    @Test(dataProvider = "updateValidProperties")
    public void testupdateVertexPreUpdatepropagateTags(AtlasRelationshipDef existingRelationshipDef,AtlasRelationshipDef newRelationshipDef) throws AtlasBaseException {
        AtlasRelationshipDefStoreV1.preUpdateCheck(existingRelationshipDef,newRelationshipDef);
    }

    @Test(dataProvider = "updateRename")
    public void testupdateVertexPreUpdateRename(AtlasRelationshipDef existingRelationshipDef,AtlasRelationshipDef newRelationshipDef)  {

        try {
            AtlasRelationshipDefStoreV1.preUpdateCheck(existingRelationshipDef,newRelationshipDef);
            fail("expected error");
        } catch (AtlasBaseException e) {
            if (!e.getAtlasErrorCode().equals(AtlasErrorCode.RELATIONSHIPDEF_INVALID_NAME_UPDATE)){
                fail("unexpected AtlasErrorCode "+e.getAtlasErrorCode());
            }
        }
    }
    @Test(dataProvider = "updateRelCat")
    public void testupdateVertexPreUpdateRelcat(AtlasRelationshipDef existingRelationshipDef,AtlasRelationshipDef newRelationshipDef)  {

        try {
            AtlasRelationshipDefStoreV1.preUpdateCheck(existingRelationshipDef,newRelationshipDef);
            fail("expected error");
        } catch (AtlasBaseException e) {
            if (!e.getAtlasErrorCode().equals(AtlasErrorCode.RELATIONSHIPDEF_INVALID_CATEGORY_UPDATE)){
                fail("unexpected AtlasErrorCode "+e.getAtlasErrorCode());
            }
        }
    }
    @Test(dataProvider = "updateEnd1")
    public void testupdateVertexPreUpdateEnd1(AtlasRelationshipDef existingRelationshipDef,AtlasRelationshipDef newRelationshipDef)  {

        try {
            AtlasRelationshipDefStoreV1.preUpdateCheck(existingRelationshipDef,newRelationshipDef);
            fail("expected error");
        } catch (AtlasBaseException e) {
            if (!e.getAtlasErrorCode().equals(AtlasErrorCode.RELATIONSHIPDEF_INVALID_END1_UPDATE)){
                fail("unexpected AtlasErrorCode "+e.getAtlasErrorCode());
            }
        }
    }

    @Test(dataProvider = "updateEnd2")
    public void testupdateVertexPreUpdateEnd2(AtlasRelationshipDef existingRelationshipDef,AtlasRelationshipDef newRelationshipDef)  {

        try {
            AtlasRelationshipDefStoreV1.preUpdateCheck(existingRelationshipDef,newRelationshipDef);
            fail("expected error");
        } catch (AtlasBaseException e) {
            if (!e.getAtlasErrorCode().equals(AtlasErrorCode.RELATIONSHIPDEF_INVALID_END2_UPDATE)){
                fail("unexpected AtlasErrorCode "+e.getAtlasErrorCode());
            }
        }
    }
    @AfterClass
    public void clear(){
        AtlasGraphProvider.cleanup();
    }
}
