/******************************************************************************* * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * *******************************************************************************/ package com.liferay.ide.portlet.ui.tests; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertNotEquals; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; import org.junit.Before; import org.junit.Test; import com.liferay.ide.portlet.core.jsf.INewJSFPortletClassDataModelProperties; import com.liferay.ide.portlet.ui.jsf.NewJSFPortletWizard; import com.liferay.ide.project.core.model.PluginType; import com.liferay.ide.project.ui.IvyUtil; /** * @author Li Lu */ @SuppressWarnings( "restriction" ) public class NewJSFPortletWizardTests extends PortletUITestBase implements INewJSFPortletClassDataModelProperties { private IProject project; IDataModel dataModel; NewJSFPortletWizard wizard; @Before public void createPortletProject() throws Exception { if( shouldSkipBundleTests() )return; project = createProject( "jsf-portlet-project-test", PluginType.portlet, "jsf" ); boolean ivyNature = project.hasNature( "org.apache.ivyde.eclipse.ivynature" ); if( ivyNature == false ) { IvyUtil.configureIvyProject( project, new NullProgressMonitor() ); } wizard = new NewJSFPortletWizard(); dataModel = wizard.getDataModel(); dataModel.setProperty( PROJECT_NAME, project.getName() ); dataModel.setProperty( TARGET_PROJECT, project.getName() ); } @Test public void testContentDefaultValues() throws Exception { // check default values page 1 dataModel.setProperty( PROJECT_NAME, project.getName() ); assertEquals( "\\" + project.getName() + "\\docroot\\WEB-INF\\src", dataModel.getDefaultProperty( SOURCE_FOLDER ) ); assertEquals( "javax.portlet.faces.GenericFacesPortlet", dataModel.getDefaultProperty( JSF_PORTLET_CLASS ) ); // page2 assertEquals( "new-jsf", dataModel.getDefaultProperty( PORTLET_NAME ) ); assertEquals( "New Jsf", dataModel.getDefaultProperty( DISPLAY_NAME ) ); assertEquals( "New Jsf", dataModel.getDefaultProperty( TITLE ) ); assertEquals( true, dataModel.getDefaultProperty( VIEW_MODE ) ); assertNotEquals( false, dataModel.getDefaultProperty( EDIT_MODE ) ); assertNotEquals( false, dataModel.getDefaultProperty( HELP_MODE ) ); assertEquals( true, dataModel.getDefaultProperty( CREATE_JSPS ) ); assertEquals( "/WEB-INF/views/new-jsf", dataModel.getDefaultProperty( CREATE_JSPS_FOLDER ) ); assertEquals( true, dataModel.getDefaultProperty( STANDARD_JSF ) ); assertEquals( false, dataModel.getDefaultProperty( ICE_FACES ) ); assertEquals( false, dataModel.getDefaultProperty( LIFERAY_FACES_ALLOY ) ); assertEquals( false, dataModel.getDefaultProperty( PRIME_FACES ) ); assertEquals( false, dataModel.getDefaultProperty( RICH_FACES ) ); // page3 assertEquals( "/icon.png", dataModel.getDefaultProperty( ICON_FILE ) ); assertEquals( false, dataModel.getDefaultProperty( ALLOW_MULTIPLE ) ); assertEquals( "/css/main.css", dataModel.getDefaultProperty( CSS_FILE ) ); assertEquals( "/js/main.js", dataModel.getDefaultProperty( JAVASCRIPT_FILE ) ); assertEquals( "new-jsf-portlet", dataModel.getDefaultProperty( CSS_CLASS_WRAPPER ) ); assertEquals( "category.sample", dataModel.getDefaultProperty( CATEGORY ) ); assertNotEquals( true, dataModel.getDefaultProperty( ADD_TO_CONTROL_PANEL ) ); assertEquals( "category.my", dataModel.getDefaultProperty( ENTRY_CATEGORY ) ); assertEquals( "1.5", dataModel.getDefaultProperty( ENTRY_WEIGHT ) ); assertNotEquals( true, dataModel.getDefaultProperty( CREATE_ENTRY_CLASS ) ); assertEquals( "NewJSFPortletControlPanelEntry", dataModel.getDefaultProperty( ENTRY_CLASS_NAME ) ); } @Test public void testCreateJSPGroup() throws Exception { assertEquals( true, dataModel.isPropertyEnabled( CREATE_JSPS ) ); assertEquals( true, dataModel.isPropertyEnabled( CREATE_JSPS_FOLDER ) ); dataModel.setProperty( CREATE_JSPS, false ); assertEquals( false, dataModel.isPropertyEnabled( CREATE_JSPS_FOLDER ) ); dataModel.setProperty( CREATE_JSPS, true ); assertEquals( true, dataModel.isPropertyEnabled( CREATE_JSPS_FOLDER ) ); dataModel.setProperty( PORTLET_NAME, "jspfolderchanged" ); assertEquals( "/WEB-INF/views/jspfolderchanged", dataModel.getProperty( CREATE_JSPS_FOLDER ) ); dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null ); assertTrue( checkFileExist( project, "view.xhtml", "/WEB-INF/views/jspfolderchanged" ) ); dataModel.setProperty( CREATE_JSPS_FOLDER, "" ); String message = dataModel.validateProperty( CREATE_JSPS_FOLDER ).getMessage(); assertEquals( "JSP folder cannot be empty.", message ); assertEquals( false, wizard.canFinish() ); dataModel.setProperty( CREATE_JSPS_FOLDER, "/views/" ); message = dataModel.validateProperty( CREATE_JSPS_FOLDER ).getMessage(); assertEquals( "The views should be generated in the WEB-INF folder.", message ); assertEquals( false, wizard.canFinish() ); dataModel.setProperty( PORTLET_NAME, "new-jsf" ); dataModel.setProperty( CREATE_JSPS, false ); message = dataModel.validate().getMessage(); assertEquals( "OK", message ); assertEquals( true, wizard.canFinish() ); dataModel.setProperty( CREATE_JSPS, true ); dataModel.setProperty( CREATE_JSPS_FOLDER, "/WEB-INF/views/jspfolderchanged" ); message = dataModel.validateProperty( CREATE_JSPS_FOLDER ).getMessage(); assertEquals( "View file already exists and will be overwritten.", message ); } @Test public void testLiferayDisplayGroup() throws Exception { assertEquals( true, dataModel.isPropertyEnabled( CATEGORY ) ); DataModelPropertyDescriptor[] categories = dataModel.getValidPropertyDescriptors( CATEGORY ); assertNotNull( categories ); assertEquals( true, containPropertyDescriptor( categories, "Sample" ) ); assertEquals( true, containPropertyDescriptor( categories, "Marketplace" ) ); assertEquals( true, containPropertyDescriptor( categories, "Wiki" ) ); assertEquals( true, dataModel.isPropertyEnabled( ADD_TO_CONTROL_PANEL ) ); // assertEquals( false, dataModel.isPropertyEnabled( ENTRY_CATEGORY ) ); DataModelPropertyDescriptor[] entryCategories = dataModel.getValidPropertyDescriptors( ENTRY_CATEGORY ); assertNotNull( entryCategories ); assertEquals( true, containPropertyDescriptor( entryCategories, "My Account Administration" ) ); assertEquals( true, containPropertyDescriptor( entryCategories, "Control Panel - Apps" ) ); assertEquals( true, containPropertyDescriptor( entryCategories, "Control Panel - Configuration" ) ); assertEquals( true, containPropertyDescriptor( entryCategories, "Site Administration - Configuration" ) ); assertEquals( true, containPropertyDescriptor( entryCategories, "Site Administration - Content" ) ); assertEquals( true, containPropertyDescriptor( entryCategories, "Site Administration - Pages" ) ); assertEquals( true, containPropertyDescriptor( entryCategories, "Site Administration - Users" ) ); assertEquals( true, containPropertyDescriptor( entryCategories, "Control Panel - Sites" ) ); assertEquals( true, containPropertyDescriptor( entryCategories, "Control Panel - Users" ) ); dataModel.setProperty( ADD_TO_CONTROL_PANEL, true ); assertEquals( true, dataModel.isPropertyEnabled( ENTRY_CATEGORY ) ); assertEquals( true, dataModel.isPropertyEnabled( ENTRY_WEIGHT ) ); assertEquals( true, dataModel.isPropertyEnabled( CREATE_ENTRY_CLASS ) ); dataModel.setProperty( CREATE_ENTRY_CLASS, true ); assertEquals( true, dataModel.isPropertyEnabled( ENTRY_CLASS_NAME ) ); dataModel.setProperty( ENTRY_WEIGHT, "" ); String message = dataModel.validate().getMessage(); assertEquals( "Must specify a valid double for entry weight.", message ); dataModel.setProperty( ENTRY_WEIGHT, "1.5" ); assertEquals( true, wizard.canFinish() ); dataModel.setProperty( ENTRY_CLASS_NAME, "" ); message = dataModel.validateProperty( ENTRY_CLASS_NAME ).getMessage(); assertEquals( "The class name cannot be empty.", message ); assertEquals( false, wizard.canFinish() ); dataModel.setProperty( ENTRY_CLASS_NAME, "test" ); message = dataModel.validateProperty( ENTRY_CLASS_NAME ).getMessage(); assertEquals( "Warning: By convention, Java type names usually start with an uppercase letter", message ); assertEquals( true, wizard.canFinish() ); dataModel.setProperty( ENTRY_CLASS_NAME, "test test" ); message = dataModel.validateProperty( ENTRY_CLASS_NAME ).getMessage(); assertEquals( "Invalid Java class name: The type name 'test test' is not a valid identifier", message ); assertEquals( false, wizard.canFinish() ); dataModel.setProperty( ENTRY_CLASS_NAME, "MyNewJSFPortletControlPanelEntry" ); dataModel.setProperty( PORTLET_NAME, "LiferayDisplay" ); dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null ); assertEquals( true, checkFileExist( project, "MyNewJSFPortletControlPanelEntry.java", "WEB-INF/src/com/test" ) ); dataModel.setProperty( ENTRY_CLASS_NAME, "MyNewJSFPortletControlPanelEntry" ); message = dataModel.validateProperty( ENTRY_CLASS_NAME ).getMessage(); assertEquals( "Type 'com.test.MyNewJSFPortletControlPanelEntry' already exists.", message ); assertEquals( false, wizard.canFinish() ); } @Test public void testLiferayPortletInfoGroup() throws Exception { assertEquals( true, dataModel.isPropertyEnabled( ICON_FILE ) ); dataModel.setProperty( ICON_FILE, "" ); assertEquals( true, wizard.canFinish() ); assertEquals( true, dataModel.isPropertyEnabled( ALLOW_MULTIPLE ) ); dataModel.setProperty( ALLOW_MULTIPLE, true ); assertEquals( true, dataModel.isPropertyEnabled( ALLOW_MULTIPLE ) ); dataModel.setProperty( ALLOW_MULTIPLE, true ); assertEquals( true, dataModel.isPropertyEnabled( CSS_FILE ) ); dataModel.setProperty( CSS_FILE, "" ); assertEquals( true, wizard.canFinish() ); assertEquals( true, dataModel.isPropertyEnabled( JAVASCRIPT_FILE ) ); dataModel.setProperty( JAVASCRIPT_FILE, "" ); assertEquals( true, wizard.canFinish() ); assertEquals( true, dataModel.isPropertyEnabled( CSS_CLASS_WRAPPER ) ); dataModel.setProperty( CSS_CLASS_WRAPPER, "" ); assertEquals( true, wizard.canFinish() ); dataModel.setProperty( PORTLET_NAME, "LiferayPortletInfo" ); dataModel.setProperty( CSS_FILE, "/css/new_main.css" ); dataModel.setProperty( JAVASCRIPT_FILE, "/js/new_main.js" ); dataModel.setProperty( PROJECT, project ); dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null ); assertEquals( true, checkFileExist( project, "new_main.css", "css" ) ); assertEquals( true, checkFileExist( project, "new_main.js", "js" ) ); } @Test public void testPortletClass() throws Exception { dataModel.setProperty( JSF_PORTLET_CLASS, "" ); String message = dataModel.validateProperty( JSF_PORTLET_CLASS ).getMessage(); assertEquals( "Must specify a JSF portlet class.", message ); assertEquals( false, wizard.canFinish() ); dataModel.setProperty( JSF_PORTLET_CLASS, "NewJSFPortlet1" ); message = dataModel.validateProperty( JSF_PORTLET_CLASS ).getMessage(); assertEquals( "JSF portlet class must be a valid portlet class.", message ); assertEquals( false, wizard.canFinish() ); dataModel.setProperty( JSF_PORTLET_CLASS, "javax.portlet.faces.GenericFacesPortlet" ); assertEquals( true, wizard.canFinish() ); } @Test public void testPortletInfoGroup() throws Exception { dataModel.setProperty( PORTLET_NAME, "my-new" ); assertEquals( "My New", dataModel.getProperty( DISPLAY_NAME ) ); assertEquals( "My New", dataModel.getProperty( TITLE ) ); dataModel.setProperty( PORTLET_NAME, "ABC-MY" ); assertEquals( "ABC MY", dataModel.getProperty( DISPLAY_NAME ) ); assertEquals( "ABC MY", dataModel.getProperty( TITLE ) ); dataModel.setProperty( PORTLET_NAME, "aa12-m334y-bb-ccc" ); assertEquals( "Aa12 M334y Bb Ccc", dataModel.getProperty( DISPLAY_NAME ) ); assertEquals( "Aa12 M334y Bb Ccc", dataModel.getProperty( TITLE ) ); dataModel.setProperty( PORTLET_NAME, "Aa 12-M334yB_bCC2C" ); assertEquals( "Aa 12 M334yB BCC2C", dataModel.getProperty( DISPLAY_NAME ) ); assertEquals( "Aa 12 M334yB BCC2C", dataModel.getProperty( TITLE ) ); dataModel.setProperty( PORTLET_NAME, "my-n ew-POrtLet" ); assertEquals( "My N Ew POrtLet", dataModel.getProperty( DISPLAY_NAME ) ); assertEquals( "My N Ew POrtLet", dataModel.getProperty( TITLE ) ); dataModel.setProperty( PORTLET_NAME, "my-^abcd-tao%*tao ---liferay_PORTlet*^-_Display-_ PORTLET" ); assertEquals( "My ^abcd Tao%*tao Liferay PORTlet*^ Display PORTLET", dataModel.getProperty( DISPLAY_NAME ) ); assertEquals( "My ^abcd Tao%*tao Liferay PORTlet*^ Display PORTLET", dataModel.getProperty( TITLE ) ); dataModel.setProperty( PORTLET_NAME, "ABC^&&&d----DD()--[]AA___{portlet}-my new" ); assertEquals( "ABC^&&&d DD() []AA {portlet} My New", dataModel.getProperty( DISPLAY_NAME ) ); assertEquals( "ABC^&&&d DD() []AA {portlet} My New", dataModel.getProperty( TITLE ) ); dataModel.setProperty( PORTLET_NAME, "" ); assertEquals( "", dataModel.getProperty( DISPLAY_NAME ) ); assertEquals( "", dataModel.getProperty( TITLE ) ); String message = dataModel.validateProperty( PORTLET_NAME ).getMessage(); assertEquals( "Portlet name is empty.", message ); dataModel.setProperty( PORTLET_NAME, " \" \" " ); assertEquals( "\" \"", dataModel.getProperty( DISPLAY_NAME ) ); assertEquals( "\" \"", dataModel.getProperty( TITLE ) ); dataModel.setProperty( PORTLET_NAME, " \" " ); assertEquals( "\"", dataModel.getProperty( DISPLAY_NAME ) ); assertEquals( "\"", dataModel.getProperty( TITLE ) ); dataModel.setProperty( PORTLET_NAME, "\"\" \" " ); assertEquals( "\"\" \"", dataModel.getProperty( DISPLAY_NAME ) ); assertEquals( "\"\" \"", dataModel.getProperty( TITLE ) ); dataModel.setProperty( PORTLET_NAME, " Test1 Test2 \"Test1\" " ); assertEquals( "Test1 Test2 \"Test1\"", dataModel.getProperty( DISPLAY_NAME ) ); assertEquals( "Test1 Test2 \"Test1\"", dataModel.getProperty( TITLE ) ); dataModel.setProperty( PORTLET_NAME, " Test1 Test2\" \"Te\"st1 " ); assertEquals( "Test1 Test2\" \"Te\"st1", dataModel.getProperty( DISPLAY_NAME ) ); assertEquals( "Test1 Test2\" \"Te\"st1", dataModel.getProperty( TITLE ) ); dataModel.setProperty( PORTLET_NAME, " Tes \t3 Te\" \" Test2\" \"Te\"st1 " ); assertEquals( "Tes 3 Te\" \" Test2\" \"Te\"st1", dataModel.getProperty( DISPLAY_NAME ) ); assertEquals( "Tes 3 Te\" \" Test2\" \"Te\"st1", dataModel.getProperty( TITLE ) ); dataModel.setProperty( PORTLET_NAME, "portletexist" ); dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null ); dataModel=wizard.getDataModel(); dataModel.setProperty( PORTLET_NAME, "portletexist" ); message = dataModel.validateProperty( PORTLET_NAME ).getMessage(); assertEquals( "Portlet name already exists.", message ); } @Test public void testPortletModesGroup() throws Exception { assertEquals( false, dataModel.isPropertyEnabled( VIEW_MODE ) ); assertEquals( true, dataModel.isPropertyEnabled( EDIT_MODE ) ); assertEquals( true, dataModel.isPropertyEnabled( HELP_MODE ) ); dataModel.setProperty( EDIT_MODE, true ); dataModel.setProperty( HELP_MODE, true ); dataModel.setProperty( PORTLET_NAME, "PortletModes" ); dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null ); assertTrue( checkFileExist( project, "view.xhtml", "WEB-INF/views/portletmodes" ) ); assertTrue( checkFileExist( project, "edit.xhtml", "WEB-INF/views/portletmodes" ) ); assertTrue( checkFileExist( project, "help.xhtml", "WEB-INF/views/portletmodes" ) ); } @Test public void testSourceFolder() throws Exception { String contentName = SOURCE_FOLDER; Object contentDefaultValue = dataModel.getProperty( contentName ); dataModel.setProperty( contentName, "" ); String message = dataModel.validateProperty( contentName ).getMessage(); assertEquals( "The source folder cannot be empty.", message ); assertEquals( false, wizard.canFinish() ); dataModel.setProperty( contentName, "src" ); assertEquals( false, wizard.canFinish() ); message = dataModel.validateProperty( contentName ).getMessage(); assertEquals( "Source folder path must be a workspace relative absolute path.", message ); dataModel.setProperty( contentName, contentDefaultValue ); assertEquals( true, wizard.canFinish() ); } @Test public void testTargetProject() throws Exception { dataModel.setProperty( PROJECT_NAME, null ); String message = wizard.getDataModel().validateProperty( PROJECT_NAME ).getMessage(); assertEquals( "Enter a project name.", message ); } @Test public void testViewTemplateGroup() throws Exception { assertEquals( true, dataModel.isProperty( STANDARD_JSF ) ); assertEquals( true, dataModel.isProperty( ICE_FACES ) ); assertEquals( true, dataModel.isProperty( LIFERAY_FACES_ALLOY ) ); assertEquals( true, dataModel.isProperty( PRIME_FACES ) ); assertEquals( true, dataModel.isProperty( RICH_FACES ) ); dataModel.setProperty( ICE_FACES, true ); dataModel.setProperty( PORTLET_NAME, "icefacestemplate" ); dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null ); assertEquals( true, checkFileExist( project, "view.xhtml", "WEB-INF/views/icefacestemplate" ) ); dataModel.setProperty( LIFERAY_FACES_ALLOY, true ); dataModel.setProperty( PORTLET_NAME, "liferayfacesalloytemplate" ); dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null ); assertEquals( true, checkFileExist( project, "view.xhtml", "WEB-INF/views/liferayfacesalloytemplate" ) ); dataModel.setProperty( PRIME_FACES, true ); dataModel.setProperty( PORTLET_NAME, "primefacestemplate" ); dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null ); assertEquals( true, checkFileExist( project, "view.xhtml", "WEB-INF/views/primefacestemplate" ) ); dataModel.setProperty( RICH_FACES, true ); dataModel.setProperty( PORTLET_NAME, "richfacestemplate" ); dataModel.getDefaultOperation().execute( new NullProgressMonitor(), null ); assertEquals( true, checkFileExist( project, "view.xhtml", "WEB-INF/views/richfacestemplate" ) ); } }