/********************************************************************************
 * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 ********************************************************************************/

package org.eclipse.mdm.businessobjects.boundary.integrationtest;

import org.eclipse.mdm.api.base.model.ContextType;
import org.eclipse.mdm.api.base.model.ValueType;
import org.eclipse.mdm.api.dflt.model.CatalogAttribute;
import org.eclipse.mdm.api.dflt.model.CatalogComponent;
import org.eclipse.mdm.api.dflt.model.TemplateAttribute;
import org.eclipse.mdm.api.dflt.model.TemplateComponent;
import org.eclipse.mdm.api.dflt.model.TemplateRoot;
import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
import org.junit.AfterClass;
import org.junit.BeforeClass;

/**
 * Test class for NestedTemplateAttributeResource for UnitUnderTest
 * {@link ContextType}.
 * 
 * @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
 * @see EntityResourceIntegrationTest
 *
 */
public class NestedTemplateAttributeUUTResourceIntegrationTest extends EntityResourceIntegrationTest {

	@BeforeClass
	public static void prepareTestData() {
		getLogger().debug("Preparing NestedTemplateAttributeUUTResourceIntegrationTest");

		// prepare test data for creating the CatalogAttribute
		CatalogAttributeUUTResourceIntegrationTest.prepareTestData();
		CatalogAttributeUUTResourceIntegrationTest.createEntity();

		// prepare test data for creating the NestedTemplateComponent
		NestedTemplateComponentUUTResourceIntegrationTest.prepareTestData();
		NestedTemplateComponentUUTResourceIntegrationTest.createEntity();

		setContextClass(NestedTemplateAttributeUUTResourceIntegrationTest.class);

		// set up test data
		putTestDataValue(TESTDATA_RESOURCE_URI, "/tplroots/unitundertest/"
				+ getTestDataValue(TemplateRootUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps/"
				+ getTestDataValue(TemplateComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID) + "/tplcomps/"
				+ getTestDataValue(NestedTemplateComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
				+ "/tplattrs");
		putTestDataValue(TESTDATA_ENTITY_NAME,
				getTestDataValue(CatalogAttributeUUTResourceIntegrationTest.class, TESTDATA_ENTITY_NAME));
		putTestDataValue(TESTDATA_ENTITY_TYPE, "TemplateAttribute");

		CatalogComponent catComp = ENTITY_FACTORY.createCatalogComponent(ContextType.TESTSEQUENCE,
				getTestDataValue(CatalogComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_NAME));
		ServiceUtils.getCore(catComp)
				.setID(getTestDataValue(CatalogComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID));

		CatalogAttribute catAttr = ENTITY_FACTORY.createCatalogAttribute(getTestDataValue(TESTDATA_ENTITY_NAME),
				ValueType.STRING, catComp);
		ServiceUtils.getCore(catAttr)
				.setID(getTestDataValue(CatalogAttributeUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID));

		TemplateRoot tplRoot = ENTITY_FACTORY.createTemplateRoot(ContextType.TESTSEQUENCE,
				getTestDataValue(CatalogComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_NAME));
		ServiceUtils.getCore(tplRoot)
				.setID(getTestDataValue(CatalogComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID));

		TemplateComponent tplComp = ENTITY_FACTORY.createTemplateComponent(
				getTestDataValue(TemplateComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_NAME), tplRoot,
				catComp);
		ServiceUtils.getCore(tplComp)
				.setID(getTestDataValue(TemplateComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID));

		TemplateComponent nestedTplComp = ENTITY_FACTORY.createTemplateComponent(
				getTestDataValue(NestedTemplateComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_NAME),
				tplComp, catComp);
		ServiceUtils.getCore(tplComp)
				.setID(getTestDataValue(NestedTemplateComponentUUTResourceIntegrationTest.class, TESTDATA_ENTITY_ID));

		// delete the implicitly created TemplateAttribute on the client side
		nestedTplComp.removeTemplateAttribute(getTestDataValue(TESTDATA_ENTITY_NAME));

		TemplateAttribute nestedTplAttr = ENTITY_FACTORY.createTemplateAttribute(getTestDataValue(TESTDATA_ENTITY_NAME),
				nestedTplComp);

		putTestDataValue(TESTDATA_CREATE_JSON_BODY, toJson(nestedTplAttr));

		// delete the implicitly created NestedTemplateAttribute
		NestedTemplateAttributeUUTResourceIntegrationTest.findFirst();
		NestedTemplateAttributeUUTResourceIntegrationTest.deleteEntity();
	}

	@AfterClass
	public static void tearDownAfterClass() {
		setContextClass(NestedTemplateComponentUUTResourceIntegrationTest.class);
		NestedTemplateComponentUUTResourceIntegrationTest.deleteEntity();

		setContextClass(TemplateComponentUUTResourceIntegrationTest.class);
		TemplateComponentUUTResourceIntegrationTest.deleteEntity();

		setContextClass(TemplateRootUUTResourceIntegrationTest.class);
		TemplateRootUUTResourceIntegrationTest.deleteEntity();

		setContextClass(CatalogAttributeUUTResourceIntegrationTest.class);
		CatalogAttributeUUTResourceIntegrationTest.deleteEntity();

		setContextClass(CatalogComponentUUTResourceIntegrationTest.class);
		CatalogComponentUUTResourceIntegrationTest.deleteEntity();
	}
}
