From f8705176892deca12f548c33f47202eab9074dce Mon Sep 17 00:00:00 2001 From: Alex Eng Date: Fri, 6 Mar 2015 11:10:21 +1000 Subject: [PATCH] Add unit test for merge translations --- .../org/zanata/action/VersionHomeAction.java | 7 - .../org/zanata/dao/TextFlowTargetDAO.java | 39 +++-- .../zanata/service/impl/CopyTransWork.java | 31 +--- .../service/impl/CopyVersionServiceImpl.java | 6 + .../impl/MergeTranslationsServiceImpl.java | 50 +++--- .../service/impl/MergeTranslationsWork.java | 65 ++++---- .../org/zanata/util/MessageGenerator.java | 115 +++++++++++++ .../src/main/webapp/iteration/view.xhtml | 1 - .../org/zanata/dao/TextFlowTargetDAOTest.java | 71 +++++--- .../MergeTranslationsServiceImplTest.java | 157 ++++++++++++++++++ .../model/MergeTranslationsData.dbunit.xml | 126 ++++++++++++++ 11 files changed, 545 insertions(+), 123 deletions(-) create mode 100644 zanata-war/src/main/java/org/zanata/util/MessageGenerator.java create mode 100644 zanata-war/src/test/java/org/zanata/service/impl/MergeTranslationsServiceImplTest.java create mode 100644 zanata-war/src/test/resources/org/zanata/test/model/MergeTranslationsData.dbunit.xml diff --git a/zanata-war/src/main/java/org/zanata/action/VersionHomeAction.java b/zanata-war/src/main/java/org/zanata/action/VersionHomeAction.java index 17a9a37c97..b6b5b66d8f 100644 --- a/zanata-war/src/main/java/org/zanata/action/VersionHomeAction.java +++ b/zanata-war/src/main/java/org/zanata/action/VersionHomeAction.java @@ -910,13 +910,6 @@ public String decodeDocId(String docId) { return UrlUtil.decodeString(docId); } - @In - private MergeTranslationsManager mergeTranslationsManager; - - public void test() { - mergeTranslationsManager.startMergeTranslations("abrt", "test16", "abrt", "test1", true); - } - public void uploadTranslationFile(HLocale hLocale) { identity.checkPermission("modify-translation", hLocale, getVersion() .getProject()); diff --git a/zanata-war/src/main/java/org/zanata/dao/TextFlowTargetDAO.java b/zanata-war/src/main/java/org/zanata/dao/TextFlowTargetDAO.java index 3285be741f..d244d81c49 100644 --- a/zanata-war/src/main/java/org/zanata/dao/TextFlowTargetDAO.java +++ b/zanata-war/src/main/java/org/zanata/dao/TextFlowTargetDAO.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.List; +import com.google.common.collect.Lists; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; @@ -490,28 +491,33 @@ public List getTranslationsByMatchedContext(Long sourceVersio Long targetVersionId, int offset, int maxResults, Collection states) { StringBuilder queryBuilder = new StringBuilder(); queryBuilder - .append("select * from HTextFlowTarget tft, HTextFlowTarget tft2 ") - .append("where tft.textFlow.document.version.id = :sourceVersionId ") - .append("and tft2.textFlow.document.version.id = :targetVersionId") - .append("and tft.textFlow.obsolete = false ") - .append("and tft.textFlow.document.obsolete = false ") - .append("and tft.state in :states ") - .append("and tft2.textFlow.obsolete = false ") - .append("and tft2.textFlow.document.obsolete = false ") - .append("and tft.textFlow.contentHash = tft2.textFlow.contentHash ") - .append("and tft.textFlow.document.docId = tft2.textFlow.document.docId"); + .append("select tft, tft2 from HTextFlowTarget tft, HTextFlowTarget tft2 ") + .append("where tft.textFlow.document.projectIteration.id = :sourceVersionId ") + .append("and tft2.textFlow.document.projectIteration.id = :targetVersionId ") + .append("and tft.textFlow.obsolete = false ") + .append("and tft.textFlow.document.obsolete = false ") + .append("and tft.state in :states ") + .append("and tft2.textFlow.obsolete = false ") + .append("and tft2.textFlow.document.obsolete = false ") + .append("and tft.textFlow.contentHash = tft2.textFlow.contentHash ") + .append("and tft.textFlow.document.docId = tft2.textFlow.document.docId"); Query query = getSession() .createQuery(queryBuilder.toString()) .setParameter("sourceVersionId", sourceVersionId) .setParameter("targetVersionId", targetVersionId) - .setParameter("states", states) + .setParameterList("states", states) .setMaxResults(maxResults) .setFirstResult(offset) .setCacheable(true) .setComment("TextFlowTargetDAO.getTranslationsByMatchedContext"); - List results = query.list(); + List results = Lists.newArrayList(); + for(Object result: query.list()) { + Object[] castResults = (Object[])result; + results.add(new HTextFlowTarget[] { (HTextFlowTarget) castResults[0], + (HTextFlowTarget) castResults[1] }); + } return results; } @@ -519,9 +525,9 @@ public int getTranslationsByMatchedContextCount(Long sourceVersionId, Long targetVersionId, Collection states) { StringBuilder queryBuilder = new StringBuilder(); queryBuilder - .append("select count(*) from HTextFlowTarget tft, HTextFlowTarget tft2 ") - .append("where tft.textFlow.document.version.id = :sourceVersionId ") - .append("and tft2.textFlow.document.version.id = :targetVersionId") + .append("select count(tft.id) from HTextFlowTarget tft, HTextFlowTarget tft2 ") + .append("where tft.textFlow.document.projectIteration.id = :sourceVersionId ") + .append("and tft2.textFlow.document.projectIteration.id = :targetVersionId ") .append("and tft.textFlow.obsolete = false ") .append("and tft.textFlow.document.obsolete = false ") .append("and tft.state in :states ") @@ -534,10 +540,9 @@ public int getTranslationsByMatchedContextCount(Long sourceVersionId, .createQuery(queryBuilder.toString()) .setParameter("sourceVersionId", sourceVersionId) .setParameter("targetVersionId", targetVersionId) - .setParameter("states", states) + .setParameterList("states", states) .setCacheable(true) .setComment("TextFlowTargetDAO.getTranslationsByMatchedContextCount"); - Long count = (Long) query.uniqueResult(); return count == null ? 0 : count.intValue(); } diff --git a/zanata-war/src/main/java/org/zanata/service/impl/CopyTransWork.java b/zanata-war/src/main/java/org/zanata/service/impl/CopyTransWork.java index 96bae801c1..88dd148ef5 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/CopyTransWork.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/CopyTransWork.java @@ -16,6 +16,7 @@ import org.zanata.service.TranslationFinder; import org.zanata.service.ValidationService; import org.zanata.service.VersionStateCache; +import org.zanata.util.MessageGenerator; import org.zanata.webtrans.shared.model.ValidationAction; import com.google.common.base.Optional; import com.google.common.base.Stopwatch; @@ -179,23 +180,6 @@ protected Integer work() throws Exception { return numCopied; } - private String createComment(HTextFlowTarget target) { - String author; - HDocument document = target.getTextFlow().getDocument(); - String projectname = - document.getProjectIteration().getProject().getName(); - String version = document.getProjectIteration().getSlug(); - String documentid = document.getDocId(); - if (target.getLastModifiedBy() != null) { - author = ", author " + target.getLastModifiedBy().getName(); - } else { - author = ""; - } - - return "translation auto-copied from project " + projectname - + ", version " + version + ", document " + documentid + author; - } - private void saveCopyTransMatch(final HTextFlowTarget matchingTarget, final HTextFlow originalTf, final HCopyTransOptions options, final boolean requireTranslationReview) { @@ -264,12 +248,15 @@ public Boolean get() { } hTarget.setContents(matchingTarget.getContents()); hTarget.setState(copyState); - HSimpleComment hcomment = hTarget.getComment(); - if (hcomment == null) { - hcomment = new HSimpleComment(); - hTarget.setComment(hcomment); + HSimpleComment hComment = hTarget.getComment(); + if (hComment == null) { + hComment = new HSimpleComment(); + hTarget.setComment(hComment); } - hcomment.setComment(createComment(matchingTarget)); + hComment.setComment(matchingTarget.getComment().getComment()); + + hTarget.setRevisionComment(MessageGenerator + .getCopyTransMessage(matchingTarget)); // TODO Maybe we should think about registering a Hibernate // integrator for these updates diff --git a/zanata-war/src/main/java/org/zanata/service/impl/CopyVersionServiceImpl.java b/zanata-war/src/main/java/org/zanata/service/impl/CopyVersionServiceImpl.java index 7327c836a2..380a7ed764 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/CopyVersionServiceImpl.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/CopyVersionServiceImpl.java @@ -22,6 +22,7 @@ import org.zanata.model.HLocale; import org.zanata.model.HProjectIteration; import org.zanata.model.HRawDocument; +import org.zanata.model.HSimpleComment; import org.zanata.model.HTextFlow; import org.zanata.model.HTextFlowTarget; import org.zanata.model.HTextFlowTargetHistory; @@ -33,6 +34,7 @@ import org.zanata.service.CopyVersionService; import org.zanata.service.VersionStateCache; import org.zanata.util.JPACopier; +import org.zanata.util.MessageGenerator; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -350,6 +352,10 @@ JPACopier. copyBean(tft, "textFlow", "reviewComments", "history"); copy.setTextFlow(newTf); copy.setTextFlowRevision(newTf.getRevision()); + if(tft.getComment() != null) { + copy.setComment(new HSimpleComment(tft.getComment().getComment())); + } + copy.setRevisionComment(MessageGenerator.getCopyVersionMessage(tft)); // copy review comment copy.setReviewComments(Lists diff --git a/zanata-war/src/main/java/org/zanata/service/impl/MergeTranslationsServiceImpl.java b/zanata-war/src/main/java/org/zanata/service/impl/MergeTranslationsServiceImpl.java index a66609f69b..855779f7a4 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/MergeTranslationsServiceImpl.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/MergeTranslationsServiceImpl.java @@ -37,12 +37,13 @@ import org.zanata.dao.ProjectIterationDAO; import org.zanata.dao.TextFlowTargetDAO; import org.zanata.model.HProjectIteration; -import org.zanata.model.HTextFlowTarget; import org.zanata.security.ZanataIdentity; import org.zanata.service.MergeTranslationsService; import com.google.common.base.Optional; import com.google.common.base.Stopwatch; +import org.zanata.service.TranslationStateCache; +import org.zanata.service.VersionStateCache; /** * Service provider for merge translations task. @@ -65,6 +66,13 @@ public class MergeTranslationsServiceImpl implements MergeTranslationsService { @In private ZanataIdentity identity; + @In + private VersionStateCache versionStateCacheImpl; + + @In + private TranslationStateCache translationStateCacheImpl; + + private final static int TRANSLATION_BATCH_SIZE = 50; @Override @@ -76,13 +84,25 @@ public Future startMergeTranslations(String sourceProjectSlug, HProjectIteration sourceVersion = projectIterationDAO.getBySlug(sourceProjectSlug, sourceVersionSlug); + if (sourceVersion == null) { + log.error("Cannot find source version of {}:{}", sourceProjectSlug, + sourceVersionSlug); + return null; + } + HProjectIteration targetVersion = projectIterationDAO.getBySlug(targetProjectSlug, targetVersionSlug); - if(!verifyVersions(sourceVersion, targetVersion)) { + if (targetVersion == null) { + log.error("Cannot find target version of {}:{}", targetProjectSlug, + targetVersionSlug); return null; } + if(isVersionsEmpty(sourceVersion, targetVersion)) { + return null; + } + Optional taskHandleOpt = Optional.fromNullable(handle); @@ -113,6 +133,7 @@ public Future startMergeTranslations(String sourceProjectSlug, startCount += TRANSLATION_BATCH_SIZE; } + versionStateCacheImpl.clearVersionStatsCache(targetVersion.getId()); log.info("merge translation end: from {} to {}, {}", sourceProjectSlug + ":" + sourceVersionSlug, targetProjectSlug + ":" + targetVersionSlug, overallStopwatch); @@ -120,13 +141,13 @@ public Future startMergeTranslations(String sourceProjectSlug, return AsyncTaskResult.taskResult(); } - private int mergeTranslationBatch(Long sourceVersionId, + protected int mergeTranslationBatch(Long sourceVersionId, Long targetVersionId, boolean useLatestTranslatedString, int offset, int batchSize) { try { return new MergeTranslationsWork(sourceVersionId, targetVersionId, offset, batchSize, useLatestTranslatedString, - textFlowTargetDAO).workInTransaction(); + textFlowTargetDAO, translationStateCacheImpl).workInTransaction(); } catch (Exception e) { log.warn("exception during copy text flow target", e); return 0; @@ -134,36 +155,25 @@ private int mergeTranslationBatch(Long sourceVersionId, } /** - * Check if sourceVersion or targetVersion exists and there's document in - * both + * Check if sourceVersion or targetVersion has source document. * * @param sourceVersion * @param targetVersion * @return */ - private boolean verifyVersions(HProjectIteration sourceVersion, + private boolean isVersionsEmpty(HProjectIteration sourceVersion, HProjectIteration targetVersion) { - if (sourceVersion == null) { - log.error("Cannot find source version of {}:{}", sourceVersion - .getProject().getSlug(), sourceVersion.getSlug()); - return false; - } - if (targetVersion == null) { - log.error("Cannot find target version of {}:{}", targetVersion - .getProject().getSlug(), targetVersion.getSlug()); - return false; - } if(sourceVersion.getDocuments().isEmpty()) { log.error("No documents in source version {}:{}", sourceVersion .getProject().getSlug(), sourceVersion.getSlug()); - return false; + return true; } if(targetVersion.getDocuments().isEmpty()) { log.error("No documents in target version {}:{}", targetVersion .getProject().getSlug(), targetVersion.getSlug()); - return false; + return true; } - return true; + return false; } private void prepareMergeTranslationsHandle( diff --git a/zanata-war/src/main/java/org/zanata/service/impl/MergeTranslationsWork.java b/zanata-war/src/main/java/org/zanata/service/impl/MergeTranslationsWork.java index 1b2d7f50a1..08d8ccabd5 100644 --- a/zanata-war/src/main/java/org/zanata/service/impl/MergeTranslationsWork.java +++ b/zanata-war/src/main/java/org/zanata/service/impl/MergeTranslationsWork.java @@ -8,19 +8,15 @@ import org.jboss.seam.core.Events; import org.jboss.seam.util.Work; import org.zanata.common.ContentState; -import org.zanata.dao.TextFlowDAO; import org.zanata.dao.TextFlowTargetDAO; import org.zanata.events.TextFlowTargetStateEvent; -import org.zanata.model.HDocument; import org.zanata.model.HSimpleComment; import org.zanata.model.HTextFlow; import org.zanata.model.HTextFlowTarget; -import org.zanata.model.HTextFlowTargetReviewComment; -import org.zanata.service.CopyVersionService; -import org.zanata.util.JPACopier; +import org.zanata.service.TranslationStateCache; import com.google.common.base.Stopwatch; -import com.google.common.collect.Lists; +import org.zanata.util.MessageGenerator; /** * Merge translation and persist in trasaction. @@ -44,15 +40,17 @@ public class MergeTranslationsWork extends Work { private final Long targetVersionId; private final int batchStart; private final int batchLength; - private final boolean useLatestTranslatedString; private final TextFlowTargetDAO textFlowTargetDAO; + private final TranslationStateCache translationStateCacheImpl; + @Override protected Integer work() throws Exception { Stopwatch stopwatch = Stopwatch.createStarted(); + //TODO: remove this stopwatch Stopwatch queryStopwatch = Stopwatch.createStarted(); List matches = textFlowTargetDAO.getTranslationsByMatchedContext( @@ -61,7 +59,9 @@ protected Integer work() throws Exception { queryStopwatch.stop(); log.info("query time {}", queryStopwatch); - log.info("start merge translation from version {} to {} batch {}", sourceVersionId, targetVersionId, batchStart + " to " + batchLength); + log.info("start merge translation from version {} to {} batch {}", + sourceVersionId, targetVersionId, batchStart + " to " + + batchLength); for(HTextFlowTarget[] results : matches) { HTextFlowTarget sourceTft = results[0]; @@ -70,24 +70,37 @@ protected Integer work() throws Exception { ContentState oldState = targetTft.getState(); - //should merge target.content, state only targetTft.setContents(sourceTft.getContents()); targetTft.setState(sourceTft.getState()); targetTft.setLastChanged(sourceTft.getLastChanged()); targetTft.setLastModifiedBy(sourceTft.getLastModifiedBy()); targetTft.setTranslator(sourceTft.getTranslator()); - targetTft.setComment(sourceTft.getComment()); - targetTft.setRevisionComment(createComment(sourceTft)); + + HSimpleComment hComment = targetTft.getComment(); + if (hComment == null) { + hComment = new HSimpleComment(); + targetTft.setComment(hComment); + } + hComment.setComment(sourceTft.getComment().getComment()); + + + targetTft.setRevisionComment(MessageGenerator + .getMergeTranslationMessage(sourceTft)); textFlowTargetDAO.makePersistent(targetTft); HTextFlow tf = targetTft.getTextFlow(); - Events.instance().raiseTransactionSuccessEvent( - TextFlowTargetStateEvent.EVENT_NAME, - new TextFlowTargetStateEvent(null, targetVersionId, - tf.getDocument().getId(), tf.getId(), targetTft - .getLocale().getLocaleId(), targetTft - .getId(), targetTft.getState(), oldState)); + if(Events.exists()) { + Events.instance().raiseTransactionSuccessEvent( + TextFlowTargetStateEvent.EVENT_NAME, + new TextFlowTargetStateEvent(null, targetVersionId, + tf.getDocument().getId(), tf.getId(), targetTft + .getLocale().getLocaleId(), targetTft + .getId(), targetTft.getState(), oldState)); + } + + translationStateCacheImpl.clearDocumentStatistics(targetTft + .getTextFlow().getDocument().getId()); } } stopwatch.stop(); @@ -96,24 +109,6 @@ protected Integer work() throws Exception { return matches.size(); } - private String createComment(HTextFlowTarget sourceTft) { - StringBuilder comment = new StringBuilder(); - HDocument document = sourceTft.getTextFlow().getDocument(); - - comment.append("translation auto-copied from project ") - .append(document.getProjectIteration().getProject().getName()) - .append(", version ") - .append(document.getProjectIteration().getSlug()) - .append(", document ") - .append(document.getDocId()); - - if (sourceTft.getLastModifiedBy() != null) { - comment.append(", author ") - .append(sourceTft.getLastModifiedBy().getName()); - } - return comment.toString(); - } - // @formatter:off /** * Rule of which translation should merge diff --git a/zanata-war/src/main/java/org/zanata/util/MessageGenerator.java b/zanata-war/src/main/java/org/zanata/util/MessageGenerator.java new file mode 100644 index 0000000000..f991602c74 --- /dev/null +++ b/zanata-war/src/main/java/org/zanata/util/MessageGenerator.java @@ -0,0 +1,115 @@ +/* + * 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.util; + +import org.apache.commons.lang.StringUtils; +import org.zanata.model.HDocument; +import org.zanata.model.HTextFlowTarget; + +/** + * Generate messages/comments of Zanata business actions + * + * @author Alex Eng aeng@redhat.com + */ +public class MessageGenerator { + + /** + * Prefix of action type for generated message + */ + private static final String PREFIX_MERGE_TRANS = "Merge translations"; + private static final String PREFIX_COPY_TRANS = "Copy translation"; + private static final String PREFIX_COPY_VERSION = "Copy version"; + + /** + * Create Zanata generated comment for merge translation + * @see org.zanata.service.MergeTranslationsService + * + * @param tft - HTextFlowTarget to copy from + */ + public static final String getMergeTranslationMessage( + HTextFlowTarget tft) { + HDocument document = tft.getTextFlow().getDocument(); + String author = ""; + if (tft.getLastModifiedBy() != null) { + author = tft.getLastModifiedBy().getName(); + } + + return generateAutoCopiedMessage(PREFIX_MERGE_TRANS, + document.getProjectIteration().getProject().getName(), + document.getProjectIteration() + .getSlug(), document.getDocId(), author); + } + + /** + * Create Zanata generated comment for copy trans + * @see org.zanata.service.CopyTransService + * + * @param tft - HTextFlowTarget to copy from + */ + public static final String getCopyTransMessage(HTextFlowTarget tft) { + HDocument document = tft.getTextFlow().getDocument(); + String author = ""; + if (tft.getLastModifiedBy() != null) { + author = tft.getLastModifiedBy().getName(); + } + return generateAutoCopiedMessage(PREFIX_COPY_TRANS, + document.getProjectIteration() + .getProject().getName(), document.getProjectIteration() + .getSlug(), document.getDocId(), author); + } + + /** + * Create Zanata generated comment for copy version + * @see org.zanata.service.CopyVersionService + * + * @param tft - HTextFlowTarget to copy from + */ + public static final String getCopyVersionMessage(HTextFlowTarget tft) { + HDocument document = tft.getTextFlow().getDocument(); + String author = ""; + if (tft.getLastModifiedBy() != null) { + author = tft.getLastModifiedBy().getName(); + } + return generateAutoCopiedMessage(PREFIX_COPY_VERSION, + document.getProjectIteration().getProject().getName(), + document.getProjectIteration() + .getSlug(), document.getDocId(), author); + } + + private static final String generateAutoCopiedMessage(String prefix, + String projectName, String versionSlug, String docId, String author) { + StringBuilder comment = new StringBuilder(); + + comment.append(prefix + ": translation auto-copied from project ") + .append(projectName) + .append(", version ") + .append(versionSlug) + .append(", document ") + .append(docId); + + if (!StringUtils.isEmpty(author)) { + comment.append(", author ") + .append(author); + } + return comment.toString(); + } +} diff --git a/zanata-war/src/main/webapp/iteration/view.xhtml b/zanata-war/src/main/webapp/iteration/view.xhtml index a78cabe9c5..b7a475d218 100644 --- a/zanata-war/src/main/webapp/iteration/view.xhtml +++ b/zanata-war/src/main/webapp/iteration/view.xhtml @@ -357,7 +357,6 @@
  • - test diff --git a/zanata-war/src/test/java/org/zanata/dao/TextFlowTargetDAOTest.java b/zanata-war/src/test/java/org/zanata/dao/TextFlowTargetDAOTest.java index 86212ab05f..d0ff0c9a92 100644 --- a/zanata-war/src/test/java/org/zanata/dao/TextFlowTargetDAOTest.java +++ b/zanata-war/src/test/java/org/zanata/dao/TextFlowTargetDAOTest.java @@ -20,24 +20,21 @@ */ package org.zanata.dao; +import lombok.extern.slf4j.Slf4j; + import org.dbunit.operation.DatabaseOperation; -import org.hibernate.ScrollableResults; import org.hibernate.Session; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import org.zanata.ZanataDbunitJpaTest; import org.zanata.common.ContentState; -import org.zanata.model.HDocument; -import org.zanata.model.HLocale; -import org.zanata.model.HTextFlow; +import org.zanata.model.HProjectIteration; import org.zanata.model.HTextFlowTarget; -import lombok.Cleanup; -import lombok.extern.slf4j.Slf4j; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.greaterThan; -import static org.hamcrest.Matchers.is; +import java.util.Collection; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; @Test(groups = { "jpa-tests" }) @Slf4j @@ -48,20 +45,17 @@ public class TextFlowTargetDAOTest extends ZanataDbunitJpaTest { @Override protected void prepareDBUnitOperations() { beforeTestOperations.add(new DataSetOperation( - "org/zanata/test/model/ClearAllTables.dbunit.xml", - DatabaseOperation.DELETE_ALL)); + "org/zanata/test/model/ClearAllTables.dbunit.xml", + DatabaseOperation.CLEAN_INSERT)); beforeTestOperations.add(new DataSetOperation( - "org/zanata/test/model/AccountData.dbunit.xml", - DatabaseOperation.CLEAN_INSERT)); + "org/zanata/test/model/AccountData.dbunit.xml", + DatabaseOperation.CLEAN_INSERT)); beforeTestOperations.add(new DataSetOperation( - "org/zanata/test/model/ProjectsData.dbunit.xml", - DatabaseOperation.CLEAN_INSERT)); + "org/zanata/test/model/LocalesData.dbunit.xml", + DatabaseOperation.CLEAN_INSERT)); beforeTestOperations.add(new DataSetOperation( - "org/zanata/test/model/TextFlowTestData.dbunit.xml", - DatabaseOperation.CLEAN_INSERT)); - beforeTestOperations.add(new DataSetOperation( - "org/zanata/test/model/LocalesData.dbunit.xml", - DatabaseOperation.CLEAN_INSERT)); + "org/zanata/test/model/MergeTranslationsData.dbunit.xml", + DatabaseOperation.CLEAN_INSERT)); } @BeforeMethod(firstTimeOnly = true) @@ -70,4 +64,39 @@ public void setup() { new TextFlowTargetDAO((Session) getEm().getDelegate()); } + @Test + public void testGetTranslationsByMatchedContext() { + + Collection states = ContentState.TRANSLATED_STATES; + String projectSlug = "sample-project"; + + String fromVersionSlug = "1.0"; + String toVersionSlug = "2.0"; + + ProjectIterationDAO projectIterationDAO = new + ProjectIterationDAO((Session) getEm().getDelegate()); + + HProjectIteration fromVersion = + projectIterationDAO.getBySlug(projectSlug, fromVersionSlug); + assertThat(fromVersion).isNotNull(); + + HProjectIteration toVersion = + projectIterationDAO.getBySlug(projectSlug, toVersionSlug); + assertThat(toVersion).isNotNull(); + + List results = + textFlowTargetDAO.getTranslationsByMatchedContext( + fromVersion.getId(), toVersion.getId(), 0, 100, states); + + assertThat(results).isNotEmpty(); + + for(HTextFlowTarget[] result: results) { + assertThat(result[0].getState()).isIn(states); + assertThat(result[0].getTextFlow().getContentHash()).isEqualTo( + result[1].getTextFlow().getContentHash()); + assertThat(result[0].getTextFlow().getDocument().getDocId()) + .isEqualTo(result[1].getTextFlow().getDocument().getDocId()); + } + } + } diff --git a/zanata-war/src/test/java/org/zanata/service/impl/MergeTranslationsServiceImplTest.java b/zanata-war/src/test/java/org/zanata/service/impl/MergeTranslationsServiceImplTest.java new file mode 100644 index 0000000000..947fbb0d8f --- /dev/null +++ b/zanata-war/src/test/java/org/zanata/service/impl/MergeTranslationsServiceImplTest.java @@ -0,0 +1,157 @@ +/* + * 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.service.impl; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; + +import java.util.concurrent.Future; + +import org.dbunit.operation.DatabaseOperation; +import org.mockito.Matchers; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; +import org.zanata.ZanataDbunitJpaTest; +import org.zanata.dao.ProjectIterationDAO; +import org.zanata.dao.TextFlowTargetDAO; +import org.zanata.file.FileSystemPersistService; +import org.zanata.model.HProjectIteration; +import org.zanata.seam.SeamAutowire; +import org.zanata.security.ZanataIdentity; + +@Test(groups = { "business-tests" }) +public class MergeTranslationsServiceImplTest extends ZanataDbunitJpaTest { + private SeamAutowire seam = SeamAutowire.instance(); + + @Mock + private ZanataIdentity identity; + + @Mock + private FileSystemPersistService fileSystemPersistService; + + private ProjectIterationDAO projectIterationDAO; + + private TextFlowTargetDAO textFlowTargetDAO; + + private MergeTranslationsServiceImpl service; + + private final String projectSlug = "sample-project"; + + @Override + protected void prepareDBUnitOperations() { + beforeTestOperations.add(new DataSetOperation( + "org/zanata/test/model/ClearAllTables.dbunit.xml", + DatabaseOperation.CLEAN_INSERT)); + beforeTestOperations.add(new DataSetOperation( + "org/zanata/test/model/AccountData.dbunit.xml", + DatabaseOperation.CLEAN_INSERT)); + beforeTestOperations.add(new DataSetOperation( + "org/zanata/test/model/LocalesData.dbunit.xml", + DatabaseOperation.CLEAN_INSERT)); + beforeTestOperations.add(new DataSetOperation( + "org/zanata/test/model/MergeTranslationsData.dbunit.xml", + DatabaseOperation.CLEAN_INSERT)); + } + + @BeforeMethod + protected void beforeMethod() throws Exception { + MockitoAnnotations.initMocks(this); + + projectIterationDAO = new ProjectIterationDAO(getSession()); + textFlowTargetDAO = new TextFlowTargetDAO(getSession()); + + service = seam.reset() + .use("projectIterationDAO", projectIterationDAO) + .use("textFlowTargetDAO", textFlowTargetDAO) + .use("entityManager", getEm()) + .use("session", getSession()) + .use("identity", identity) + .useImpl(VersionStateCacheImpl.class) + .useImpl(TranslationStateCacheImpl.class) + .ignoreNonResolvable() + .autowire(MergeTranslationsServiceImpl.class); + } + + @Test + public void testCopyVersionNotExist() { + String sourceVersionSlug = "1.0"; + String targetVersionSlug = "non-exist-version"; + Future future = service.startMergeTranslations(projectSlug, + sourceVersionSlug, projectSlug, targetVersionSlug, true, null); + verifyZeroInteractions(identity); + assertThat(future).isEqualTo(null); + } + + @Test + public void testCopyVersionEmptyDoc() { + String sourceVersionSlug = "1.0"; + String targetVersionSlug = "3.0"; + Future future = service.startMergeTranslations(projectSlug, + sourceVersionSlug, projectSlug, targetVersionSlug, true, null); + verifyZeroInteractions(identity); + assertThat(future).isEqualTo(null); + } + + @Test + public void testCopyVersion() { + String sourceVersionSlug = "1.0"; + String targetVersionSlug = "2.0"; + boolean useLatestTranslatedString = false; + + HProjectIteration expectedSourceVersion = projectIterationDAO.getBySlug( + projectSlug, sourceVersionSlug); + assertThat(expectedSourceVersion).isNotNull(); + + HProjectIteration expectedTargetVersion = projectIterationDAO.getBySlug( + projectSlug, targetVersionSlug); + assertThat(expectedTargetVersion).isNotNull(); + + + MergeTranslationsServiceImpl spyService = spy(service); + spyService.startMergeTranslations(projectSlug, sourceVersionSlug, + projectSlug, targetVersionSlug, useLatestTranslatedString, null); + + verify(spyService).mergeTranslationBatch(Matchers.eq( + expectedSourceVersion.getId()), + Matchers.eq(expectedTargetVersion.getId()), + Matchers.eq(useLatestTranslatedString), + Matchers.anyInt(), Matchers.anyInt()); + + // check generated comments + // check use latest translated if enabled + // check non translated/approved is not being used + } + + @Test + public void testDocIdAndContentHash() { + /** + * this test is covered by @see org.zanata.dao.TextFlowTargetDAOTest# + * testGetTranslationsByMatchedContext + * + * check different docId won't copy + * check different tf.contentHash won't copy + */ + } +} diff --git a/zanata-war/src/test/resources/org/zanata/test/model/MergeTranslationsData.dbunit.xml b/zanata-war/src/test/resources/org/zanata/test/model/MergeTranslationsData.dbunit.xml new file mode 100644 index 0000000000..6b3f109e4c --- /dev/null +++ b/zanata-war/src/test/resources/org/zanata/test/model/MergeTranslationsData.dbunit.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +