/********************************************************************************
 * 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.CatalogSensor;
import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
import org.junit.AfterClass;
import org.junit.BeforeClass;

/**
 * Test class for CatalogSensorAttributeResource
 * 
 * @author Philipp Schweinbenz, science+computing AG Tuebingen (Atos SE)
 * @see EntityResourceIntegrationTest
 *
 */
public class CatalogSensorAttributeResourceIntegrationTest extends EntityResourceIntegrationTest {

	@BeforeClass
	public static void prepareTestData() {
		getLogger().debug("Preparing CatalogSensorAttributeResourceIntegrationTest");

		// prepare test data for creating the CatalogSensor
		CatalogSensorResourceIntegrationTest.prepareTestData();
		CatalogSensorResourceIntegrationTest.createEntity();

		// set up test data
		setContextClass(CatalogSensorAttributeResourceIntegrationTest.class);

		putTestDataValue(TESTDATA_RESOURCE_URI, "/catcomps/testequipment/"
				+ getTestDataValue(CatalogComponentTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
				+ "/catsensors/" + getTestDataValue(CatalogSensorResourceIntegrationTest.class, TESTDATA_ENTITY_ID)
				+ "/catsensorattrs");
		putTestDataValue(TESTDATA_ENTITY_NAME, "testCatSensorAttr");
		putTestDataValue(TESTDATA_ENTITY_TYPE, "CatalogAttribute");

		CatalogComponent catComp = ENTITY_FACTORY.createCatalogComponent(ContextType.TESTEQUIPMENT,
				getTestDataValue(CatalogComponentTEQResourceIntegrationTest.class, TESTDATA_ENTITY_NAME));
		ServiceUtils.getCore(catComp)
				.setID(getTestDataValue(CatalogComponentTEQResourceIntegrationTest.class, TESTDATA_ENTITY_ID));

		CatalogSensor catSensor = ENTITY_FACTORY.createCatalogSensor(
				getTestDataValue(CatalogComponentTEQResourceIntegrationTest.class, TESTDATA_ENTITY_NAME), catComp);
		ServiceUtils.getCore(catSensor)
				.setID(getTestDataValue(CatalogSensorResourceIntegrationTest.class, TESTDATA_ENTITY_ID));

		CatalogAttribute catAttr = ENTITY_FACTORY.createCatalogSensorAttribute(getTestDataValue(TESTDATA_ENTITY_NAME),
				ValueType.STRING, catSensor);
		putTestDataValue(TESTDATA_CREATE_JSON_BODY, toJson(catAttr));
	}

	@AfterClass
	public static void tearDownAfterClass() {
		setContextClass(CatalogSensorResourceIntegrationTest.class);
		CatalogSensorResourceIntegrationTest.deleteEntity();

		setContextClass(CatalogComponentTEQResourceIntegrationTest.class);
		CatalogComponentTEQResourceIntegrationTest.deleteEntity();
	}
}
