From 915db0a7cc34cdaaaa64cdeb67319e42059b9627 Mon Sep 17 00:00:00 2001 From: Patrick Huang Date: Tue, 27 Oct 2015 10:53:09 +1000 Subject: [PATCH] WIP fix arquillian test and functional test --- .../main/java/org/zanata/page/BasePage.java | 6 +-- .../versionsettings/VersionGeneralTab.java | 2 +- .../administration/ServerSettingsTest.java | 2 +- .../org/zanata/rest/SampleDataResource.java | 2 +- .../zanata/rest/SampleDataResourceImpl.java | 2 +- .../java/org/zanata/rest/TestApplication.java | 47 ++++++++++++++++ zanata-war/pom.xml | 13 ++--- .../org/zanata/ApplicationConfiguration.java | 19 +------ .../org/zanata/action/DashboardAction.java | 22 ++++---- .../java/org/zanata/action/ProjectHome.java | 2 +- .../rest/ZanataRestSecurityInterceptor.java | 2 + .../security/AuthenticationManager.java | 5 -- .../zanata/security/SecurityFunctions.java | 8 ++- .../servlet/HttpRequestAndSessionHolder.java | 11 ++++ .../servlet/MultiFileUploadServlet.java | 13 +++-- .../WEB-INF/layout/dashboard/projects.xhtml | 2 +- .../main/webapp/WEB-INF/template/banner.xhtml | 2 +- .../java/org/zanata/DBUnitDataExtractor.java | 2 + .../java/org/zanata/MockResourceFactory.java | 4 ++ .../src/test/java/org/zanata/RestTest.java | 8 +++ .../org/zanata/arquillian/Deployments.java | 54 ++++++++++--------- .../rest/helper/RemoteTestSignalerImpl.java | 24 ++++++++- .../org/zanata/seam/AutowireContexts.java | 3 ++ .../org/zanata/seam/AutowireInstance.java | 4 ++ .../org/zanata/seam/AutowireTransaction.java | 3 ++ .../zanata/seam/FieldComponentAccessor.java | 3 ++ .../zanata/seam/MethodComponentAccessor.java | 3 ++ .../java/org/zanata/seam/SeamAutowire.java | 3 ++ zanata-war/src/test/resources/arquillian.xml | 12 ++--- .../test/resources/arquillian/test-web.xml | 25 --------- 30 files changed, 192 insertions(+), 116 deletions(-) create mode 100644 zanata-test-war/src/main/java/org/zanata/rest/TestApplication.java diff --git a/functional-test/src/main/java/org/zanata/page/BasePage.java b/functional-test/src/main/java/org/zanata/page/BasePage.java index 4c621546c1..47f298b026 100644 --- a/functional-test/src/main/java/org/zanata/page/BasePage.java +++ b/functional-test/src/main/java/org/zanata/page/BasePage.java @@ -73,9 +73,9 @@ public class BasePage extends CorePage { private By glossaryLink = By.id("glossary_link"); private By userAvatar = By.id("user--avatar"); private static final By BY_SIGN_IN = By.id("signin_link"); - private static final By BY_SIGN_OUT = By.id("right_menu_sign_out_link"); - private static final By BY_DASHBOARD_LINK = By.id("dashboard"); - private static final By BY_ADMINISTRATION_LINK = By.id("administration"); + private static final By BY_SIGN_OUT = By.id("banner_form:right_menu_sign_out_link"); + private static final By BY_DASHBOARD_LINK = By.id("banner_form:dashboard"); + private static final By BY_ADMINISTRATION_LINK = By.id("banner_form:administration"); private By searchInput = By.id("projectAutocomplete-autocomplete__input"); private By registrationLink = By.id("register_link_internal_auth"); private static final By contactAdminLink = By.linkText("Contact admin"); diff --git a/functional-test/src/main/java/org/zanata/page/projectversion/versionsettings/VersionGeneralTab.java b/functional-test/src/main/java/org/zanata/page/projectversion/versionsettings/VersionGeneralTab.java index abfbdca0bc..d3760d89cb 100644 --- a/functional-test/src/main/java/org/zanata/page/projectversion/versionsettings/VersionGeneralTab.java +++ b/functional-test/src/main/java/org/zanata/page/projectversion/versionsettings/VersionGeneralTab.java @@ -30,7 +30,7 @@ */ @Slf4j public class VersionGeneralTab extends VersionBasePage { - private By versionIdField = By.id("settings-general_form:slugField:slug"); + private By versionIdField = By.id("settings-general_form:slug:input:slug"); private By updateButton = By.id("settings-general_form:updateButton"); public VersionGeneralTab(WebDriver driver) { diff --git a/functional-test/src/test/java/org/zanata/feature/administration/ServerSettingsTest.java b/functional-test/src/test/java/org/zanata/feature/administration/ServerSettingsTest.java index ca8a4b3450..27d6382fc2 100644 --- a/functional-test/src/test/java/org/zanata/feature/administration/ServerSettingsTest.java +++ b/functional-test/src/test/java/org/zanata/feature/administration/ServerSettingsTest.java @@ -44,7 +44,7 @@ public class ServerSettingsTest extends ZanataTestCase { @ClassRule - public HasEmailRule hasEmailRule = new HasEmailRule(); + public static HasEmailRule hasEmailRule = new HasEmailRule(); @Test public void setServerURLTest() { diff --git a/zanata-test-war/src/main/java/org/zanata/rest/SampleDataResource.java b/zanata-test-war/src/main/java/org/zanata/rest/SampleDataResource.java index e8b337d2bb..b777b8c78a 100644 --- a/zanata-test-war/src/main/java/org/zanata/rest/SampleDataResource.java +++ b/zanata-test-war/src/main/java/org/zanata/rest/SampleDataResource.java @@ -9,7 +9,7 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; -@Path("/test/data/sample") +@Path("/data/sample") public interface SampleDataResource { diff --git a/zanata-test-war/src/main/java/org/zanata/rest/SampleDataResourceImpl.java b/zanata-test-war/src/main/java/org/zanata/rest/SampleDataResourceImpl.java index 75b5bb3ef2..d16107f165 100644 --- a/zanata-test-war/src/main/java/org/zanata/rest/SampleDataResourceImpl.java +++ b/zanata-test-war/src/main/java/org/zanata/rest/SampleDataResourceImpl.java @@ -31,7 +31,7 @@ * @author Patrick Huang pahuang@redhat.com */ -@Path("/test/data/sample") +@Path("/data/sample") @Slf4j public class SampleDataResourceImpl implements SampleDataResource { diff --git a/zanata-test-war/src/main/java/org/zanata/rest/TestApplication.java b/zanata-test-war/src/main/java/org/zanata/rest/TestApplication.java new file mode 100644 index 0000000000..f2de9e5d93 --- /dev/null +++ b/zanata-test-war/src/main/java/org/zanata/rest/TestApplication.java @@ -0,0 +1,47 @@ +/* + * Copyright 2015, Red Hat, Inc. and individual contributors as indicated by the + * @author tags. See the copyright.txt file in the distribution for a full + * listing of individual contributors. + * + * This 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 software 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. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this software; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF + * site: http://www.fsf.org. + */ + +package org.zanata.rest; + +import java.util.Set; + +import javax.enterprise.context.ApplicationScoped; +import javax.ws.rs.ApplicationPath; + +import com.google.common.collect.ImmutableSet; + +/** + * @author Patrick Huang pahuang@redhat.com + */ +@ApplicationPath("/rest/test") +@ApplicationScoped +public class TestApplication extends javax.ws.rs.core.Application { + + private static final ImmutableSet> CLASSES = + ImmutableSet.>builder() + .add(SampleDataResourceImpl.class).build(); + + @Override + public Set> getClasses() { + return CLASSES; + } +} diff --git a/zanata-war/pom.xml b/zanata-war/pom.xml index 8fc6b970b6..9959fa64e4 100644 --- a/zanata-war/pom.xml +++ b/zanata-war/pom.xml @@ -2162,16 +2162,9 @@ - org.jboss.arquillian.extension - arquillian-seam2 - 1.0.0.Beta1 - - - - org.jboss.shrinkwrap.descriptors - shrinkwrap-descriptors-api - - + org.jboss.shrinkwrap.resolver + shrinkwrap-resolver-impl-maven + 2.0.0 test diff --git a/zanata-war/src/main/java/org/zanata/ApplicationConfiguration.java b/zanata-war/src/main/java/org/zanata/ApplicationConfiguration.java index 3fabdc067c..1aa8421a8a 100644 --- a/zanata-war/src/main/java/org/zanata/ApplicationConfiguration.java +++ b/zanata-war/src/main/java/org/zanata/ApplicationConfiguration.java @@ -241,25 +241,8 @@ public String getServerPath() { String configuredValue = databaseBackedConfig.getServerHost(); if (configuredValue != null) { return configuredValue; - } else if (defaultServerPath != null) { - return defaultServerPath; } else { - createDefaultServerPath(); - return defaultServerPath; - } - } - - - //@see comment at org.zanata.security.AuthenticationManager.onLoginCompleted() - public void createDefaultServerPath() { - java.util.Optional requestOpt = - HttpRequestAndSessionHolder.getRequest(); - if (requestOpt.isPresent()) { - HttpServletRequest request = requestOpt.get(); - defaultServerPath = - request.getScheme() + "://" + request.getServerName() - + ":" + request.getServerPort() - + request.getContextPath(); + return HttpRequestAndSessionHolder.getDefaultServerPath(); } } diff --git a/zanata-war/src/main/java/org/zanata/action/DashboardAction.java b/zanata-war/src/main/java/org/zanata/action/DashboardAction.java index ce2f3a6808..8092223e96 100644 --- a/zanata-war/src/main/java/org/zanata/action/DashboardAction.java +++ b/zanata-war/src/main/java/org/zanata/action/DashboardAction.java @@ -119,15 +119,15 @@ public String getUserLanguageTeams() { HAccount account = accountDAO.findById(authenticatedAccount.getId()); return StringUtils.join( Collections2.transform(account.getPerson() - .getLanguageMemberships(), - new Function() { - @Nullable - @Override - public Object apply(@NonNull HLocale locale) { - return locale.retrieveDisplayName(); - } - }), - ", "); + .getLanguageMemberships(), + new Function() { + @Nullable + @Override + public Object apply(@NonNull HLocale locale) { + return locale.retrieveDisplayName(); + } + }), + ", "); } private int countUserMaintainedProjects() { @@ -215,6 +215,10 @@ public String getLastTranslatorMessage(HProject project) { return ""; } + public boolean canCreateProject() { + return identity.hasPermission(new HProject(), "insert"); + } + /** * Project list filter. Pages its elements directly from the database. */ diff --git a/zanata-war/src/main/java/org/zanata/action/ProjectHome.java b/zanata-war/src/main/java/org/zanata/action/ProjectHome.java index 6f01b3b195..34c9b48883 100644 --- a/zanata-war/src/main/java/org/zanata/action/ProjectHome.java +++ b/zanata-war/src/main/java/org/zanata/action/ProjectHome.java @@ -1139,7 +1139,7 @@ private boolean checkViewObsolete() { && identity.hasPermission("HProject", "view-obsolete"); } - private class ProjectMaintainersAutocomplete extends MaintainerAutocomplete { + public class ProjectMaintainersAutocomplete extends MaintainerAutocomplete { @Override protected List getMaintainers() { diff --git a/zanata-war/src/main/java/org/zanata/rest/ZanataRestSecurityInterceptor.java b/zanata-war/src/main/java/org/zanata/rest/ZanataRestSecurityInterceptor.java index 16d79531dc..467dcddc34 100644 --- a/zanata-war/src/main/java/org/zanata/rest/ZanataRestSecurityInterceptor.java +++ b/zanata-war/src/main/java/org/zanata/rest/ZanataRestSecurityInterceptor.java @@ -2,6 +2,7 @@ import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.PreMatching; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.ext.Provider; @@ -18,6 +19,7 @@ import java.io.IOException; @Provider +@PreMatching @SecurityPrecedence @Slf4j public class ZanataRestSecurityInterceptor implements ContainerRequestFilter { diff --git a/zanata-war/src/main/java/org/zanata/security/AuthenticationManager.java b/zanata-war/src/main/java/org/zanata/security/AuthenticationManager.java index 5c6254ffad..69e15b3b8f 100644 --- a/zanata-war/src/main/java/org/zanata/security/AuthenticationManager.java +++ b/zanata-war/src/main/java/org/zanata/security/AuthenticationManager.java @@ -306,11 +306,6 @@ public void onLoginCompleted(@Observes LoginCompleted payload) { userAccountServiceImpl.runRoleAssignmentRules(authenticatedAccount, authenticatedCredentials, authType.name()); } - // make sure server path is populated. Here we are sure servlet request - // is available. In cases where it's not in database and - // there is no servlet request, the value will not be null. - // e.g. EmailBuilder triggered by JMS message - applicationConfiguration.createDefaultServerPath(); } public boolean isAccountWaitingForActivation(String username) { diff --git a/zanata-war/src/main/java/org/zanata/security/SecurityFunctions.java b/zanata-war/src/main/java/org/zanata/security/SecurityFunctions.java index 3cfda86c45..8c58d7a4a0 100644 --- a/zanata-war/src/main/java/org/zanata/security/SecurityFunctions.java +++ b/zanata-war/src/main/java/org/zanata/security/SecurityFunctions.java @@ -627,7 +627,13 @@ public static final boolean canAccessRestPath( * See annotation @Path in REST service class. */ private static boolean isTestServicePath(String servicePath) { - return servicePath != null && servicePath.startsWith("/test"); + return servicePath != null + && ( + // when being called in RestLimitingFilter + servicePath.startsWith("/zanata/rest/test") || + // when being called in ZanataRestSecurityInterceptor + servicePath.startsWith("/test") + ); } private static class AutoCloseSession implements AutoCloseable { diff --git a/zanata-war/src/main/java/org/zanata/servlet/HttpRequestAndSessionHolder.java b/zanata-war/src/main/java/org/zanata/servlet/HttpRequestAndSessionHolder.java index 5c475f7487..b6fb154f95 100644 --- a/zanata-war/src/main/java/org/zanata/servlet/HttpRequestAndSessionHolder.java +++ b/zanata-war/src/main/java/org/zanata/servlet/HttpRequestAndSessionHolder.java @@ -45,12 +45,19 @@ public class HttpRequestAndSessionHolder { private static final ThreadLocal REQUEST = new ThreadLocal<>(); + private static String defaultServerPath; + void setRequest(@Observes @Initialized HttpServletRequest request) { if (REQUEST.get() != null) { throw new IllegalStateException( "There is already a request for this thread"); } REQUEST.set(request); + if (defaultServerPath == null) { + defaultServerPath = request.getScheme() + "://" + request.getServerName() + + ":" + request.getServerPort() + + request.getContextPath(); + } } void removeRequest(@Observes @Destroyed HttpServletRequest request) { @@ -76,4 +83,8 @@ public static Optional getHttpSession(boolean create) { } return Optional.empty(); } + + public static String getDefaultServerPath() { + return defaultServerPath; + } } diff --git a/zanata-war/src/main/java/org/zanata/servlet/MultiFileUploadServlet.java b/zanata-war/src/main/java/org/zanata/servlet/MultiFileUploadServlet.java index 39a287555f..71cb11c768 100644 --- a/zanata-war/src/main/java/org/zanata/servlet/MultiFileUploadServlet.java +++ b/zanata-war/src/main/java/org/zanata/servlet/MultiFileUploadServlet.java @@ -54,8 +54,10 @@ import org.zanata.file.GlobalDocumentId; import org.zanata.file.SourceDocumentUpload; import org.zanata.file.UserFileUploadTracker; +import org.zanata.model.HAccount; import org.zanata.rest.DocumentFileUploadForm; import org.zanata.rest.dto.ChunkUploadResponse; +import org.zanata.security.annotations.AuthenticatedLiteral; import org.zanata.util.FileUtil; import org.zanata.util.ServiceLocator; @@ -123,10 +125,15 @@ private Optional getCannotUploadReason() { return Optional.absent(); } + // FIXME consolidate to one Optional private Optional getAccountId() { - AuthenticatedAccountHome accountHome = ServiceLocator.instance().getInstance( - AuthenticatedAccountHome.class); - return Optional.fromNullable((Long) accountHome.getId()); + java.util.Optional optionalAuthenticatedAccount = + ServiceLocator.instance().getOptionalInstance( + HAccount.class, new AuthenticatedLiteral()); + if (optionalAuthenticatedAccount.isPresent()) { + return Optional.of(optionalAuthenticatedAccount.get().getId()); + } + return Optional.absent(); } @Override diff --git a/zanata-war/src/main/webapp/WEB-INF/layout/dashboard/projects.xhtml b/zanata-war/src/main/webapp/WEB-INF/layout/dashboard/projects.xhtml index c75260a141..8657168869 100644 --- a/zanata-war/src/main/webapp/WEB-INF/layout/dashboard/projects.xhtml +++ b/zanata-war/src/main/webapp/WEB-INF/layout/dashboard/projects.xhtml @@ -25,7 +25,7 @@ - +
  • - +