Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion inc/Smartling/Helpers/DetectChangesHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ private function update(SubmissionEntity $submission, bool $needUpdateStatus, st
vsprintf('Submission id=%s has outdated hash. Setting up Outdated flag.', [$submission->getId()])
);
$submission->setOutdated(SubmissionEntity::FLAG_CONTENT_IS_OUT_OF_DATE);
if ($needUpdateStatus) {
if ($needUpdateStatus && !$submission->isInstantTranslation()) {
$newStatus = SubmissionEntity::SUBMISSION_STATUS_NEW;

$this->getLogger()->debug(
Expand Down
5 changes: 4 additions & 1 deletion inc/Smartling/Jobs/LastModifiedCheckJob.php
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,10 @@ private function lastModifiedCheck(string $queueName, bool $failMissing): void
continue;
}
foreach ($serializedPair as $serializedSubmissions) {
$submissionList = $this->processTestRun($this->submissionManager->findByIds($serializedSubmissions));
$submissionList = array_values(array_filter(
$this->processTestRun($this->submissionManager->findByIds($serializedSubmissions)),
static fn (SubmissionEntity $submission) => !$submission->isInstantTranslation(),
));

try {
$submissions = $this->processFileUriSet($submissionList, $failMissing);
Expand Down
3 changes: 3 additions & 0 deletions inc/Smartling/Jobs/SubmissionCollectorJob.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ public function run(string $source): void
if (0 < count($preparedList)) {
foreach ($preparedList as $_result) {
$fileUri = &$_result['fileUri'];
if (SubmissionEntity::isInstantTranslationFileUri((string)$fileUri)) {
continue;
}
$idsList = explode(',', $_result['ids']);
array_walk($idsList, function (& $id) {
$id = (int)$id;
Expand Down
13 changes: 13 additions & 0 deletions inc/Smartling/Submissions/SubmissionEntity.php
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,19 @@ public function setOutdated(?int $outdated): void
$this->stateFields[static::FIELD_OUTDATED] = $outdated;
}

/**
* Instant translation stores "fileUid:mtUid" in file_uri instead of a Smartling file URI.
*/
public static function isInstantTranslationFileUri(string $fileUri): bool
{
return preg_match('/^[A-Za-z0-9_-]+:[A-Za-z0-9_-]+$/', $fileUri) === 1;
}

public function isInstantTranslation(): bool
{
return self::isInstantTranslationFileUri($this->getFileUri());
}

public function isCloned(): bool
{
return $this->getIsCloned() === 1;
Expand Down
45 changes: 45 additions & 0 deletions tests/Smartling/Helpers/DetectChangesHelperTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,51 @@ public function testSubmissionStatusChange()
->detectChanges(1, 2, AcfDynamicSupport::REFERENCED_TYPE_POST);
}

/**
* @dataProvider outdatedSubmissionDataProvider
*/
public function testOutdatedSubmissionUploadEnqueue(bool $instantTranslation): void
{
$profile = $this->createMock(ConfigurationProfileEntity::class);
$profile->method('getUploadOnUpdate')->willReturn(ConfigurationProfileEntity::UPLOAD_ON_CHANGE_AUTO);
$settingsManager = $this->createMock(SettingsManager::class);
$settingsManager->method('findEntityByMainLocale')->willReturn([$profile]);
$settingsManager->method('getSingleSettingsProfile')->willReturn($profile);

$submission = $this->createMock(SubmissionEntity::class);
$submission->method('getId')->willReturn(5);
$submission->method('getSourceContentHash')->willReturn('old');
$submission->method('isInstantTranslation')->willReturn($instantTranslation);
$submission->expects($instantTranslation ? $this->never() : $this->once())->method('setStatus')
->with(SubmissionEntity::SUBMISSION_STATUS_NEW);
$submission->expects($this->once())->method('setOutdated')->with(SubmissionEntity::FLAG_CONTENT_IS_OUT_OF_DATE);

$submissionManager = $this->createMock(SubmissionManager::class);
$submissionManager->method('find')->willReturn([$submission]);

$contentSerializationHelper = $this->createMock(ContentSerializationHelper::class);
$contentSerializationHelper->method('calculateHash')->willReturn('new');

$uploadQueueManager = $this->createMock(UploadQueueManager::class);
$uploadQueueManager->expects($instantTranslation ? $this->never() : $this->once())->method('enqueue');

(new DetectChangesHelper(
$this->createMock(AcfDynamicSupport::class),
$contentSerializationHelper,
$uploadQueueManager,
$settingsManager,
$submissionManager,
))->detectChanges(1, 2, 'post');
}

public function outdatedSubmissionDataProvider(): array
{
return [
'regular submission is moved to New and enqueued' => [false],
'instant translation submission is only flagged outdated' => [true],
];
}

public function testAcfFieldGroupNoSubmissionStatusChange()
{
$settingsManager = $this->createMock(SettingsManager::class);
Expand Down
69 changes: 69 additions & 0 deletions tests/Smartling/Jobs/LastModifiedCheckJobTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<?php

namespace Smartling\Tests\Smartling\Jobs;

use PHPUnit\Framework\TestCase;
use Smartling\ApiWrapperInterface;
use Smartling\Helpers\Cache;
use Smartling\Jobs\LastModifiedCheckJob;
use Smartling\Queue\QueueInterface;
use Smartling\Settings\SettingsManager;
use Smartling\Submissions\SubmissionEntity;
use Smartling\Submissions\SubmissionManager;
use Smartling\Tests\Mocks\WordpressFunctionsMockHelper;

class LastModifiedCheckJobTest extends TestCase
{
public function setUp(): void
{
WordpressFunctionsMockHelper::injectFunctionsMocks();
}

/**
* @dataProvider queueDataProvider
*/
public function testInstantTranslationSubmissionsAreNotChecked(string $queueName): void
{
$submission = $this->createMock(SubmissionEntity::class);
$submission->method('isInstantTranslation')->willReturn(true);
$submission->expects($this->never())->method('setStatus');

$submissionManager = $this->createMock(SubmissionManager::class);
$submissionManager->method('findByIds')->willReturn([$submission]);
$submissionManager->expects($this->never())->method('setErrorMessage');

$api = $this->createMock(ApiWrapperInterface::class);
$api->expects($this->never())->method('lastModified');
$api->expects($this->never())->method('getStatusForAllLocales');

$queue = $this->createMock(QueueInterface::class);
$pending = [
QueueInterface::QUEUE_NAME_LAST_MODIFIED_CHECK_QUEUE => [],
QueueInterface::QUEUE_NAME_LAST_MODIFIED_CHECK_AND_FAIL_QUEUE => [],
];
$pending[$queueName][] = ['fileuid:mtuid' => [1]];
$queue->method('dequeue')->willReturnCallback(
static function (string $name) use (&$pending) {
return array_shift($pending[$name]) ?? false;
}
);

(new LastModifiedCheckJob(
$api,
$this->createMock(Cache::class),
$this->createMock(SettingsManager::class),
$submissionManager,
0,
'',
$queue,
))->run('');
}

public function queueDataProvider(): array
{
return [
'last modified check queue' => [QueueInterface::QUEUE_NAME_LAST_MODIFIED_CHECK_QUEUE],
'last modified check and fail queue' => [QueueInterface::QUEUE_NAME_LAST_MODIFIED_CHECK_AND_FAIL_QUEUE],
];
}
}
46 changes: 46 additions & 0 deletions tests/Smartling/Jobs/SubmissionCollectorJobTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

namespace Smartling\Tests\Smartling\Jobs;

use PHPUnit\Framework\TestCase;
use Smartling\ApiWrapperInterface;
use Smartling\Helpers\Cache;
use Smartling\Helpers\FileUriHelper;
use Smartling\Jobs\SubmissionCollectorJob;
use Smartling\Queue\QueueInterface;
use Smartling\Settings\SettingsManager;
use Smartling\Submissions\SubmissionManager;
use Smartling\Tests\Mocks\WordpressFunctionsMockHelper;

class SubmissionCollectorJobTest extends TestCase
{
public function setUp(): void
{
WordpressFunctionsMockHelper::injectFunctionsMocks();
}

public function testInstantTranslationSubmissionsAreNotQueued(): void
{
$submissionManager = $this->createMock(SubmissionManager::class);
$submissionManager->method('find')->willReturn([]);
$submissionManager->method('getGroupedIdsByFileUri')->willReturn([
['fileUri' => '/page_post_1_5.xml', 'ids' => '1,2'],
['fileUri' => 'fileuid123:mtuid456', 'ids' => '3'],
]);

$queue = $this->createMock(QueueInterface::class);
$queue->expects($this->once())->method('enqueue')
->with(['/page_post_1_5.xml' => [1, 2]], QueueInterface::QUEUE_NAME_LAST_MODIFIED_CHECK_QUEUE);

(new SubmissionCollectorJob(
$this->createMock(ApiWrapperInterface::class),
$this->createMock(Cache::class),
$this->createMock(FileUriHelper::class),
$this->createMock(SettingsManager::class),
$submissionManager,
0,
'',
$queue,
))->run('');
}
}
21 changes: 21 additions & 0 deletions tests/Smartling/Submissions/SubmissionEntityTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,25 @@ public function completionPercentageDataProvider(): array
[1000000, 0, 999999, 0, 99, 'Must return 99% even if 99.9999% translated'],
];
}

/**
* @dataProvider instantTranslationFileUriDataProvider
*/
public function testIsInstantTranslation(string $fileUri, bool $expected): void
{
$x = new SubmissionEntity();
$x->setFileUri($fileUri);

$this->assertSame($expected, $x->isInstantTranslation());
}

public function instantTranslationFileUriDataProvider(): array
{
return [
'fts file uid and mt uid' => ['abc123def456:xyz789', true],
'regular file uri' => ['/sample-page_post_1_5.xml', false],
'regular file uri with colon in title' => ['Title: subtitle_post_1_5.xml', false],
'empty' => ['', false],
];
}
}
Loading