/********************************************************************************
 * 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.Test;
import org.eclipse.mdm.api.dflt.model.Pool;
import org.eclipse.mdm.api.dflt.model.Project;
import org.eclipse.mdm.api.dflt.model.TemplateTest;
import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
import org.junit.AfterClass;
import org.junit.BeforeClass;

/**
 * Test class for {@TestResource}.
 * 
 * @author Johannes Stamm, Peak Solution GmbH Nuernberg
 * @see EntityResourceIntegrationTest
 *
 */
public class TestWithTemplateResourceIntegrationTest extends EntityResourceIntegrationTest {
	@BeforeClass
	public static void prepareTestData() {
		getLogger().debug("Preparing TestResourceIntegrationTest");

		// prepare test data for creating the parent Pool
		PoolResourceIntegrationTest.prepareTestData();
		PoolResourceIntegrationTest.createEntity();
		// prepare test data for creating the linked TemplateTest
		TemplateTestResourceIntegrationTest.prepareTestData();
		TemplateTestResourceIntegrationTest.createEntity();

		// set up test data
		setContextClass(TestWithTemplateResourceIntegrationTest.class);

		putTestDataValue(TESTDATA_RESOURCE_URI, "/tests");
		putTestDataValue(TESTDATA_ENTITY_NAME, "testTest");
		putTestDataValue(TESTDATA_ENTITY_TYPE, "Test");

		Project project = ENTITY_FACTORY
				.createProject(getTestDataValue(ProjectResourceIntegrationTest.class, TESTDATA_ENTITY_NAME));

		Pool pool = ENTITY_FACTORY.createPool(getTestDataValue(PoolResourceIntegrationTest.class, TESTDATA_ENTITY_NAME),
				project);
		ServiceUtils.getCore(pool).setID(getTestDataValue(PoolResourceIntegrationTest.class, TESTDATA_ENTITY_ID));

		TemplateTest tplTest = ENTITY_FACTORY
				.createTemplateTest(getTestDataValue(TemplateTestResourceIntegrationTest.class, TESTDATA_ENTITY_NAME));
		ServiceUtils.getCore(tplTest)
				.setID(getTestDataValue(TemplateTestResourceIntegrationTest.class, TESTDATA_ENTITY_ID));

		Test test = ENTITY_FACTORY.createTest(getTestDataValue(TESTDATA_ENTITY_NAME), pool, tplTest);

		putTestDataValue(TESTDATA_CREATE_JSON_BODY, toJson(test));
	}

	@AfterClass
	public static void tearDownAfterClass() {
		// call tearDownAfterClass() of parent entity
		setContextClass(PoolResourceIntegrationTest.class);
		PoolResourceIntegrationTest.tearDownAfterClass();

		// delete Template
		setContextClass(TemplateTestResourceIntegrationTest.class);
		TemplateTestResourceIntegrationTest.deleteEntity();
	}
}
