/********************************************************************************
 * 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.base.model.TestStep;
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.api.dflt.model.TemplateTestStep;
import org.eclipse.mdm.api.dflt.model.TemplateTestStepUsage;
import org.eclipse.mdm.businessobjects.utils.ServiceUtils;
import org.junit.AfterClass;
import org.junit.BeforeClass;

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

		// prepare test data for creating the parent {@Test}
		TestWithTemplateResourceIntegrationTest.prepareTestData();
		TestWithTemplateResourceIntegrationTest.createEntity();

		// prepare test data for creating the TestStep
		TemplateTestStepResourceIntegrationTest.prepareTestData();
		TemplateTestStepResourceIntegrationTest.createEntity();
		TemplateTestStepResourceIntegrationTest.patchEntity();

		// prepare test data for creating the linked templates
		TemplateTestStepUsageResourceIntegrationTest.prepareTestData();
		TemplateTestStepUsageResourceIntegrationTest.createEntity();

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

		putTestDataValue(TESTDATA_RESOURCE_URI, "/teststeps");
		putTestDataValue(TESTDATA_ENTITY_NAME, "testTestStep");
		putTestDataValue(TESTDATA_ENTITY_TYPE, "TestStep");

		Project project = ENTITY_FACTORY
				.createProject(getTestDataValue(ProjectResourceIntegrationTest.class, TESTDATA_ENTITY_NAME));
		Pool pool = ENTITY_FACTORY.createPool(getTestDataValue(PoolResourceIntegrationTest.class, TESTDATA_ENTITY_NAME),
				project);

		TemplateTest tplTest = ENTITY_FACTORY
				.createTemplateTest(getTestDataValue(TemplateTestResourceIntegrationTest.class, TESTDATA_ENTITY_NAME));

		TemplateTestStep tplTestStep = ENTITY_FACTORY.createTemplateTestStep(
				getTestDataValue(TemplateTestStepResourceIntegrationTest.class, TESTDATA_ENTITY_NAME));
		ServiceUtils.getCore(tplTestStep)
				.setID(getTestDataValue(TemplateTestStepResourceIntegrationTest.class, TESTDATA_ENTITY_ID));

		TemplateTestStepUsage tplTestStepUsage = ENTITY_FACTORY.createTemplateTestStepUsage(
				getTestDataValue(TemplateTestStepUsageResourceIntegrationTest.class, TESTDATA_ENTITY_NAME), tplTest,
				tplTestStep);

		ServiceUtils.getCore(tplTest).getChildrenStore().add(tplTestStepUsage);

		Test test = ENTITY_FACTORY.createTest(
				getTestDataValue(TestWithTemplateResourceIntegrationTest.class, TESTDATA_ENTITY_NAME),
				pool);
		ServiceUtils.getCore(test)
				.setID(getTestDataValue(TestWithTemplateResourceIntegrationTest.class, TESTDATA_ENTITY_ID));
		ServiceUtils.getCore(test).getMutableStore().set(tplTest);

		TestStep testStep = ENTITY_FACTORY.createTestStep(test, tplTestStep);

		// remove name from object as the creation method is
		// EntityFactory.createTestStep(Test, TemplateTest)
		testStep.setName(null);
		putTestDataValue(TESTDATA_CREATE_JSON_BODY, toJson(testStep));
	}

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

		// delete Templates
		setContextClass(TemplateTestStepUsageResourceIntegrationTest.class);
		TemplateTestStepUsageResourceIntegrationTest.tearDownAfterClass();
	}
}
