/*
* Copyright 2017 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.validation;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import org.guvnor.common.services.shared.validation.model.ValidationMessage;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.workbench.common.screens.datamodeller.model.persistence.PersistenceDescriptorModel;
import org.kie.workbench.common.screens.datamodeller.model.persistence.PersistenceUnitModel;
import org.kie.workbench.common.screens.datamodeller.model.persistence.Property;
import org.kie.workbench.common.screens.datamodeller.model.persistence.TransactionType;
import org.kie.workbench.common.screens.datamodeller.validation.PersistenceDescriptorValidator;
import org.kie.workbench.common.services.backend.project.ProjectClassLoaderHelper;
import org.kie.workbench.common.services.shared.project.KieProject;
import org.kie.workbench.common.services.shared.project.KieProjectService;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.uberfire.backend.vfs.Path;
import static org.junit.Assert.*;
import static org.kie.workbench.common.screens.datamodeller.backend.server.validation.PersistenceDescriptorValidationMessages.newErrorMessage;
import static org.mockito.Mockito.when;
@RunWith( MockitoJUnitRunner.class )
public class PersistenceDescriptorValidatorTest {
private static final String VERSION = "version";
private static final String JTA_DATASOURCE = "datasource";
private static final String PERSISTENCE_UNIT_NAME = "persistenceUnitName";
private static final String PERSISTENCE_PROVIDER = "persistenceProvider";
private PersistenceDescriptorValidator validator;
@Mock
private KieProjectService projectService;
@Mock
private ProjectClassLoaderHelper classLoaderHelper;
@Mock
private Path path;
@Mock
private KieProject project;
private ClassLoader classLoader;
private PersistenceDescriptorModel descriptor;
@Before
public void setUp( ) {
validator = new PersistenceDescriptorValidatorImpl( projectService, classLoaderHelper );
descriptor = createValidDescriptor( );
classLoader = this.getClass( ).getClassLoader( );
when( projectService.resolveProject( path ) ).thenReturn( project );
when( classLoaderHelper.getProjectClassLoader( project ) ).thenReturn( classLoader );
}
@Test
public void testValidateValidDescriptor( ) {
List< ValidationMessage > result = validator.validate( path, descriptor );
assertTrue( result.isEmpty( ) );
}
@Test
public void testValidateInvalidProject( ) {
when( projectService.resolveProject( path ) ).thenReturn( null );
List< ValidationMessage > result = validator.validate( path, descriptor );
//no more errors are produced since the validations stops if the project is not found.
assertEquals( 1, result.size( ) );
ValidationMessage expectedMessage = newErrorMessage( PersistenceDescriptorValidationMessages.DESCRIPTOR_NOT_BELONG_TO_PROJECT_ID,
PersistenceDescriptorValidationMessages.DESCRIPTOR_NOT_BELONG_TO_PROJECT );
assertEquals( expectedMessage, result.get( 0 ) );
}
@Test
public void testValidateMissingPersistenceUnit( ) {
descriptor.setPersistenceUnit( null );
List< ValidationMessage > result = validator.validate( path, descriptor );
//no more errors are produced since the validation stops if the persistence unit is missing.
assertEquals( 1, result.size( ) );
ValidationMessage expectedMessage = newErrorMessage( PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_NOT_FOUND_ID,
PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_NOT_FOUND );
assertEquals( expectedMessage, result.get( 0 ) );
}
@Test
public void testValidateMissingPersistenceUnitName( ) {
descriptor.getPersistenceUnit( ).setName( null );
List< ValidationMessage > result = validator.validate( path, descriptor );
ValidationMessage expectedMessage;
//persistence unit name validation should fail
expectedMessage = newErrorMessage( PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_NAME_EMPTY_ID,
PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_NAME_EMPTY );
assertTrue( result.contains( expectedMessage ) );
}
@Test
public void testValidateMissingPersistenceProvider( ) {
descriptor.getPersistenceUnit( ).setProvider( null );
List< ValidationMessage > result = validator.validate( path, descriptor );
ValidationMessage expectedMessage;
//persistence provider validation should fail
expectedMessage = newErrorMessage( PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_PROVIDER_ID,
PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_PROVIDER_EMPTY );
assertTrue( result.contains( expectedMessage ) );
}
@Test
public void testValidateMissingTransactionType( ) {
descriptor.getPersistenceUnit( ).setTransactionType( null );
List< ValidationMessage > result = validator.validate( path, descriptor );
ValidationMessage expectedMessage;
//transaction type validation should fail
expectedMessage = newErrorMessage( PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_TRANSACTION_TYPE_EMPTY_ID,
PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_TRANSACTION_TYPE_EMPTY );
assertTrue( result.contains( expectedMessage ) );
}
@Test
public void testValidateMissingJtaDataSource( ) {
descriptor.getPersistenceUnit( ).setTransactionType( TransactionType.JTA );
descriptor.getPersistenceUnit( ).setJtaDataSource( null );
List< ValidationMessage > result = validator.validate( path, descriptor );
ValidationMessage expectedMessage;
//jta datasource validation should fail
expectedMessage = newErrorMessage( PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_JTA_DATASOURCE_EMPTY_ID,
PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_JTA_DATASOURCE_EMPTY );
assertTrue( result.contains( expectedMessage ) );
}
@Test
public void testValidateMissingNonJtaDataSource( ) {
descriptor.getPersistenceUnit( ).setTransactionType( TransactionType.RESOURCE_LOCAL );
descriptor.getPersistenceUnit( ).setNonJtaDataSource( null );
List< ValidationMessage > result = validator.validate( path, descriptor );
ValidationMessage expectedMessage;
//jta datasource validation should fail
expectedMessage = newErrorMessage( PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_NON_JTA_DATASOURCE_EMPTY_ID,
PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_NON_JTA_DATASOURCE_EMPTY );
assertTrue( result.contains( expectedMessage ) );
}
@Test
public void testValidateNonPersistableClass( ) {
//add a non persistable class
descriptor.getPersistenceUnit( ).getClasses( ).add( NonPersistableClass1.class.getName( ) );
List< ValidationMessage > result = validator.validate( path, descriptor );
ValidationMessage expectedMessage;
//validation for the non persistable class should fail.
expectedMessage = newErrorMessage( PersistenceDescriptorValidationMessages.CLASS_NOT_PERSISTABLE_ID,
MessageFormat.format( PersistenceDescriptorValidationMessages.CLASS_NOT_PERSISTABLE, NonPersistableClass1.class.getName( ) ), NonPersistableClass1.class.getName( ) );
assertTrue( result.contains( expectedMessage ) );
}
@Test
public void testValidatePropertyWithMissingName( ) {
//add a property with no name
descriptor.getPersistenceUnit( ).addProperty( new Property( null, "someValue" ) );
List< ValidationMessage > result = validator.validate( path, descriptor );
ValidationMessage expectedMessage;
//validation for the property with missing name should fail.
expectedMessage = newErrorMessage( PersistenceDescriptorValidationMessages.INDEXED_PROPERTY_NAME_EMPTY_ID,
MessageFormat.format( PersistenceDescriptorValidationMessages.INDEXED_PROPERTY_NAME_EMPTY, "3" ), "3" );
assertTrue( result.contains( expectedMessage ) );
}
@Test
public void testValidatePropertyWithMissingValue( ) {
//add a property with no name
descriptor.getPersistenceUnit( ).addProperty( new Property( "someName", null ) );
List< ValidationMessage > result = validator.validate( path, descriptor );
ValidationMessage expectedMessage;
//validation for the property with missing value should fail.
expectedMessage = PersistenceDescriptorValidationMessages.newWarningMessage( PersistenceDescriptorValidationMessages.PROPERTY_VALUE_EMPTY_ID,
MessageFormat.format( PersistenceDescriptorValidationMessages.PROPERTY_VALUE_EMPTY, "someName" ), "someName" );
assertTrue( result.contains( expectedMessage ) );
}
private PersistenceDescriptorModel createValidDescriptor( ) {
PersistenceDescriptorModel descriptor = new PersistenceDescriptorModel( );
descriptor.setVersion( VERSION );
PersistenceUnitModel unit = new PersistenceUnitModel( );
descriptor.setPersistenceUnit( unit );
unit.setJtaDataSource( JTA_DATASOURCE );
unit.setName( PERSISTENCE_UNIT_NAME );
unit.setProvider( PERSISTENCE_PROVIDER );
unit.setTransactionType( TransactionType.JTA );
List< Property > properties = new ArrayList<>( );
properties.add( new Property( "name1", "value1" ) );
properties.add( new Property( "name2", "value2" ) );
unit.setProperties( properties );
List< String > classes = new ArrayList<>( );
classes.add( PersistableClass1.class.getName( ) );
classes.add( PersistableClass2.class.getName( ) );
classes.add( PersistableClass3.class.getName( ) );
descriptor.getPersistenceUnit( ).setClasses( classes );
return descriptor;
}
}