/* * Copyright 2016 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ package org.robotframework.ide.eclipse.main.plugin.project.build.validation; import static com.google.common.collect.Lists.newArrayList; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Optional; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.rf.ide.core.executor.SuiteExecutor; import org.rf.ide.core.project.RobotProjectConfig.ReferencedLibrary; import org.rf.ide.core.testdata.model.RobotVersion; import org.rf.ide.core.testdata.model.search.keyword.KeywordScope; import org.rf.ide.core.testdata.model.table.testcases.TestCase; import org.rf.ide.core.validation.ProblemPosition; import org.robotframework.ide.eclipse.main.plugin.mockmodel.RobotSuiteFileCreator; import org.robotframework.ide.eclipse.main.plugin.model.RobotCasesSection; import org.robotframework.ide.eclipse.main.plugin.model.RobotModel; import org.robotframework.ide.eclipse.main.plugin.model.RobotSuiteFile; import org.robotframework.ide.eclipse.main.plugin.model.locators.AccessibleKeywordsEntities.AccessibleKeywordsCollector; import org.robotframework.ide.eclipse.main.plugin.model.locators.KeywordEntity; import org.robotframework.ide.eclipse.main.plugin.project.build.causes.ArgumentProblem; import org.robotframework.ide.eclipse.main.plugin.project.build.causes.TestCasesProblem; import org.robotframework.ide.eclipse.main.plugin.project.build.validation.FileValidationContext.ValidationKeywordEntity; import org.robotframework.ide.eclipse.main.plugin.project.build.validation.MockReporter.Problem; import org.robotframework.ide.eclipse.main.plugin.project.library.ArgumentsDescriptor; import org.robotframework.ide.eclipse.main.plugin.project.library.LibrarySpecification; import com.google.common.collect.Maps; import com.google.common.collect.Range; public class TestCaseSettingsValidatorTest { private MockReporter reporter; @Before public void beforeTest() { reporter = new MockReporter(); } @Test public void unkownSettingsAreReported() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [SomeSetting]") .build(); final FileValidationContext context = prepareContext(); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).containsOnly( new Problem(TestCasesProblem.UNKNOWN_TEST_CASE_SETTING, new ProblemPosition(3, Range.closed(26, 39)))); } @Test public void emptyTagsSettingIsReported() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Tags]") .build(); final FileValidationContext context = prepareContext(); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).containsOnly( new Problem(TestCasesProblem.EMPTY_CASE_SETTING, new ProblemPosition(3, Range.closed(26, 32)))); } @Test public void nothingIsReported_whenThereIsATagDefined() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Tags] tag") .build(); final FileValidationContext context = prepareContext(); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).isEmpty(); } @Ignore @Test public void duplicatedTagsAreReported() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Tags] tag1") .appendLine(" [Tags] tag2") .build(); final FileValidationContext context = prepareContext(); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).containsOnly( new Problem(TestCasesProblem.DUPLICATED_CASE_SETTING, new ProblemPosition(3, Range.closed(26, 32))), new Problem(TestCasesProblem.DUPLICATED_CASE_SETTING, new ProblemPosition(4, Range.closed(43, 49)))); } @Test public void emptyDocumentationSettingIsReported() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Documentation]") .build(); final FileValidationContext context = prepareContext(); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).containsOnly( new Problem(TestCasesProblem.EMPTY_CASE_SETTING, new ProblemPosition(3, Range.closed(26, 41)))); } @Test public void nothingIsReported_whenThereIsADocuDefined() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Documentation] doc") .build(); final FileValidationContext context = prepareContext(); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).isEmpty(); } @Ignore @Test public void duplicatedDocumentationsAreReported() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Documentation] tag1") .appendLine(" [Documentation] tag2") .build(); final FileValidationContext context = prepareContext(); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).containsOnly( new Problem(TestCasesProblem.DUPLICATED_CASE_SETTING, new ProblemPosition(3, Range.closed(26, 41))), new Problem(TestCasesProblem.DUPLICATED_CASE_SETTING, new ProblemPosition(4, Range.closed(52, 67)))); } @Test public void emptyTimeoutSettingIsReported() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Timeout]") .build(); final FileValidationContext context = prepareContext(); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).containsOnly( new Problem(TestCasesProblem.EMPTY_CASE_SETTING, new ProblemPosition(3, Range.closed(26, 35)))); } @Test public void nothingIsReported_whenThereIsATimeoutDefined() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Timeout] 1") .build(); final FileValidationContext context = prepareContext(); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).isEmpty(); } @Ignore @Test public void duplicatedTimeoutsAreReported() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Timeout] 1") .appendLine(" [Timeout] 2") .build(); final FileValidationContext context = prepareContext(); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).containsOnly( new Problem(TestCasesProblem.DUPLICATED_CASE_SETTING, new ProblemPosition(3, Range.closed(26, 35))), new Problem(TestCasesProblem.DUPLICATED_CASE_SETTING, new ProblemPosition(4, Range.closed(43, 52)))); } @Test public void emptyTemplateSettingIsReported() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Template]") .build(); final FileValidationContext context = prepareContext(); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).containsOnly( new Problem(TestCasesProblem.EMPTY_CASE_SETTING, new ProblemPosition(3, Range.closed(26, 36)))); } @Test public void nothingIsReported_whenThereIsATemplateDefined() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Template] Log") .build(); final FileValidationContext context = prepareContext(); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).isEmpty(); } @Test public void duplicatedTemplatesAreReported() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Template] Log") .appendLine(" [Template] Log") .build(); final FileValidationContext context = prepareContext(); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).containsOnly( new Problem(TestCasesProblem.DUPLICATED_CASE_SETTING, new ProblemPosition(3, Range.closed(26, 36))), new Problem(TestCasesProblem.DUPLICATED_CASE_SETTING, new ProblemPosition(4, Range.closed(46, 56)))); } @Test public void emptySetupSettingIsReported() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Setup]") .build(); final FileValidationContext context = prepareContext(); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).containsOnly( new Problem(TestCasesProblem.EMPTY_CASE_SETTING, new ProblemPosition(3, Range.closed(26, 33)))); } @Test public void nothingIsReported_whenThereIsASetupDefined() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Setup] keyword") .build(); final Map<String, Collection<KeywordEntity>> keywords = new HashMap<>(); keywords.put("keyword", newArrayList(newValidationKeywordEntity(KeywordScope.LOCAL, "file", "keyword", new Path("file")))); final FileValidationContext context = prepareContext(keywords); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).isEmpty(); } @Ignore @Test public void duplicatedSetupsAreReported() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Setup] keyword") .appendLine(" [Setup] keyword") .build(); final Map<String, Collection<KeywordEntity>> keywords = new HashMap<>(); keywords.put("keyword", newArrayList(newValidationKeywordEntity(KeywordScope.LOCAL, "file", "keyword", new Path("file")))); final FileValidationContext context = prepareContext(keywords); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).containsOnly( new Problem(TestCasesProblem.DUPLICATED_CASE_SETTING, new ProblemPosition(3, Range.closed(26, 33))), new Problem(TestCasesProblem.DUPLICATED_CASE_SETTING, new ProblemPosition(4, Range.closed(49, 56)))); } @Test public void setupArgumentsProblemsAreReported() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Setup] keyword") .build(); final Map<String, Collection<KeywordEntity>> keywords = new HashMap<>(); keywords.put("keyword", newArrayList(newValidationKeywordEntity(KeywordScope.LOCAL, "file", "keyword", new Path("file"), "x"))); final FileValidationContext context = prepareContext(keywords); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).containsOnly(new Problem( ArgumentProblem.INVALID_NUMBER_OF_PARAMETERS, new ProblemPosition(3, Range.closed(37, 44)))); } @Test public void emptyTeardownSettingIsReported() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Teardown]") .build(); final FileValidationContext context = prepareContext(); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).containsOnly( new Problem(TestCasesProblem.EMPTY_CASE_SETTING, new ProblemPosition(3, Range.closed(26, 36)))); } @Test public void nothingIsReported_whenThereIsATeardownDefined() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Teardown] keyword") .build(); final Map<String, Collection<KeywordEntity>> keywords = new HashMap<>(); keywords.put("keyword", newArrayList(newValidationKeywordEntity(KeywordScope.LOCAL, "file", "keyword", new Path("file")))); final FileValidationContext context = prepareContext(keywords); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).isEmpty(); } @Ignore @Test public void duplicatedTeardownsAreReported() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Teardown] keyword") .appendLine(" [Teardown] keyword") .build(); final Map<String, Collection<KeywordEntity>> keywords = new HashMap<>(); keywords.put("keyword", newArrayList(newValidationKeywordEntity(KeywordScope.LOCAL, "file", "keyword", new Path("file")))); final FileValidationContext context = prepareContext(keywords); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).containsOnly( new Problem(TestCasesProblem.DUPLICATED_CASE_SETTING, new ProblemPosition(3, Range.closed(26, 36))), new Problem(TestCasesProblem.DUPLICATED_CASE_SETTING, new ProblemPosition(4, Range.closed(52, 62)))); } @Test public void teardownArgumentsProblemsAreReported() throws CoreException { final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Test Cases ***") .appendLine("case") .appendLine(" [Teardown] keyword") .build(); final Map<String, Collection<KeywordEntity>> keywords = new HashMap<>(); keywords.put("keyword", newArrayList(newValidationKeywordEntity(KeywordScope.LOCAL, "file", "keyword", new Path("file"), "x"))); final FileValidationContext context = prepareContext(keywords); final TestCaseSettingsValidator validator = new TestCaseSettingsValidator(context, getTestCase(file), reporter); validator.validate(null); assertThat(reporter.getReportedProblems()).containsOnly(new Problem( ArgumentProblem.INVALID_NUMBER_OF_PARAMETERS, new ProblemPosition(3, Range.closed(40, 47)))); } private static KeywordEntity newValidationKeywordEntity(final KeywordScope scope, final String sourceName, final String name, final IPath exposingPath, final String... args) { return new ValidationKeywordEntity(scope, sourceName, name, "", false, exposingPath, 0, ArgumentsDescriptor.createDescriptor(args)); } private static TestCase getTestCase(final RobotSuiteFile file) { final Optional<RobotCasesSection> section = file.findSection(RobotCasesSection.class); return section.get().getChildren().get(0).getLinkedElement(); } private static FileValidationContext prepareContext() { return prepareContext(new HashMap<String, Collection<KeywordEntity>>()); } private static FileValidationContext prepareContext(final Map<String, Collection<KeywordEntity>> map) { return prepareContext(createKeywordsCollector(map)); } private static FileValidationContext prepareContext(final AccessibleKeywordsCollector collector) { final ValidationContext parentContext = new ValidationContext(new RobotModel(), RobotVersion.from("0.0"), SuiteExecutor.Python, Maps.<String, LibrarySpecification> newHashMap(), Maps.<ReferencedLibrary, LibrarySpecification> newHashMap()); final FileValidationContext context = new FileValidationContext(parentContext, mock(IFile.class), collector, new HashSet<String>()); return context; } private static AccessibleKeywordsCollector createKeywordsCollector( final Map<String, Collection<KeywordEntity>> map) { return new AccessibleKeywordsCollector() { @Override public Map<String, Collection<KeywordEntity>> collect() { return map; } }; } }