/*******************************************************************************
* (c) Copyright 2016 Hewlett-Packard Development Company, L.P.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Apache License v2.0 which accompany this distribution.
*
* The Apache License is available at
* http://www.apache.org/licenses/LICENSE-2.0
*
*******************************************************************************/
package io.cloudslang.lang.cli.utils;
import io.cloudslang.lang.api.Slang;
import io.cloudslang.lang.api.SlangImpl;
import io.cloudslang.lang.compiler.MetadataExtractor;
import io.cloudslang.lang.compiler.MetadataExtractorImpl;
import io.cloudslang.lang.compiler.SlangCompiler;
import io.cloudslang.lang.compiler.modeller.MetadataModeller;
import io.cloudslang.lang.compiler.modeller.MetadataModellerImpl;
import io.cloudslang.lang.compiler.parser.MetadataParser;
import io.cloudslang.lang.compiler.parser.utils.MetadataValidator;
import io.cloudslang.lang.compiler.parser.utils.MetadataValidatorImpl;
import io.cloudslang.lang.compiler.parser.utils.ParserExceptionHandler;
import io.cloudslang.score.api.Score;
import io.cloudslang.score.events.EventBus;
import java.io.File;
import java.net.URI;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.yaml.snakeyaml.Yaml;
import static org.mockito.Mockito.mock;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {MetadataHelperTest.Config.class})
public class MetadataHelperTest {
private static final String DESCRIPTION_AND_PREREQUISITES = "description: " + System.lineSeparator() +
" Parses the given JSON input to retrieve the" + System.lineSeparator() +
" corresponding value addressed by the json_path input." + System.lineSeparator() +
"prerequisites: jenkinsapi Python module";
private static final String JSON_INPUT_VALUE =
"json_input: JSON data input - Example: '{\"k1\": {\"k2\": [\"v1\", \"v2\"]}}'";
private static final String PREREQUISITES_MISSING = "description: " + System.lineSeparator() +
" Adds or replaces a value to the given JSON at the keys or indices represented by the json_path." +
System.lineSeparator() +
" If the last key in the path does not exist, the key is added as well." +
System.lineSeparator() +
"inputs: ";
private static final String RESULTS = "results:";
private static final String SOME_OTHER_RESULT = "SOME_OTHER_RESULT";
@Autowired
private MetadataHelper metadataHelper;
@Test(expected = IllegalArgumentException.class)
public void testFileNull() throws Exception {
metadataHelper.extractMetadata(null);
}
@Test(expected = IllegalArgumentException.class)
public void testFilePathWrong() throws Exception {
metadataHelper.extractMetadata(new File("www"));
}
@Test
public void testPrettyPrint() throws Exception {
URI flowFilePath = getClass().getResource("/metadata/metadata.sl").toURI();
String metadataToPrint = metadataHelper.extractMetadata(new File(flowFilePath));
Assert.assertNotNull(metadataToPrint);
Assert.assertFalse(metadataToPrint.contains("io.cloudslang.lang.compiler.modeller.model.Metadata"));
Assert.assertTrue(metadataToPrint.contains(DESCRIPTION_AND_PREREQUISITES));
Assert.assertTrue(metadataToPrint.contains(SOME_OTHER_RESULT));
Assert.assertFalse(metadataToPrint.contains(SOME_OTHER_RESULT + ":"));
}
@Test
public void testPrettyPrintSingleQuotes() throws Exception {
URI flowFilePath = getClass().getResource("/metadata/add_value.sl").toURI();
String metadataToPrint = metadataHelper.extractMetadata(new File(flowFilePath));
Assert.assertNotNull(metadataToPrint);
Assert.assertFalse(metadataToPrint.contains("io.cloudslang.lang.compiler.modeller.model.Metadata"));
Assert.assertTrue(metadataToPrint.contains(JSON_INPUT_VALUE));
Assert.assertTrue(metadataToPrint.contains(PREREQUISITES_MISSING));
Assert.assertFalse(metadataToPrint.contains(RESULTS));
}
@Test
public void testPrettyPrintForEmptyDescription() throws Exception {
URI flowFilePath = getClass().getResource("/metadata/metadata_full_description_missing.sl").toURI();
String metadataToPrint = metadataHelper.extractMetadata(new File(flowFilePath));
Assert.assertNotNull(metadataToPrint);
Assert.assertTrue(metadataToPrint.contains("No metadata"));
}
@Configuration
static class Config {
@Bean
public Slang slang() {
return new SlangImpl();
}
@Bean
public MetadataHelper metadataHelper() {
return new MetadataHelperImpl();
}
@Bean
public Yaml yaml() {
return new Yaml();
}
@Bean
public SlangCompiler compiler() {
return mock(SlangCompiler.class);
}
@Bean
public Score score() {
return mock(Score.class);
}
@Bean
public EventBus eventBus() {
return mock(EventBus.class);
}
@Bean
public MetadataExtractor metadataExtractor() {
MetadataExtractorImpl metadataExtractor = new MetadataExtractorImpl();
metadataExtractor.setMetadataModeller(metadataModeller());
metadataExtractor.setMetadataValidator(metadataValidator());
metadataExtractor.setMetadataParser(metadataParser());
return metadataExtractor;
}
@Bean
public MetadataModeller metadataModeller() {
return new MetadataModellerImpl();
}
@Bean
public MetadataParser metadataParser() {
MetadataParser metadataParser = new MetadataParser();
metadataParser.setParserExceptionHandler(parserExceptionHandler());
return metadataParser;
}
@Bean
public MetadataValidator metadataValidator() {
return new MetadataValidatorImpl();
}
@Bean
public ParserExceptionHandler parserExceptionHandler() {
return new ParserExceptionHandler();
}
}
}