/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* 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.kie.workbench.screens.workbench.backend;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.guvnor.common.services.project.model.POM;
import org.guvnor.structure.organizationalunit.OrganizationalUnit;
import org.guvnor.structure.organizationalunit.OrganizationalUnitService;
import org.guvnor.structure.repositories.Repository;
import org.guvnor.structure.repositories.RepositoryEnvironmentConfigurations;
import org.guvnor.structure.repositories.RepositoryService;
import org.guvnor.structure.server.config.ConfigGroup;
import org.guvnor.structure.server.config.ConfigItem;
import org.guvnor.structure.server.config.ConfigType;
import org.guvnor.structure.server.config.ConfigurationFactory;
import org.guvnor.structure.server.config.ConfigurationService;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.kie.workbench.common.services.shared.project.KieProjectService;
import org.uberfire.backend.server.util.Paths;
import org.uberfire.backend.vfs.Path;
import org.uberfire.backend.vfs.PathFactory;
import org.uberfire.io.IOService;
import org.uberfire.java.nio.file.FileSystem;
import org.uberfire.mocks.FileSystemTestingUtils;
import static org.mockito.Mockito.*;
public class BaseAppSetupTest {
private FileSystemTestingUtils fileSystemTestingUtils = new FileSystemTestingUtils();
protected IOService ioService;
protected RepositoryService repositoryService;
protected OrganizationalUnitService organizationalUnitService;
protected KieProjectService projectService;
protected ConfigurationService configurationService;
protected ConfigurationFactory configurationFactory;
private Repository repository;
private OrganizationalUnit organizationalUnit;
private FileSystem fileSystem;
private BaseAppSetup baseAppSetup;
private Map<String, ConfigItem<String>> configItemsByName;
@Before
public void setup() throws IOException {
fileSystemTestingUtils.setup();
ioService = spy( fileSystemTestingUtils.getIoService() );
fileSystem = fileSystemTestingUtils.getFileSystem();
repositoryService = mock( RepositoryService.class );
organizationalUnitService = mock( OrganizationalUnitService.class );
projectService = mock( KieProjectService.class );
configurationService = mock( ConfigurationService.class );
configurationFactory = mock( ConfigurationFactory.class );
repository = mock( Repository.class );
organizationalUnit = mock( OrganizationalUnit.class );
baseAppSetup = spy( new BaseAppSetup( ioService,
repositoryService,
organizationalUnitService,
projectService,
configurationService,
configurationFactory ) {} );
mockConfigurations();
mockRepository();
mockOrganizationalUnitService();
mockIoService();
}
@After
public void cleanup() {
fileSystemTestingUtils.cleanup();
}
@Test
public void createNonexistentRepositoryTest() {
baseAppSetup.createRepository( "nonexistentRepository", "scheme", "origin", "user", "password", organizationalUnit );
verify( repositoryService ).createRepository( anyString(), anyString(), any( RepositoryEnvironmentConfigurations.class ) );
verify( organizationalUnitService ).addRepository( eq( organizationalUnit ), eq( repository ) );
}
@Test
public void createExistentRepositoryTest() {
baseAppSetup.createRepository( "existentRepository", "scheme", "origin", "user", "password", organizationalUnit );
verify( repositoryService, never() ).createRepository( anyString(), anyString(), any( RepositoryEnvironmentConfigurations.class ) );
verify( organizationalUnitService, never() ).addRepository( eq( organizationalUnit ), eq( repository ) );
}
@Test
public void createNonexistentOrganizationalUnitTest() {
baseAppSetup.createOU( repository, "nonexistentOrganizationalUnit", "ouOwner" );
verify( organizationalUnitService ).createOrganizationalUnit( anyString(), anyString(), anyString(), anyCollectionOf( Repository.class ) );
}
@Test
public void createExistentOrganizationalUnitTest() {
baseAppSetup.createOU( repository, "existentOrganizationalUnit", "ouOwner" );
verify( organizationalUnitService, never() ).createOrganizationalUnit( anyString(), anyString(), anyString(), anyCollectionOf( Repository.class ) );
}
@Test
public void createNonexistentProjectTest() {
baseAppSetup.createProject( repository, "org.kie", "nonexistentProject", "1.0.0" );
verify( projectService ).newProject( any( Path.class ), any( POM.class ), anyString() );
}
@Test
public void createNonexistentProjectInNullRepositoryTest() {
baseAppSetup.createProject( null, "org.kie", "nonexistentProject", "1.0.0" );
verify( projectService, never() ).newProject( any( Path.class ), any( POM.class ), anyString() );
}
@Test
public void createExistentProjectTest() {
baseAppSetup.createProject( repository, "org.kie", "existentProject", "1.0.0" );
verify( projectService, never() ).newProject( any( Path.class ), any( POM.class ), anyString() );
}
@Test
public void loadExampleRepositoriesTest() throws IOException {
final java.nio.file.Path repositoriesRoot = Files.createTempDirectory( new File( "repositoriesRoot" ).getPath() );
final java.nio.file.Path repo1Path = Files.createTempDirectory( repositoriesRoot, "repo1" );
final java.nio.file.Path repo2Path = Files.createTempDirectory( repositoriesRoot, "repo2" );
baseAppSetup.loadExampleRepositories( repositoriesRoot.toFile().getAbsolutePath(), "existentOrganizationalUnit", "ouOwner", BaseAppSetup.GIT_SCHEME );
verify( baseAppSetup ).createOU( null, "existentOrganizationalUnit", "ouOwner" );
verify( baseAppSetup ).createRepository( eq( repo1Path.toFile().getName() ), eq( BaseAppSetup.GIT_SCHEME ), eq( repo1Path.toFile().getAbsolutePath() ), eq( organizationalUnit ) );
verify( baseAppSetup ).createRepository( eq( repo2Path.toFile().getName() ), eq( BaseAppSetup.GIT_SCHEME ), eq( repo2Path.toFile().getAbsolutePath() ), eq( organizationalUnit ) );
}
@Test
public void setupDefinedConfigurationGroupTest() {
final ConfigType configType = ConfigType.GLOBAL;
final String configGroupName = BaseAppSetup.GLOBAL_SETTINGS;
// Existent configs to be checked
final ConfigGroup existentConfigGroup = setupPredefinedGlobalConfiguration();
List<ConfigGroup> definedConfigGroups = new ArrayList<>( 1 );
definedConfigGroups.add( existentConfigGroup );
doReturn( definedConfigGroups ).when( configurationService ).getConfiguration( eq( ConfigType.GLOBAL ) );
final ConfigItem<String> existentDroolsDefaultLanguageConfigItem = configItemsByName.get( "drools.defaultlanguage" );
final ConfigItem<String> existentSupportRuntimeDeployConfigItem = configItemsByName.get( "support.runtime.deploy" );
// To update
final ConfigItem<String> droolsDefaultLanguageConfigItem = new ConfigItem<>();
droolsDefaultLanguageConfigItem.setName( "drools.defaultlanguage" );
droolsDefaultLanguageConfigItem.setValue( "en" );
// To create
final ConfigItem<String> droolsDefaultCountryConfigItem = new ConfigItem<>();
droolsDefaultCountryConfigItem.setName( "drools.defaultcountry" );
droolsDefaultCountryConfigItem.setValue( "US" );
// To do nothing
final ConfigItem<String> supportRuntimeDeployConfigItem = new ConfigItem<>();
supportRuntimeDeployConfigItem.setName( "support.runtime.deploy" );
supportRuntimeDeployConfigItem.setValue( "true" );
baseAppSetup.setupConfigurationGroup( configType,
configGroupName,
null,
droolsDefaultLanguageConfigItem,
droolsDefaultCountryConfigItem,
supportRuntimeDeployConfigItem );
verify( configurationService, never() ).addConfiguration( any( ConfigGroup.class ) );
verify( configurationService, times( 2 ) ).updateConfiguration( existentConfigGroup );
verify( existentConfigGroup, never() ).addConfigItem( droolsDefaultLanguageConfigItem );
verify( existentConfigGroup ).addConfigItem( droolsDefaultCountryConfigItem ); // new config item
verify( existentConfigGroup, never() ).addConfigItem( supportRuntimeDeployConfigItem );
verify( existentDroolsDefaultLanguageConfigItem ).setValue( droolsDefaultLanguageConfigItem.getValue() ); // updated config item
verify( existentSupportRuntimeDeployConfigItem, never() ).setValue( anyString() );
}
@Test
public void setupUndefinedConfigurationGroupTest() {
doReturn( new ArrayList<>() ).when( configurationService ).getConfiguration( eq( ConfigType.GLOBAL ) );
final ConfigType configType = ConfigType.GLOBAL;
final String configGroupName = BaseAppSetup.GLOBAL_SETTINGS;
final ConfigGroup configGroup = setupPredefinedGlobalConfiguration();
baseAppSetup.setupConfigurationGroup( configType,
configGroupName,
configGroup );
verify( configurationService ).addConfiguration( any( ConfigGroup.class ) );
verify( configurationService, never() ).updateConfiguration( any( ConfigGroup.class ) );
}
private ConfigGroup setupPredefinedGlobalConfiguration() {
ConfigItem<String> droolsDefaultLanguageConfigItem = new ConfigItem<>();
droolsDefaultLanguageConfigItem.setName( "drools.defaultlanguage" );
droolsDefaultLanguageConfigItem.setValue( "pt" );
droolsDefaultLanguageConfigItem = spy( droolsDefaultLanguageConfigItem );
ConfigItem<String> supportRuntimeDeployConfigItem = new ConfigItem<>();
supportRuntimeDeployConfigItem.setName( "support.runtime.deploy" );
supportRuntimeDeployConfigItem.setValue( "true" );
supportRuntimeDeployConfigItem = spy( supportRuntimeDeployConfigItem );
configItemsByName = new HashMap<>( 2 );
configItemsByName.put( "drools.defaultlanguage", droolsDefaultLanguageConfigItem );
configItemsByName.put( "support.runtime.deploy", supportRuntimeDeployConfigItem );
final ConfigGroup group = spy( configurationFactory.newConfigGroup( ConfigType.GLOBAL,
BaseAppSetup.GLOBAL_SETTINGS,
"" ) );
group.setName( BaseAppSetup.GLOBAL_SETTINGS );
group.addConfigItem( droolsDefaultLanguageConfigItem );
group.addConfigItem( supportRuntimeDeployConfigItem );
return group;
}
private void mockConfigurations() {
//doReturn( new ArrayList<ConfigGroup>() ).when( configurationService ).getConfiguration( any( ConfigType.class ) );
doReturn( true ).when( configurationService ).updateConfiguration( any( ConfigGroup.class ) );
doReturn( true ).when( configurationService ).addConfiguration( any( ConfigGroup.class ) );
doReturn( new ConfigGroup() ).when( configurationFactory ).newConfigGroup( any( ConfigType.class ), anyString(), anyString() );
}
private void mockRepository() {
doReturn( repository ).when( repositoryService ).createRepository( anyString(), anyString(), any( RepositoryEnvironmentConfigurations.class ) );
doReturn( repository ).when( repositoryService ).getRepository( eq( "existentRepository" ) );
doReturn( "git://amend-repo-test" ).when( repository ).getUri();
}
private void mockOrganizationalUnitService() {
doReturn( organizationalUnit ).when( organizationalUnitService ).getOrganizationalUnit( eq( "existentOrganizationalUnit" ) );
}
private void mockIoService() {
final String artifact = "existentProject";
final String uri = repository.getUri() + fileSystem.getSeparator() + artifact;
final Path path = PathFactory.newPath( artifact, uri );
doReturn( fileSystem ).when( ioService ).getFileSystem( any( URI.class ) );
doReturn( Paths.convert( path ) ).when( ioService ).get( eq( uri ) );
doReturn( true ).when( ioService ).exists( eq( Paths.convert( path ) ) );
}
}