/**
 * Licensed 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.odf.core.test.configuration;

import java.util.Collections;

import org.apache.atlas.odf.api.settings.validation.EnumValidator;
import org.apache.atlas.odf.api.settings.validation.ValidationException;
import org.junit.Assert;
import org.junit.Test;

import org.apache.atlas.odf.core.ODFInternalFactory;
import org.apache.atlas.odf.api.ODFFactory;
import org.apache.atlas.odf.core.configuration.ConfigContainer;
import org.apache.atlas.odf.core.configuration.ConfigManager;
import org.apache.atlas.odf.core.configuration.ServiceValidator;
import org.apache.atlas.odf.api.discoveryservice.DiscoveryServiceManager;
import org.apache.atlas.odf.api.discoveryservice.DiscoveryServiceProperties;
import org.apache.atlas.odf.api.settings.validation.ImplementationValidator;
import org.apache.atlas.odf.api.settings.validation.NumberPositiveValidator;
import org.apache.atlas.odf.api.settings.validation.PropertyValidator;
import org.apache.atlas.odf.core.test.TimerTestBase;
import org.apache.atlas.odf.core.test.discoveryservice.TestAsyncDiscoveryServiceWritingAnnotations1;
import org.apache.atlas.odf.json.JSONUtils;

public class ValidationTests extends TimerTestBase {

	@Test
	public void testEnum() {
		String[] vals = new String[] { "test", "test2" };
		String correct = "test";
		String incorrect = "fail";

		Assert.assertTrue(validateTest(correct, new EnumValidator(vals)));
		Assert.assertFalse(validateTest(incorrect, new EnumValidator(vals)));
	}

	@Test
	public void testImplementation() {
		String correct = TestAsyncDiscoveryServiceWritingAnnotations1.class.getName();
		String incorrect = "dummyClass";
		Assert.assertTrue(validateTest(correct, new ImplementationValidator()));
		Assert.assertFalse(validateTest(incorrect, new ImplementationValidator()));
	}

	@Test
	public void testService() throws Exception {
		String s = "{\r\n" + 
				"			\"id\": \"asynctestservice\",\r\n" + 
				"			\"name\": \"Async test\",\r\n" + 
				"			\"description\": \"The async test service\",\r\n" + 
				"			\"endpoint\": {\r\n" + 
				"				\"runtimeName\": \"Java\",\r\n" + 
				"				\"className\": \"TestAsyncDiscoveryService1\"\r\n" +
				"			}\r\n" + 
				"		}";
		
		DiscoveryServiceProperties newService = JSONUtils.fromJSON(s, DiscoveryServiceProperties.class);
		DiscoveryServiceManager discoveryServicesManager = new ODFFactory().create().getDiscoveryServiceManager();
		//ODFConfig odfConfig = new ODFFactory().create(ODFConfiguration.class).getODFConfig();

		ConfigContainer new1 = new ConfigContainer();
		new1.setRegisteredServices(Collections.singletonList(newService));
		ConfigManager configManager = new ODFInternalFactory().create(ConfigManager.class);
		configManager.updateConfigContainer(new1);
		
		DiscoveryServiceProperties correct = discoveryServicesManager.getDiscoveryServicesProperties().get(0);
		Assert.assertEquals("asynctestservice", correct.getId());
		correct.setId("newId");
		DiscoveryServiceProperties incorrect = new DiscoveryServiceProperties();
		Assert.assertTrue(validateTest(correct, new ServiceValidator()));
		Assert.assertFalse(validateTest(incorrect, new ServiceValidator()));
	}

	@Test
	public void testNumber() {
		int correct = 5;
		int incorrect = -5;
		Assert.assertTrue(validateTest(correct, new NumberPositiveValidator()));
		Assert.assertFalse(validateTest(incorrect, new NumberPositiveValidator()));
	}

	private boolean validateTest(Object value, PropertyValidator validator) {
		try {
			validator.validate(null, value);
			return true;
		} catch (ValidationException ex) {
			return false;
		}
	}

}
