/*
* 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.common.screens.datamodeller.backend.server;
import java.util.Arrays;
import java.util.List;
import javax.enterprise.inject.Instance;
import org.guvnor.common.services.backend.metadata.MetadataServerSideService;
import org.guvnor.common.services.project.model.Package;
import org.guvnor.common.services.project.model.Project;
import org.guvnor.common.services.shared.metadata.model.Metadata;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.workbench.common.screens.datamodeller.backend.server.file.DataModelerCopyHelper;
import org.kie.workbench.common.screens.datamodeller.backend.server.helper.DataModelerRenameWorkaroundHelper;
import org.kie.workbench.common.screens.datamodeller.backend.server.helper.DataModelerSaveHelper;
import org.kie.workbench.common.services.datamodeller.core.DataObject;
import org.kie.workbench.common.services.datamodeller.core.impl.DataObjectImpl;
import org.kie.workbench.common.services.shared.project.KieProjectService;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;
import org.uberfire.backend.vfs.Path;
import org.uberfire.backend.vfs.PathFactory;
import org.uberfire.ext.editor.commons.service.CopyService;
import org.uberfire.ext.editor.commons.service.RenameService;
import org.uberfire.io.IOService;
import org.uberfire.java.nio.base.options.CommentedOption;
import org.uberfire.java.nio.file.FileSystem;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class DataModelerServiceTest {
private static final Path PATH = PathFactory.newPath( "Sample.java",
"default://project/src/main/java/old/package/Sample.java" );
private static final String NEW_NAME = "NewSample";
private static final String NEW_PACKAGE_NAME = "new.package";
private static final Path TARGET_DIRECTORY = PathFactory.newPath( "/",
"default://project/src/main/java/new/package" );
private static final String COMMENT = "comment";
@Mock
private DataModelerCopyHelper copyHelper;
@Mock
private CopyService copyService;
@Mock
private KieProjectService projectService;
@Mock
private IOService ioService;
@Mock
private DataModelerServiceHelper serviceHelper;
@Mock(name = "saveHelperInstance")
private Instance<DataModelerSaveHelper> saveHelperInstance;
@Mock(name = "renameHelperInstance")
private Instance<DataModelerRenameWorkaroundHelper> renameHelperInstance;
@Mock
private MetadataServerSideService metadataService;
@Mock
private RenameService renameService;
@Spy
@InjectMocks
private DataModelerServiceImpl dataModelerService;
@Test
public void copyToAnotherPackageTest() {
makeCopy( true );
verify( dataModelerService ).refactorClass( eq( PATH ),
eq( NEW_PACKAGE_NAME ),
eq( NEW_NAME ) );
verify( copyService ).copy( eq( PATH ),
eq( NEW_NAME ),
eq( TARGET_DIRECTORY ),
eq( COMMENT ) );
}
@Test
public void copyToAnotherPackageWithoutRefactorTest() {
makeCopy( false );
verify( dataModelerService,
never() ).refactorClass( eq( PATH ),
eq( NEW_PACKAGE_NAME ),
eq( NEW_NAME ) );
verify( copyService ).copy( eq( PATH ),
eq( NEW_NAME ),
eq( TARGET_DIRECTORY ),
eq( COMMENT ) );
}
private void makeCopy( boolean refactor ) {
dataModelerService.copy( PATH,
NEW_NAME,
NEW_PACKAGE_NAME,
TARGET_DIRECTORY,
COMMENT,
refactor );
}
@Test
public void saveSourcePackageNameChanged() {
testSaveSource( "newPackageName",
null );
}
@Test
public void saveSourceFileNameChanged() {
testSaveSource( null,
"newFileName" );
}
@Test
public void saveSourceBothPackageAndFileNameChanged() {
testSaveSource( "newPackageName",
"newFileName" );
}
@Test
public void saveSourceNoPackageAndFileNameChange() {
testSaveSource( null,
null );
}
private void testSaveSource( String newPackageName,
String newFileName ) {
Path dataObjectPath = PathFactory.newPath( "TestDataObject",
"file:///dataobjects/TestDataObject.java" );
Path srcPath = PathFactory.newPath( "src",
"file:///src" );
Package packageMock = mock( Package.class );
when( packageMock.getPackageMainSrcPath() ).thenReturn( srcPath );
when( serviceHelper.ensurePackageStructure( any( Project.class ),
anyString() ) ).thenReturn( packageMock );
DataModelerSaveHelper saveHelper = mock( DataModelerSaveHelper.class );
List<DataModelerSaveHelper> saveHelpers = Arrays.asList( saveHelper );
when( saveHelperInstance.iterator() ).thenReturn( saveHelpers.iterator() );
DataObject dataObject = new DataObjectImpl( "dataobjects",
"TestDataObject" );
dataModelerService.saveSource( "Source",
dataObjectPath,
dataObject,
mock( Metadata.class ),
"Commit message",
newPackageName,
newFileName );
verify( ioService,
times( 1 ) ).startBatch( any( FileSystem.class ) );
if ( newPackageName == null && newFileName == null ) {
verify( ioService,
times( 1 ) ).write( any( org.uberfire.java.nio.file.Path.class ),
anyString(),
anyMap(),
any( CommentedOption.class ) );
} else if ( newPackageName != null && newFileName != null ) {
verify( ioService,
times( 1 ) ).write( any( org.uberfire.java.nio.file.Path.class ),
anyString(),
anyMap(),
any( CommentedOption.class ) );
verify( ioService,
times( 1 ) ).move( any( org.uberfire.java.nio.file.Path.class ),
any( org.uberfire.java.nio.file.Path.class ),
any( CommentedOption.class ) );
} else if ( newPackageName != null ) {
verify( ioService,
times( 1 ) ).write( any( org.uberfire.java.nio.file.Path.class ),
anyString(),
anyMap(),
any( CommentedOption.class ) );
verify( ioService,
times( 1 ) ).move( any( org.uberfire.java.nio.file.Path.class ),
any( org.uberfire.java.nio.file.Path.class ),
any( CommentedOption.class ) );
} else {
verify( renameService,
times( 1 ) ).rename( any( Path.class ),
anyString(),
anyString() );
}
verify( saveHelper,
times( 1 ) ).postProcess( any( Path.class ),
any( Path.class ) );
verify( ioService,
times( 1 ) ).endBatch();
}
@Test
public void renameWorkaround() {
Path dataObjectPath = PathFactory.newPath( "TestDataObject",
"file:///dataobjects/TestDataObject.java" );
DataModelerRenameWorkaroundHelper renameHelper = mock( DataModelerRenameWorkaroundHelper.class );
List<DataModelerRenameWorkaroundHelper> renameHelpers = Arrays.asList( renameHelper );
when( renameHelperInstance.iterator() ).thenReturn( renameHelpers.iterator() );
dataModelerService.renameWorkaround( dataObjectPath,
"NewName",
"New content",
"Comment" );
verify( ioService,
times( 1 ) ).startBatch( any( FileSystem[].class ) );
verify( ioService,
times( 1 ) ).move( any( org.uberfire.java.nio.file.Path.class ),
any( org.uberfire.java.nio.file.Path.class ),
any( CommentedOption.class ) );
verify( renameHelper,
times( 1 ) ).postProcess( any( Path.class ),
any( Path.class ) );
verify( ioService,
times( 1 ) ).endBatch();
}
}