/******************************************************************************* * Copyright (c) 2012 VMWare, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VMWare, Inc. - initial API and implementation *******************************************************************************/ package org.grails.ide.eclipse.refactoring.test; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Path; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring; import org.eclipse.ltk.internal.core.refactoring.resource.RenameResourceProcessor; import org.grails.ide.eclipse.core.model.GrailsVersion; import org.springsource.ide.eclipse.commons.tests.util.StsTestUtil; import org.grails.ide.eclipse.ui.internal.importfixes.GrailsProjectVersionFixer; /** * @author Kris De Volder * @since 2.7 */ public class GrailsViewRenameTest extends GrailsRefactoringTest { @Override protected void setUp() throws Exception { super.setUp(); //clearGrailsState(); ensureDefaultGrailsVersion(GrailsVersion.MOST_RECENT); GrailsProjectVersionFixer.globalAskToConvertToGrailsProjectAnswer = true; } @Override protected void tearDown() throws Exception { super.tearDown(); if (undo!=null) { undoLastRefactoring(); //Return the test project to original state } } // public void testImportGtunes() throws Exception { // ensureDefaultGrailsVersion(GrailsVersion.MOST_RECENT); // importZippedProject("gTunez"); // // ///////////////////////////////////////////////////////////////////////////////////////////////// // //Check a few things about this test project // checkImportedProject(); // } public void testPerformRefactoring() throws Exception { if (GrailsVersion.MOST_RECENT.isSnapshot()) { //Don't run for snapshots, too much work to create test projects for moving target return; } importZippedProject("gTunez"); checkImportedProject(); createResource(project, "grails-app/controllers/gtunez/ExtraController.groovy", "package gtunez\n" + "\n" + "class ExtraController {\n" + "\n" + " def index() { \n" + " redirect(action:\"list\")\n" + " }\n" + " \n" + " def list() {\n" + " redirect(action:\"list\", controller: \"song\")\n" + " }\n" + "}\n"); StsTestUtil.assertNoErrors(project); String oldActionName = "list"; String newActionName = "catalog"; IResource target = project.getFile(new Path("grails-app/views/song/"+oldActionName+".gsp")); RenameResourceProcessor processor = new RenameResourceProcessor(target); RenameRefactoring refactoring = new RenameRefactoring(processor); processor.setNewResourceName(newActionName+".gsp"); RefactoringStatus status = performRefactoring(refactoring, true, false); assertOK(status); // Now check whether the all the changes we think are supposed to happen did happen. //The gsp file was renamed? assertFileDeleted("/gTunez/grails-app/views/song/"+oldActionName+".gsp"); assertFile("/gTunez/grails-app/views/song/"+newActionName+".gsp"); //TODO: contents of the file! assertFile("/gTunez/grails-app/controllers/gtunez/ExtraController.groovy", "package gtunez\n" + "\n" + "class ExtraController {\n" + "\n" + " def index() { \n" + " redirect(action:\"list\")\n" + " }\n" + " \n" + " def list() {\n" + " redirect(action:\"catalog\", controller: \"song\")\n" + " }\n" + "}\n"); String songControllerPath = "/gTunez/grails-app/controllers/gtunez/SongController.groovy"; String songController = getContents(ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(songControllerPath))); songController = songController.replace('"'+oldActionName+'"', '"'+newActionName+'"'); songController = songController.replace("def "+oldActionName, "def "+newActionName); assertFile(songControllerPath, songController); } /** * This test uses actions represented as fields (1.3.x style). To see if these actions also get * visited and renamed properly. */ public void testPerformFieldActionRefactoring() throws Exception { if (GrailsVersion.MOST_RECENT.isSnapshot()) { //Don't run for snapshots, too much work to create test projects for moving target return; } importZippedProject("gTunez"); checkImportedProject(); createResource(project, "grails-app/controllers/gtunez/ExtraController.groovy", "package gtunez\n" + "\n" + "class ExtraController {\n" + "\n" + " def index = { \n" + " redirect(action:\"list\")\n" + " }\n" + " \n" + " def list = {\n" + " redirect(action:\"list\", controller: \"song\")\n" + " }\n" + "}\n"); String oldActionName = "list"; String newActionName = "catalog"; createResource(project, "grails-app/views/extra/"+oldActionName+".gsp", "<%@ page import=\"gtunez.Song\" %>\n" + "<!doctype html>\n" + "<html>\n" + " <head>\n" + " <meta name=\"layout\" content=\"main\">\n" + " <g:set var=\"entityName\" value=\"${message(code: 'song.label', default: 'Banana')}\" />\n" + " <title><g:message code=\"default.list.label\" args=\"[entityName]\" /></title>\n" + " </head>\n" + " <body>\n" + " <h1>A few links:</h1>\n" + " <g:link action=\"list\" id=\"1\">blah</g:link>\n" + " <g:link action=\"show\" id=\"${currentBook.id}\">blah</g:link>\n" + " <g:link controller=\"book\">Book Home</g:link>\n" + " <g:link controller=\"book\" action=\"list\">blah</g:link>\n" + " <g:link controller=\"extra\">Book Home</g:link>\n" + " <g:link controller=\"extra\" action=\"list\">blah</g:link>\n" + " <g:link controller=\"extra\" action=\"show\">blah</g:link>\n" + " </body>\n" + "</html>\n"); StsTestUtil.assertNoErrors(project); IResource target = project.getFile(new Path("grails-app/views/extra/"+oldActionName+".gsp")); RenameResourceProcessor processor = new RenameResourceProcessor(target); RenameRefactoring refactoring = new RenameRefactoring(processor); processor.setNewResourceName(newActionName+".gsp"); RefactoringStatus status = performRefactoring(refactoring, true, false); assertOK(status); // Now check whether the changes we think are supposed to happen did happen. //The gsp file was renamed? assertFileDeleted("/gTunez/grails-app/views/extra/"+oldActionName+".gsp"); assertFile("/gTunez/grails-app/views/extra/"+newActionName+".gsp", "<%@ page import=\"gtunez.Song\" %>\n" + "<!doctype html>\n" + "<html>\n" + " <head>\n" + " <meta name=\"layout\" content=\"main\">\n" + " <g:set var=\"entityName\" value=\"${message(code: 'song.label', default: 'Banana')}\" />\n" + " <title><g:message code=\"default.list.label\" args=\"[entityName]\" /></title>\n" + " </head>\n" + " <body>\n" + " <h1>A few links:</h1>\n" + " <g:link action=\"catalog\" id=\"1\">blah</g:link>\n" + " <g:link action=\"show\" id=\"${currentBook.id}\">blah</g:link>\n" + " <g:link controller=\"book\">Book Home</g:link>\n" + " <g:link controller=\"book\" action=\"list\">blah</g:link>\n" + " <g:link controller=\"extra\">Book Home</g:link>\n" + " <g:link controller=\"extra\" action=\"catalog\">blah</g:link>\n" + " <g:link controller=\"extra\" action=\"show\">blah</g:link>\n" + " </body>\n" + "</html>\n"); assertFile("/gTunez/grails-app/controllers/gtunez/ExtraController.groovy", "package gtunez\n" + "\n" + "class ExtraController {\n" + "\n" + " def index = { \n" + " redirect(action:\"catalog\")\n" + " }\n" + " \n" + " def catalog = {\n" + " redirect(action:\"list\", controller: \"song\")\n" + " }\n" + "}\n"); String songControllerPath = "/gTunez/grails-app/controllers/gtunez/SongController.groovy"; String songController = getContents(ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(songControllerPath))); //songController has only references to its own actions so renaming an action in the extra controller should leave it unchanged assertFile(songControllerPath, songController); } /** * Tests whether references to methods are being renamed automatically when a method itself is being * renamed. */ public void testSTS2032MethodReferencesRenamed() throws Exception { if (GrailsVersion.MOST_RECENT.isSnapshot()) { //Don't run for snapshots, too much work to create test projects for moving target return; } if (GrailsVersion.MOST_RECENT.compareTo(GrailsVersion.V_2_0_0)>=0) { importZippedProject("gTunez"); checkImportedProject(); String contents = "package gtunez\n" + "\n" + "import org.junit.*\n" + "import grails.test.mixin.*\n" + "import javax.servlet.http.HttpServletResponse\n" + "\n" + "@TestFor(SongController)\n" + "@Mock(Song)\n" + "class SongControllerTests {\n" + " void testEdit() {\n" + " controller.edit()\n" + "\n" + " assert flash.message != null\n" + " assert response.redirectedUrl == '/song/list'\n" + "\n" + "\n" + " def song = new Song()\n" + "\n" + " // TODO: populate valid domain properties\n" + "\n" + " assert song.save() != null\n" + "\n" + " params.id = song.id\n" + "\n" + " def model = controller.edit()\n" + "\n" + " assert model.songInstance == song\n" + " }\n" + "}"; createResource(project, "test/unit/gtunez/SongControllerTests.groovy", contents); StsTestUtil.assertNoErrors(project);//Ensure project is built String oldActionName = "edit"; String newActionName = "modify"; IResource target = project.getFile(new Path("grails-app/views/song/"+oldActionName+".gsp")); RenameResourceProcessor processor = new RenameResourceProcessor(target); RenameRefactoring refactoring = new RenameRefactoring(processor); processor.setNewResourceName(newActionName+".gsp"); RefactoringStatus status = performRefactoring(refactoring, true, false); assertOK(status); assertFile("/gTunez/test/unit/gtunez/SongControllerTests.groovy", contents.replace("controller."+oldActionName, "controller."+newActionName)); } } /** * Tests whether references to methods are being renamed automatically when a method itself is being * renamed. */ public void testSTS2032FieldReferencesRenamed() throws Exception { if (GrailsVersion.MOST_RECENT.isSnapshot()) { //Don't run for snapshots, too much work to create test projects for moving target return; } if (GrailsVersion.MOST_RECENT.compareTo(GrailsVersion.V_2_0_0)>=0) { importZippedProject("gTunez"); checkImportedProject(); String controllerContents = "package gtunez\n" + "\n" + "import org.springframework.dao.DataIntegrityViolationException\n" + "\n" + "class SongController {\n" + "\n" + " def edit = {\n" + " def songInstance = Song.get(params.id)\n" + " if (!songInstance) {\n" + " flash.message = message(code: 'default.not.found.message', args: [message(code: 'song.label', default: 'Song'), params.id])\n" + " redirect(action: \"list\")\n" + " return\n" + " }\n" + "\n" + " [songInstance: songInstance]\n" + " }\n" + "\n" + "}\n"; createResource(project, "grails-app/controllers/gtunez/SongController.groovy", controllerContents); String contents = "package gtunez\n" + "\n" + "import org.junit.*\n" + "import grails.test.mixin.*\n" + "import javax.servlet.http.HttpServletResponse\n" + "\n" + "@TestFor(SongController)\n" + "@Mock(Song)\n" + "class SongControllerTests {\n" + " void testEdit() {\n" + " controller.edit()\n" + "\n" + " assert flash.message != null\n" + " assert response.redirectedUrl == '/song/list'\n" + "\n" + "\n" + " def song = new Song()\n" + "\n" + " // TODO: populate valid domain properties\n" + "\n" + " assert song.save() != null\n" + "\n" + " params.id = song.id\n" + "\n" + " def model = controller.edit()\n" + "\n" + " assert model.songInstance == song\n" + " }\n" + "}"; createResource(project, "test/unit/gtunez/SongControllerTests.groovy", contents); StsTestUtil.assertNoErrors(project);//Ensure project is built String oldActionName = "edit"; String newActionName = "modify"; IResource target = project.getFile(new Path("grails-app/views/song/"+oldActionName+".gsp")); RenameResourceProcessor processor = new RenameResourceProcessor(target); RenameRefactoring refactoring = new RenameRefactoring(processor); processor.setNewResourceName(newActionName+".gsp"); RefactoringStatus status = performRefactoring(refactoring, true, false); assertOK(status); assertFile("/gTunez/test/unit/gtunez/SongControllerTests.groovy", contents.replace("controller."+oldActionName, "controller."+newActionName)); } } private void assertOK(RefactoringStatus status) { if (!status.isOK()) { fail(status.getEntryWithHighestSeverity().getMessage()); } } }