diff --git a/functional-test/pom.xml b/functional-test/pom.xml index 9647194f61..a5d68652ac 100644 --- a/functional-test/pom.xml +++ b/functional-test/pom.xml @@ -36,9 +36,10 @@ jdbc:mysql://localhost:${mysql.port}/${ds.database}?characterEncoding=UTF-8 com.mysql.jdbc.Driver - - ${project.parent.version} - ${basedir}/../zanata-war/target/zanata-${zanata.target.version}.war + + zanata-test-${project.version} + + ${java.io.tmpdir}/zanata-war/zanata-test.war http://${cargo.host}:${cargo.servlet.port}/${context.path}/ b6d7044e9ee3b2447c28fb7c50d86d98 ${project.build.testOutputDirectory}/sample-projects @@ -129,10 +130,12 @@ org.hamcrest hamcrest-core + compile org.hamcrest hamcrest-library + compile @@ -168,8 +171,7 @@ com.github.huangp entityunit - 0.2 - test + 0.3 @@ -178,11 +180,19 @@ zanata-model + + org.jboss.resteasy + jaxrs-api + + + org.jboss.resteasy + resteasy-jaxrs + org.jboss.seam jboss-seam ejb - test + provided org.testng @@ -193,7 +203,7 @@ org.zanata zanata-common-api - test + provided org.jboss.resteasy @@ -228,7 +238,7 @@ org.hibernate.javax.persistence hibernate-jpa-2.0-api - test + provided org.javassist @@ -281,6 +291,16 @@ jsr305 + + + ${project.groupId} + zanata-war + ${project.version} + war + system + ${zanata.war.location} + + @@ -296,6 +316,28 @@ + + maven-war-plugin + + ${zanata.test.war.name} + + + ${project.groupId} + zanata-war + + + + + + + + + + war + + + + org.codehaus.mojo build-helper-maven-plugin @@ -423,9 +465,9 @@ - + war - ${zanata.target.war} + ${project.build.directory}/${zanata.test.war.name}.war http://${cargo.host}:${cargo.servlet.port}/${context.path}/ 180000 diff --git a/functional-test/src/main/java/org/zanata/rest/SampleProjectResource.java b/functional-test/src/main/java/org/zanata/rest/SampleProjectResource.java new file mode 100644 index 0000000000..6d38201126 --- /dev/null +++ b/functional-test/src/main/java/org/zanata/rest/SampleProjectResource.java @@ -0,0 +1,39 @@ +package org.zanata.rest; + + +import java.util.Set; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Response; + +import org.zanata.common.LocaleId; + +@Path("/test/data/sample") +public interface SampleProjectResource { + + + @PUT + @Path("/languages") + Response makeSampleLanguages(); + + @PUT + @Path("/accounts/u/{username}/languages") + Response userJoinsLanguageTeams(@PathParam("username") String username, + @QueryParam("locales") Set locales); + + @PUT + @Path("/users") + Response makeSampleUsers(); + + @PUT + @Path("/project") + Response makeSampleProject(); + + @DELETE + Response deleteExceptEssentialData(); +} diff --git a/functional-test/src/main/java/org/zanata/rest/SampleProjectResourceImpl.java b/functional-test/src/main/java/org/zanata/rest/SampleProjectResourceImpl.java new file mode 100644 index 0000000000..e67bb7b3b2 --- /dev/null +++ b/functional-test/src/main/java/org/zanata/rest/SampleProjectResourceImpl.java @@ -0,0 +1,94 @@ +package org.zanata.rest; + +import java.util.List; +import java.util.Set; +import javax.persistence.EntityManager; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Response; +import org.jboss.seam.annotations.In; +import org.jboss.seam.annotations.Name; +import org.jboss.seam.annotations.Transactional; +import org.jboss.seam.security.RunAsOperation; +import org.zanata.common.LocaleId; +import org.zanata.model.HLocale; +import org.zanata.model.HPerson; +import org.zanata.util.SampleProjectProfile; + +/** + * @author Patrick Huang pahuang@redhat.com + */ +@Path("/test/data/sample") +@Name("sampleProjectResourceImpl") +public class SampleProjectResourceImpl implements SampleProjectResource { + + @In(create = true) + private SampleProjectProfile sampleProjectProfile; + + @In + private EntityManager entityManager; + + @Override + public Response makeSampleLanguages() { + new RunAsOperation() { + @Override + public void execute() { + sampleProjectProfile.makeSampleLanguages(); + } + }.addRole("admin").run(); + return Response.ok().build(); + } + + @Override + public Response makeSampleUsers() { + new RunAsOperation() { + public void execute() { + sampleProjectProfile.makeSampleUsers(); + } + }.addRole("admin").run(); + return Response.ok().build(); + } + + @Override + @Transactional + public Response userJoinsLanguageTeams( + @PathParam("username") String username, + @QueryParam("locales") Set locales) { + + + final HPerson hPerson = entityManager + .createQuery("from HPerson p where p.account.username = :username", + HPerson.class).setParameter("username", username).getSingleResult(); + final List hLocales = entityManager + .createQuery("from HLocale where localeId in (:locales)", + HLocale.class).setParameter("locales", locales).getResultList(); + new RunAsOperation() { + public void execute() { + sampleProjectProfile.addUsersToLanguage(hPerson, hLocales); + } + }.addRole("admin").run(); + return Response.ok().build(); + } + + @Override + public Response makeSampleProject() { + new RunAsOperation() { + public void execute() { + sampleProjectProfile.makeSampleProject(); + } + }.addRole("admin").run(); + return Response.ok().build(); + } + + @Override + public Response deleteExceptEssentialData() { + new RunAsOperation() { + public void execute() { + sampleProjectProfile.deleteExceptEssentialData(); + } + }.addRole("admin").run(); + return Response.ok().build(); + } +} diff --git a/functional-test/src/main/java/org/zanata/util/SampleProjectProfile.java b/functional-test/src/main/java/org/zanata/util/SampleProjectProfile.java new file mode 100644 index 0000000000..03739a26b6 --- /dev/null +++ b/functional-test/src/main/java/org/zanata/util/SampleProjectProfile.java @@ -0,0 +1,297 @@ +package org.zanata.util; + +import java.util.Date; +import java.util.concurrent.TimeUnit; + +import com.github.huangp.entityunit.entity.Callbacks; +import com.github.huangp.entityunit.entity.EntityCleaner; +import com.github.huangp.entityunit.entity.EntityMaker; +import com.github.huangp.entityunit.entity.EntityMakerBuilder; +import com.github.huangp.entityunit.entity.FixIdCallback; +import com.github.huangp.entityunit.entity.TakeCopyCallback; +import com.github.huangp.entityunit.entity.WireManyToManyCallback; +import com.github.huangp.entityunit.maker.FixedValueMaker; +import com.google.common.collect.Lists; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.jboss.seam.ScopeType; +import org.jboss.seam.annotations.AutoCreate; +import org.jboss.seam.annotations.In; +import org.jboss.seam.annotations.Name; +import org.jboss.seam.annotations.Scope; +import org.jboss.seam.annotations.Transactional; +import org.jboss.seam.security.Identity; +import org.zanata.common.ActivityType; +import org.zanata.common.ContentType; +import org.zanata.common.LocaleId; +import org.zanata.model.Activity; +import org.zanata.model.HAccount; +import org.zanata.model.HAccountActivationKey; +import org.zanata.model.HAccountRole; +import org.zanata.model.HApplicationConfiguration; +import org.zanata.model.HDocument; +import org.zanata.model.HGlossaryEntry; +import org.zanata.model.HGlossaryTerm; +import org.zanata.model.HIterationGroup; +import org.zanata.model.HLocale; +import org.zanata.model.HLocaleMember; +import org.zanata.model.HPerson; +import org.zanata.model.HProject; +import org.zanata.model.HProjectIteration; +import org.zanata.model.HTermComment; +import org.zanata.model.HTextFlow; +import org.zanata.model.HTextFlowTarget; +import org.zanata.model.HTextFlowTargetHistory; +import org.zanata.model.IsEntityWithType; +import org.zanata.model.po.HPoTargetHeader; +import org.zanata.model.security.HCredentials; +import org.zanata.model.tm.TransMemory; +import org.zanata.model.tm.TransMemoryUnit; +import org.zanata.model.tm.TransMemoryUnitVariant; + +import javax.persistence.EntityManager; +import javax.persistence.Query; + +/** + * @author Patrick Huang pahuang@redhat.com + */ +@Slf4j +@Getter +@Name("sampleProjectProfile") +@Scope(ScopeType.APPLICATION) +@AutoCreate +@Transactional +public class SampleProjectProfile { + + @In + private EntityManager entityManager; + + private HLocale frLocale; + private HLocale enUSLocale; + private HLocale hiLocale; + private HLocale plLocale; + + private HPerson translator; + private HPerson admin; + private HPerson glossarist; + private HPerson glossaryAdmin; + + @Getter + private TakeCopyCallback projectCopy; + + public void deleteExceptEssentialData() { + EntityCleaner.deleteAll(entityManager, Lists.newArrayList( + TransMemoryUnitVariant.class, TransMemoryUnit.class, + TransMemory.class, + Activity.class, + // glossary + HTermComment.class, HGlossaryTerm.class, HGlossaryEntry.class, + // tex flows and targets + HPoTargetHeader.class, HTextFlowTargetHistory.class, + HTextFlowTarget.class, HTextFlow.class, HDocument.class, + // locales + HLocaleMember.class, HLocale.class, + // version group + HIterationGroup.class, + // project + HProjectIteration.class, HProject.class, + // account + HAccountActivationKey.class, HCredentials.class, HPerson.class, HAccount.class)); + enUSLocale = + forLocale(false, LocaleId.EN_US).makeAndPersist(entityManager, + HLocale.class); + Query query = entityManager.createQuery( + "update HApplicationConfiguration set value = '' where key = :key"); + query.setParameter("key", HApplicationConfiguration.KEY_HOME_CONTENT); + query.executeUpdate(); + query.setParameter("key", HApplicationConfiguration.KEY_HELP_CONTENT); + query.executeUpdate(); + } + + public void makeSampleLanguages() { + frLocale = + forLocale(true, LocaleId.FR).makeAndPersist(entityManager, + HLocale.class); + + hiLocale = + forLocale(true, new LocaleId("hi")).makeAndPersist( + entityManager, HLocale.class); + + plLocale = + forLocale(true, new LocaleId("pl")).makeAndPersist( + entityManager, HLocale.class); + } + + private static EntityMaker forLocale(boolean enabledByDefault, + LocaleId localeId) { + return EntityMakerBuilder + .builder() + .addFieldOrPropertyMaker(HLocale.class, "active", + FixedValueMaker.ALWAYS_TRUE_MAKER) + .addFieldOrPropertyMaker(HLocale.class, "enabledByDefault", + FixedValueMaker.fix(enabledByDefault)) + .addConstructorParameterMaker(HLocale.class, 0, + FixedValueMaker.fix(localeId)).build(); + } + + public void makeSampleUsers() { + HAccount adminAccount = + makeAccount("admin", "Eyox7xbNQ09MkIfRyH+rjg==", + "b6d7044e9ee3b2447c28fb7c50d86d98", 1L); + assignAccountRole(1L, "admin"); + + admin = makePerson(1L, "Administrator", "admin"); + assignAccountToPerson(adminAccount, admin); + + HAccount translatorAccount = + makeAccount("translator", "Fr5JHlcaEqKLSHjnBm4gXg==", + "d83882201764f7d339e97c4b087f0806", 2L); + assignAccountRole(2L, "user"); + translator = makePerson(2L, "translator", "translator"); + assignAccountToPerson(translatorAccount, translator); + + HAccount glossaristAccount = + makeAccount("glossarist", "fRIeiPDPlSMtHbBNoqDjNQ==", + "b1e3daa18e41c0ce79829e87ce66b201", 3L); + assignAccountRole(3L, "glossarist"); + glossarist = makePerson(3L, "glossarist", "glossarist"); + assignAccountToPerson(glossaristAccount, glossarist); + + HAccount gAdminAccount = + makeAccount("glossaryadmin", "/W0YpteXk+WtymQ7H84kPQ==", + "5a6a34d28d39ff90ea47402311f339d4", 4L); + assignAccountRole(4L, "glossary-admin"); + glossaryAdmin = makePerson(4L, "glossary-admin", "glossary-admin"); + assignAccountToPerson(gAdminAccount, glossaryAdmin); + } + + private HPerson makePerson(Long wantedIdValue, String nameValue, + String username) { + return EntityMakerBuilder + .builder() + .addFieldOrPropertyMaker(HPerson.class, "name", + FixedValueMaker.fix(nameValue)) + .addFieldOrPropertyMaker(HPerson.class, "email", + FixedValueMaker.fix(username + "@example.com")) + .build() + .makeAndPersist(entityManager, HPerson.class, + new FixIdCallback(HPerson.class, wantedIdValue)); + } + + private void assignAccountToPerson(HAccount account, HPerson hPerson) { + hPerson.setAccount(account); + } + + private void assignAccountRole(Long accountId, String roleName) { + entityManager.find(HAccount.class, accountId).getRoles() + .add(getAccountRole(roleName)); + } + + private HAccountRole getAccountRole(String roleName) { + log.debug("get account role with name {}", roleName); + return entityManager.createQuery( + String.format("from HAccountRole where name = '%s' ", roleName), + HAccountRole.class) + .getSingleResult(); + } + + public void addUsersToLanguage(HPerson person, Iterable locales) { + for (HLocale locale : locales) { + entityManager.persist(asLocaleMember(person, locale)); + } + } + + private static HLocaleMember asLocaleMember(HPerson person, HLocale locale) { + return new HLocaleMember(person, locale, true, false, false); + } + + private HAccount makeAccount(String username, String passwordHash, + String apiKey, Long accountId) { + EntityMaker maker = EntityMakerBuilder + .builder() + // .includeOptionalOneToOne() + .addFieldOrPropertyMaker(HAccount.class, "enabled", + FixedValueMaker.ALWAYS_TRUE_MAKER) + .addFieldOrPropertyMaker(HAccount.class, "username", + FixedValueMaker.fix(username)) + .addFieldOrPropertyMaker(HAccount.class, + "passwordHash", + FixedValueMaker.fix(passwordHash)) + .addFieldOrPropertyMaker(HAccount.class, "apiKey", + FixedValueMaker.fix(apiKey)).build(); + return maker.makeAndPersist(entityManager, HAccount.class, + new FixIdCallback(HAccount.class, accountId)); + } + + public void makeSampleProject() { + EntityMaker maker = + EntityMakerBuilder + .builder() + // project + .addFieldOrPropertyMaker(HProject.class, "slug", + FixedValueMaker.fix("about-fedora")) + .addFieldOrPropertyMaker(HProject.class, "name", + FixedValueMaker.fix("about fedora")) + // iteration + .addFieldOrPropertyMaker(HProjectIteration.class, + "slug", FixedValueMaker.fix("master")) + // document + // public HDocument(String docId, String name, String + // path, + // ContentType contentType, HLocale locale) + .addConstructorParameterMaker(HDocument.class, 0, + FixedValueMaker.fix("About_Fedora")) + .addConstructorParameterMaker(HDocument.class, 1, + FixedValueMaker.fix("About_Fedora")) + .addConstructorParameterMaker(HDocument.class, 2, + FixedValueMaker.EMPTY_STRING_MAKER) + .addConstructorParameterMaker(HDocument.class, 3, + FixedValueMaker.fix(ContentType.PO)) + .reuseEntity(enUSLocale).build(); + + projectCopy = Callbacks.takeCopy(); + maker.makeAndPersist(entityManager, HTextFlowTarget.class, Callbacks.chain( + Callbacks.wireManyToMany(HProject.class, admin), projectCopy)); + + WireManyToManyCallback manyToManyCallback = Callbacks + .wireManyToMany(HProject.class, admin); + TakeCopyCallback copyCallback = Callbacks.takeCopy(); + EntityMakerBuilder + .builder() + .reuseEntities(admin, admin.getAccount()) + .build() + .makeAndPersist(entityManager, HDocument.class, + Callbacks.chain(manyToManyCallback, copyCallback)); + + // make some fake activities for admin user + HDocument hDocument = copyCallback.getByType(HDocument.class); + + makeActivity(copyCallback, hDocument, + ActivityType.UPLOAD_SOURCE_DOCUMENT, 1); + makeActivity(copyCallback, hDocument, + ActivityType.UPLOAD_SOURCE_DOCUMENT, 2); + makeActivity(copyCallback, hDocument, + ActivityType.UPLOAD_SOURCE_DOCUMENT, 3); + makeActivity(copyCallback, hDocument, + ActivityType.UPLOAD_SOURCE_DOCUMENT, 4); + makeActivity(copyCallback, hDocument, + ActivityType.UPLOAD_SOURCE_DOCUMENT, 5); + makeActivity(copyCallback, hDocument, + ActivityType.UPLOAD_SOURCE_DOCUMENT, 6); + } + + private void makeActivity(TakeCopyCallback copyCallback, + IsEntityWithType activityTarget, ActivityType activityType, + int pastDays) { + Activity activity = new Activity(admin, + copyCallback.getByType(HProjectIteration.class), + activityTarget, + activityType, 10); + Date now = new Date(); + long timestamp = now.getTime() - TimeUnit.DAYS.toMillis(pastDays); + activity.setCreationDate(new Date(timestamp)); + entityManager.persist(activity); + } + +} diff --git a/functional-test/src/test/java/org/zanata/feature/administration/EditTranslationMemoryTest.java b/functional-test/src/test/java/org/zanata/feature/administration/EditTranslationMemoryTest.java index d3e17ace43..ecf4c97d16 100644 --- a/functional-test/src/test/java/org/zanata/feature/administration/EditTranslationMemoryTest.java +++ b/functional-test/src/test/java/org/zanata/feature/administration/EditTranslationMemoryTest.java @@ -20,34 +20,25 @@ */ package org.zanata.feature.administration; -import com.github.huangp.entityunit.entity.EntityCleaner; -import com.google.common.collect.Lists; +import static org.hamcrest.MatcherAssert.assertThat; + +import java.io.File; import org.hamcrest.Matchers; -import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; import org.openqa.selenium.Alert; import org.zanata.feature.DetailedTest; -import org.zanata.model.tm.TransMemory; -import org.zanata.model.tm.TransMemoryUnit; -import org.zanata.model.tm.TransMemoryUnitVariant; import org.zanata.page.administration.TranslationMemoryEditPage; import org.zanata.page.administration.TranslationMemoryPage; import org.zanata.util.AddUsersRule; -import org.zanata.util.EntityManagerFactoryHolder; import org.zanata.util.RetryRule; import org.zanata.util.TestFileGenerator; import org.zanata.workflow.BasicWorkFlow; import org.zanata.workflow.LoginWorkFlow; import org.zanata.workflow.TranslationMemoryWorkFlow; -import javax.persistence.EntityManager; -import java.io.File; - -import static org.hamcrest.MatcherAssert.assertThat; - /** * @author Damian Jansen djansen@redhat.com @@ -61,7 +52,6 @@ public class EditTranslationMemoryTest { public RetryRule retryRule = new RetryRule(2); private TestFileGenerator testFileGenerator = new TestFileGenerator(); - private EntityManager entityManager; @Before public void before() { @@ -70,22 +60,6 @@ public void before() { Matchers.equalTo("admin")); } - @After - public void cleanUp() { - EntityCleaner.deleteAll(getEntityManager(), Lists. newArrayList( - TransMemoryUnitVariant.class, TransMemoryUnit.class, - TransMemory.class)); - } - - private EntityManager getEntityManager() { - if (entityManager == null) { - entityManager = - EntityManagerFactoryHolder.holder().getEmFactory() - .createEntityManager(); - } - return entityManager; - } - @Test public void createNewTranslationMemory() { String newTMId = "newtmtest"; diff --git a/functional-test/src/test/java/org/zanata/feature/dashboard/DashboardTest.java b/functional-test/src/test/java/org/zanata/feature/dashboard/DashboardTest.java index 1e4957b1f2..a2c243ef42 100644 --- a/functional-test/src/test/java/org/zanata/feature/dashboard/DashboardTest.java +++ b/functional-test/src/test/java/org/zanata/feature/dashboard/DashboardTest.java @@ -20,38 +20,21 @@ */ package org.zanata.feature.dashboard; -import com.github.huangp.entityunit.entity.Callbacks; -import com.github.huangp.entityunit.entity.EntityMakerBuilder; -import com.github.huangp.entityunit.entity.TakeCopyCallback; -import com.github.huangp.entityunit.entity.WireManyToManyCallback; import lombok.extern.slf4j.Slf4j; import org.concordion.api.extension.Extensions; import org.concordion.ext.ScreenshotExtension; import org.concordion.ext.TimestampFormatterExtension; import org.concordion.integration.junit4.ConcordionRunner; -import org.junit.Before; import org.junit.Rule; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; -import org.zanata.common.ActivityType; import org.zanata.concordion.CustomResourceExtension; import org.zanata.feature.ConcordionTest; -import org.zanata.model.Activity; -import org.zanata.model.HDocument; -import org.zanata.model.HProject; -import org.zanata.model.HProjectIteration; -import org.zanata.model.HTextFlowTarget; -import org.zanata.model.IsEntityWithType; import org.zanata.page.utility.DashboardPage; -import org.zanata.util.EntityManagerFactoryHolder; import org.zanata.util.SampleProjectRule; import org.zanata.workflow.BasicWorkFlow; import org.zanata.workflow.LoginWorkFlow; -import javax.persistence.EntityManager; -import java.util.Date; -import java.util.concurrent.TimeUnit; - @RunWith(ConcordionRunner.class) @Extensions({ ScreenshotExtension.class, TimestampFormatterExtension.class, CustomResourceExtension.class }) @@ -62,58 +45,6 @@ public class DashboardTest { @Rule public SampleProjectRule sampleProjectRule = new SampleProjectRule(); - @Before - public void setUp() { - EntityManager entityManager = - EntityManagerFactoryHolder.holder().getEmFactory() - .createEntityManager(); - - // here we use glossarist to test because the query to fetch activity is - // cachable. Unless we use cache provider that supports clustering we - // will have to avoid hitting any query cache. - WireManyToManyCallback manyToManyCallback = Callbacks - .wireManyToMany(HProject.class, sampleProjectRule.getGlossarist()); - TakeCopyCallback copyCallback = Callbacks.takeCopy(); - EntityMakerBuilder - .builder() - .reuseEntities(sampleProjectRule.getGlossarist(), - sampleProjectRule.getGlossarist().getAccount()) - .build() - .makeAndPersist(entityManager, HDocument.class, - Callbacks.chain(manyToManyCallback, copyCallback)); - - HDocument hDocument = copyCallback.getByType(HDocument.class); - - makeActivity(entityManager, copyCallback, hDocument, - ActivityType.UPLOAD_SOURCE_DOCUMENT, 1); - makeActivity(entityManager, copyCallback, hDocument, - ActivityType.UPLOAD_SOURCE_DOCUMENT, 2); - makeActivity(entityManager, copyCallback, hDocument, - ActivityType.UPLOAD_SOURCE_DOCUMENT, 3); - makeActivity(entityManager, copyCallback, hDocument, - ActivityType.UPLOAD_SOURCE_DOCUMENT, 4); - makeActivity(entityManager, copyCallback, hDocument, - ActivityType.UPLOAD_SOURCE_DOCUMENT, 5); - makeActivity(entityManager, copyCallback, hDocument, - ActivityType.UPLOAD_SOURCE_DOCUMENT, 6); - } - - private void makeActivity(EntityManager entityManager, - TakeCopyCallback copyCallback, - IsEntityWithType activityTarget, ActivityType activityType, - int pastDays) { - Activity activity = new Activity(sampleProjectRule.getGlossarist(), - copyCallback.getByType(HProjectIteration.class), - activityTarget, - activityType, 10); - Date now = new Date(); - long timestamp = now.getTime() - TimeUnit.DAYS.toMillis(pastDays); - activity.setCreationDate(new Date(timestamp)); - entityManager.getTransaction().begin(); - entityManager.persist(activity); - entityManager.getTransaction().commit(); - } - private DashboardPage dashboardPage; public boolean signInAs(String username, String password) { diff --git a/functional-test/src/test/java/org/zanata/util/AddUsersRule.java b/functional-test/src/test/java/org/zanata/util/AddUsersRule.java index bd1a79320b..d965da9cab 100644 --- a/functional-test/src/test/java/org/zanata/util/AddUsersRule.java +++ b/functional-test/src/test/java/org/zanata/util/AddUsersRule.java @@ -2,6 +2,12 @@ import lombok.extern.slf4j.Slf4j; import org.junit.rules.ExternalResource; +import org.zanata.common.LocaleId; +import org.zanata.rest.SampleProjectResource; + +import com.google.common.collect.Sets; + +import static org.zanata.util.SampleProjectClient.checkAndReleaseConnection; /** * @author Patrick Huang pahuang@redhat.com + */ +public class SampleProjectClient { + static final SampleProjectResource RESOURCE = ProxyFactory + .create(SampleProjectResource.class, + PropertiesHolder.getProperty("zanata.instance.url") + + "seam/resource/restv1"); + + public static void checkAndReleaseConnection(Response response1) { + ClientResponse response = + (ClientResponse) response1; + assertThat(response.getStatus(), Matchers.equalTo(200)); + response.releaseConnection(); + } + +} diff --git a/functional-test/src/test/java/org/zanata/util/SampleProjectProfile.java b/functional-test/src/test/java/org/zanata/util/SampleProjectProfile.java deleted file mode 100644 index 2b7cee9438..0000000000 --- a/functional-test/src/test/java/org/zanata/util/SampleProjectProfile.java +++ /dev/null @@ -1,249 +0,0 @@ -package org.zanata.util; - -import com.github.huangp.entityunit.entity.Callbacks; -import com.github.huangp.entityunit.entity.EntityCleaner; -import com.github.huangp.entityunit.entity.EntityMaker; -import com.github.huangp.entityunit.entity.EntityMakerBuilder; -import com.github.huangp.entityunit.entity.FixIdCallback; -import com.github.huangp.entityunit.entity.TakeCopyCallback; -import com.github.huangp.entityunit.maker.FixedValueMaker; -import com.google.common.collect.Lists; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import org.jboss.seam.security.Identity; -import org.zanata.common.ContentType; -import org.zanata.common.LocaleId; -import org.zanata.model.Activity; -import org.zanata.model.HAccount; -import org.zanata.model.HAccountActivationKey; -import org.zanata.model.HAccountRole; -import org.zanata.model.HApplicationConfiguration; -import org.zanata.model.HDocument; -import org.zanata.model.HGlossaryEntry; -import org.zanata.model.HGlossaryTerm; -import org.zanata.model.HIterationGroup; -import org.zanata.model.HLocale; -import org.zanata.model.HLocaleMember; -import org.zanata.model.HPerson; -import org.zanata.model.HProject; -import org.zanata.model.HProjectIteration; -import org.zanata.model.HTermComment; -import org.zanata.model.HTextFlow; -import org.zanata.model.HTextFlowTarget; -import org.zanata.model.HTextFlowTargetHistory; -import org.zanata.model.po.HPoTargetHeader; -import org.zanata.model.security.HCredentials; - -import javax.persistence.EntityManager; -import javax.persistence.Query; - -/** - * @author Patrick Huang pahuang@redhat.com - */ -@Slf4j -@Getter -public class SampleProjectProfile { - - private final EntityManager entityManager; - private HLocale frLocale; - private HLocale enUSLocale; - private HLocale hiLocale; - private HLocale plLocale; - - private HPerson translator; - private HPerson admin; - private HPerson glossarist; - private HPerson glossaryAdmin; - - @Getter - private TakeCopyCallback projectCopy; - - public SampleProjectProfile() { - this.entityManager = - EntityManagerFactoryHolder.holder().getEmFactory() - .createEntityManager(); - Identity.setSecurityEnabled(false); - } - - public void deleteExceptEssentialData() { - EntityCleaner.deleteAll(entityManager, Lists.newArrayList( - Activity.class, - // glossary - HTermComment.class, HGlossaryTerm.class, HGlossaryEntry.class, - // tex flows and targets - HPoTargetHeader.class, HTextFlowTargetHistory.class, - HTextFlowTarget.class, HTextFlow.class, HDocument.class, - // locales - HLocaleMember.class, HLocale.class, - // version group - HIterationGroup.class, - // project - HProjectIteration.class, HProject.class, - // account - HAccountActivationKey.class, HCredentials.class, HPerson.class, HAccount.class)); - enUSLocale = - forLocale(false, LocaleId.EN_US).makeAndPersist(entityManager, - HLocale.class); - entityManager.getTransaction().begin(); - Query query = entityManager.createQuery( - "update HApplicationConfiguration set value = '' where key = :key"); - query.setParameter("key", HApplicationConfiguration.KEY_HOME_CONTENT); - query.executeUpdate(); - query.setParameter("key", HApplicationConfiguration.KEY_HELP_CONTENT); - query.executeUpdate(); - entityManager.getTransaction().commit(); - } - - public void makeSampleLanguages() { - frLocale = - forLocale(true, LocaleId.FR).makeAndPersist(entityManager, - HLocale.class); - - hiLocale = - forLocale(true, new LocaleId("hi")).makeAndPersist( - entityManager, HLocale.class); - - plLocale = - forLocale(true, new LocaleId("pl")).makeAndPersist( - entityManager, HLocale.class); - } - - private static EntityMaker forLocale(boolean enabledByDefault, - LocaleId localeId) { - return EntityMakerBuilder - .builder() - .addFieldOrPropertyMaker(HLocale.class, "active", - FixedValueMaker.ALWAYS_TRUE_MAKER) - .addFieldOrPropertyMaker(HLocale.class, "enabledByDefault", - FixedValueMaker.fix(enabledByDefault)) - .addConstructorParameterMaker(HLocale.class, 0, - FixedValueMaker.fix(localeId)).build(); - } - - public void makeSampleUsers() { - HAccount adminAccount = - makeAccount("admin", "Eyox7xbNQ09MkIfRyH+rjg==", - "b6d7044e9ee3b2447c28fb7c50d86d98", 1L); - assignAccountRole(1L, "admin"); - - admin = makePerson(1L, "Administrator", "admin"); - assignAccountToPerson(adminAccount, admin); - - HAccount translatorAccount = - makeAccount("translator", "Fr5JHlcaEqKLSHjnBm4gXg==", - "d83882201764f7d339e97c4b087f0806", 2L); - assignAccountRole(2L, "user"); - translator = makePerson(2L, "translator", "translator"); - assignAccountToPerson(translatorAccount, translator); - - HAccount glossaristAccount = - makeAccount("glossarist", "fRIeiPDPlSMtHbBNoqDjNQ==", - "b1e3daa18e41c0ce79829e87ce66b201", 3L); - assignAccountRole(3L, "glossarist"); - glossarist = makePerson(3L, "glossarist", "glossarist"); - assignAccountToPerson(glossaristAccount, glossarist); - - HAccount gAdminAccount = - makeAccount("glossaryadmin", "/W0YpteXk+WtymQ7H84kPQ==", - "5a6a34d28d39ff90ea47402311f339d4", 4L); - assignAccountRole(4L, "glossary-admin"); - glossaryAdmin = makePerson(4L, "glossary-admin", "glossary-admin"); - assignAccountToPerson(gAdminAccount, glossaryAdmin); - } - - private HPerson makePerson(Long wantedIdValue, String nameValue, - String username) { - return EntityMakerBuilder - .builder() - .addFieldOrPropertyMaker(HPerson.class, "name", - FixedValueMaker.fix(nameValue)) - .addFieldOrPropertyMaker(HPerson.class, "email", - FixedValueMaker.fix(username + "@example.com")) - .build() - .makeAndPersist(entityManager, HPerson.class, - new FixIdCallback(HPerson.class, wantedIdValue)); - } - - private void assignAccountToPerson(HAccount account, HPerson hPerson) { - entityManager.getTransaction().begin(); - hPerson.setAccount(account); - entityManager.getTransaction().commit(); - } - - private void assignAccountRole(Long accountId, String roleName) { - entityManager.getTransaction().begin(); - entityManager.find(HAccount.class, accountId).getRoles() - .add(getAccountRole(roleName)); - entityManager.getTransaction().commit(); - } - - private HAccountRole getAccountRole(String roleName) { - log.debug("get account role with name {}", roleName); - return entityManager.createQuery( - String.format("from HAccountRole where name = '%s' ", roleName), - HAccountRole.class) - .getSingleResult(); - } - - public void addUsersToLanguage(HPerson person, HLocale... locales) { - entityManager.getTransaction().begin(); - for (HLocale locale : locales) { - entityManager.persist(asLocaleMember(person, locale)); - } - entityManager.getTransaction().commit(); - } - - private static HLocaleMember asLocaleMember(HPerson person, HLocale locale) { - return new HLocaleMember(person, locale, true, false, false); - } - - private HAccount makeAccount(String username, String passwordHash, - String apiKey, Long accountId) { - EntityMaker maker = EntityMakerBuilder - .builder() - // .includeOptionalOneToOne() - .addFieldOrPropertyMaker(HAccount.class, "enabled", - FixedValueMaker.ALWAYS_TRUE_MAKER) - .addFieldOrPropertyMaker(HAccount.class, "username", - FixedValueMaker.fix(username)) - .addFieldOrPropertyMaker(HAccount.class, - "passwordHash", - FixedValueMaker.fix(passwordHash)) - .addFieldOrPropertyMaker(HAccount.class, "apiKey", - FixedValueMaker.fix(apiKey)) - .build(); - return maker.makeAndPersist(entityManager, HAccount.class, - new FixIdCallback(HAccount.class, accountId)); - } - - public void makeSampleProject() { - EntityMaker maker = EntityMakerBuilder - .builder() - // project - .addFieldOrPropertyMaker(HProject.class, "slug", - FixedValueMaker.fix("about-fedora")) - .addFieldOrPropertyMaker(HProject.class, "name", - FixedValueMaker.fix("about fedora")) - // iteration - .addFieldOrPropertyMaker(HProjectIteration.class, - "slug", FixedValueMaker.fix("master")) - // document - // public HDocument(String docId, String name, String path, - // ContentType contentType, HLocale locale) - .addConstructorParameterMaker(HDocument.class, 0, - FixedValueMaker.fix("About_Fedora")) - .addConstructorParameterMaker(HDocument.class, 1, - FixedValueMaker.fix("About_Fedora")) - .addConstructorParameterMaker(HDocument.class, 2, - FixedValueMaker.EMPTY_STRING_MAKER) - .addConstructorParameterMaker(HDocument.class, 3, - FixedValueMaker.fix(ContentType.PO)) - .reuseEntity(enUSLocale).build(); - - projectCopy = Callbacks.takeCopy(); - maker.makeAndPersist(entityManager, HTextFlowTarget.class, Callbacks.chain( - Callbacks.wireManyToMany(HProject.class, admin), projectCopy)); - } - -} diff --git a/functional-test/src/test/java/org/zanata/util/SampleProjectRule.java b/functional-test/src/test/java/org/zanata/util/SampleProjectRule.java index 207cb5280f..f2b8e01ec6 100644 --- a/functional-test/src/test/java/org/zanata/util/SampleProjectRule.java +++ b/functional-test/src/test/java/org/zanata/util/SampleProjectRule.java @@ -21,9 +21,14 @@ package org.zanata.util; -import lombok.Delegate; +import static org.zanata.util.SampleProjectClient.checkAndReleaseConnection; + +import com.google.common.collect.Sets; +import java.util.HashSet; import lombok.extern.slf4j.Slf4j; import org.junit.rules.ExternalResource; +import org.zanata.common.LocaleId; +import org.zanata.rest.SampleProjectResource; /** * @author Patrick Huang locales = + Sets.newHashSet(LocaleId.FR, new LocaleId("hi"), + new LocaleId("pl")); + checkAndReleaseConnection(resource + .userJoinsLanguageTeams("translator", locales)); + + checkAndReleaseConnection(resource + .userJoinsLanguageTeams("glossarist", locales)); + + checkAndReleaseConnection(resource.makeSampleProject()); } + } diff --git a/functional-test/src/test/resources/concordion/org/zanata/feature/dashboard/Dashboard.html b/functional-test/src/test/resources/concordion/org/zanata/feature/dashboard/Dashboard.html index c126a7b281..62240260ca 100644 --- a/functional-test/src/test/resources/concordion/org/zanata/feature/dashboard/Dashboard.html +++ b/functional-test/src/test/resources/concordion/org/zanata/feature/dashboard/Dashboard.html @@ -5,8 +5,8 @@

- As a user, when I use username: glossarist with - password: glossarist + As a user, when I use username: admin with + password: admin to sign in. I should redirect to dashboard with properties + + + copy + package + + copy + + + + + ${project.groupId} + ${project.artifactId} + ${project.version} + war + true + ${java.io.tmpdir}/zanata-war + zanata-test.war + + + + true