Skip to content

Commit

Permalink
pkp/pkp-lib#10306 unit tests for queue jobs
Browse files Browse the repository at this point in the history
  • Loading branch information
touhidurabir committed Sep 15, 2024
1 parent 8badcd3 commit 48e0042
Show file tree
Hide file tree
Showing 13 changed files with 969 additions and 2 deletions.
2 changes: 1 addition & 1 deletion jobs/notifications/IssuePublishedNotifyUsers.php
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ protected function createMailable(
Issue $issue,
User $recipient,
EmailTemplate $template,
Notification $notification
Notification|\PKP\notification\Notification $notification
): IssuePublishedNotify {
$mailable = new IssuePublishedNotify($context, $issue);
$mailable
Expand Down
1 change: 0 additions & 1 deletion tests/jobs/.gitkeep

This file was deleted.

105 changes: 105 additions & 0 deletions tests/jobs/doi/DepositIssueTest.php

Large diffs are not rendered by default.

87 changes: 87 additions & 0 deletions tests/jobs/notifications/IssuePublishedNotifyUsersTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?php

/**
* @file tests/jobs/notifications/IssuePublishedNotifyUsersTest.php
*
* Copyright (c) 2024 Simon Fraser University
* Copyright (c) 2024 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @brief Tests for notifying users about issue publish job.
*/

namespace APP\tests\jobs\notifications;

use APP\jobs\notifications\IssuePublishedNotifyUsers;
use Mockery;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
use PKP\db\DAORegistry;
use PKP\emailTemplate\Repository as EmailTemplateRepository;
use PKP\tests\PKPTestCase;

#[RunTestsInSeparateProcesses]
#[CoversClass(IssuePublishedNotifyUsers::class)]
class IssuePublishedNotifyUsersTest extends PKPTestCase
{
/**
* base64_encoded serializion from OJS 3.4.0
*/
protected string $serializedJobData = <<<END
O:48:"APP\\jobs\\notifications\\IssuePublishedNotifyUsers":8:{s:15:"\0*\0recipientIds";O:29:"Illuminate\\Support\\Collection":2:{s:8:"\0*\0items";a:18:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;i:6;i:7;i:7;i:8;i:8;i:9;i:9;i:10;i:10;i:11;i:11;i:12;i:12;i:13;i:13;i:14;i:14;i:15;i:15;i:16;i:35;i:37;i:36;i:38;}s:28:"\0*\0escapeWhenCastingToString";b:0;}s:12:"\0*\0contextId";i:1;s:8:"\0*\0issue";O:15:"APP\\issue\\Issue":6:{s:5:"_data";a:21:{s:2:"id";i:2;s:9:"journalId";i:1;s:6:"volume";i:2;s:6:"number";s:1:"1";s:4:"year";i:2015;s:9:"published";i:1;s:13:"datePublished";s:19:"2024-05-23 11:59:46";s:12:"dateNotified";N;s:12:"lastModified";s:19:"2024-05-23 11:59:46";s:12:"accessStatus";i:1;s:14:"openAccessDate";N;s:10:"showVolume";b:1;s:10:"showNumber";b:1;s:8:"showYear";b:1;s:9:"showTitle";b:0;s:13:"styleFileName";N;s:21:"originalStyleFileName";N;s:7:"urlPath";s:0:"";s:5:"doiId";i:5;s:11:"description";a:2:{s:2:"en";s:0:"";s:5:"fr_CA";s:0:"";}s:5:"title";a:2:{s:2:"en";s:0:"";s:5:"fr_CA";s:0:"";}}s:20:"_hasLoadableAdapters";b:0;s:27:"_metadataExtractionAdapters";a:0:{}s:25:"_extractionAdaptersLoaded";b:0;s:26:"_metadataInjectionAdapters";a:0:{}s:24:"_injectionAdaptersLoaded";b:0;}s:9:"\0*\0locale";s:2:"en";s:9:"\0*\0sender";O:13:"PKP\\user\\User":7:{s:5:"_data";a:22:{s:2:"id";i:1;s:8:"userName";s:5:"admin";s:8:"password";s:60:"$2y$10\$uFmYXg8/Ufa0HbskyW57Be22stFGY5qtxJZmTOae3PfDB86V3x7BW";s:5:"email";s:23:"[email protected]";s:3:"url";N;s:5:"phone";N;s:14:"mailingAddress";N;s:14:"billingAddress";N;s:7:"country";N;s:7:"locales";a:0:{}s:6:"gossip";N;s:13:"dateLastEmail";N;s:14:"dateRegistered";s:19:"2023-02-28 20:19:07";s:13:"dateValidated";N;s:13:"dateLastLogin";s:19:"2024-05-22 19:05:03";s:18:"mustChangePassword";N;s:7:"authStr";N;s:8:"disabled";b:0;s:14:"disabledReason";N;s:10:"inlineHelp";b:1;s:10:"familyName";a:1:{s:2:"en";s:5:"admin";}s:9:"givenName";a:1:{s:2:"en";s:5:"admin";}}s:20:"_hasLoadableAdapters";b:0;s:27:"_metadataExtractionAdapters";a:0:{}s:25:"_extractionAdaptersLoaded";b:0;s:26:"_metadataInjectionAdapters";a:0:{}s:24:"_injectionAdaptersLoaded";b:0;s:9:"\0*\0_roles";a:0:{}}s:10:"connection";s:8:"database";s:5:"queue";s:5:"queue";s:7:"batchId";s:36:"9c1c1368-8bb4-4179-a350-403decb700ba";}
END;

/**
* Test job is a proper instance
*/
public function testUnserializationGetProperDepositIssueJobInstance(): void
{
$this->assertInstanceOf(
IssuePublishedNotifyUsers::class,
unserialize(($this->serializedJobData))
);
}

/**
* Ensure that a serialized job can be unserialized and executed
*/
public function testRunSerializedJob(): void
{
$this->mockMail();

// need to mock request so that a valid context information is set and can be retrived
$this->mockRequest();

/** @var IssuePublishedNotifyUsers $issuePublishedNotifyUsersJob */
$issuePublishedNotifyUsersJob = unserialize(($this->serializedJobData));

$journalDAOMock = Mockery::mock(\APP\journal\JournalDAO::class)
->makePartial()
->shouldReceive('getId')
->withAnyArgs()
->andReturn(new \APP\journal\JournalDAO())
->getMock();

DAORegistry::registerDAO('JournalDAO', $journalDAOMock);

$emailTemplateMock = Mockery::mock(\PKP\emailTemplate\EmailTemplate::class)
->makePartial()
->shouldReceive([
'getLocalizedData' => 'some test string',
])
->withAnyArgs()
->getMock();

$emailTemplateRepoMock = Mockery::mock(app(EmailTemplateRepository::class))
->makePartial()
->shouldReceive([
'getByKey' => $emailTemplateMock,
])
->withAnyArgs()
->getMock();

app()->instance(EmailTemplateRepository::class, $emailTemplateRepoMock);

$this->assertNull($issuePublishedNotifyUsersJob->handle());
}
}
107 changes: 107 additions & 0 deletions tests/jobs/notifications/OpenAccessMailUsersTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
<?php

/**
* @file tests/jobs/notifications/OpenAccessMailUsersTest.php
*
* Copyright (c) 2024 Simon Fraser University
* Copyright (c) 2024 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @brief Tests for open access mail to users job.
*/

namespace APP\tests\jobs\notifications;

use APP\issue\Repository as IssueRepository;
use APP\jobs\notifications\OpenAccessMailUsers;
use Mockery;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
use PKP\db\DAORegistry;
use PKP\emailTemplate\Repository as EmailTemplateRepository;
use PKP\tests\PKPTestCase;

#[RunTestsInSeparateProcesses]
#[CoversClass(OpenAccessMailUsers::class)]
class OpenAccessMailUsersTest extends PKPTestCase
{
/**
* base64_encoded serializion from OJS 3.4.0
*/
protected string $serializedJobData = <<<END
O:42:"APP\\jobs\\notifications\\OpenAccessMailUsers":6:{s:10:"\0*\0userIds";O:29:"Illuminate\\Support\\Collection":2:{s:8:"\0*\0items";a:2:{i:0;i:1;i:1;i:2;}s:28:"\0*\0escapeWhenCastingToString";b:0;}s:12:"\0*\0contextId";i:1;s:10:"\0*\0issueId";i:1;s:10:"connection";s:8:"database";s:5:"queue";s:5:"queue";s:7:"batchId";s:36:"9c1c4502-5261-4b4a-965c-256cd0eaaaa4";}
END;

/**
* Test job is a proper instance
*/
public function testUnserializationGetProperDepositIssueJobInstance(): void
{
$this->assertInstanceOf(
OpenAccessMailUsers::class,
unserialize($this->serializedJobData)
);
}

/**
* Ensure that a serialized job can be unserialized and executed
*/
public function testRunSerializedJob(): void
{
$this->mockMail();

// need to mock request so that a valid context information is set and can be retrived
$this->mockRequest();

/** @var OpenAccessMailUsers $openAccessMailUsersJob */
$openAccessMailUsersJob = unserialize($this->serializedJobData);

$journalDAOMock = Mockery::mock(\APP\journal\JournalDAO::class)
->makePartial()
->shouldReceive('getId')
->withAnyArgs()
->andReturn(
Mockery::mock(\APP\journal\Journal::class)
->makePartial()
->shouldReceive([
'getData' => '',
'getPrimaryLocale' => 'en'
])
->withAnyArgs()
->getMock()
)
->getMock();

DAORegistry::registerDAO('JournalDAO', $journalDAOMock);

$issueRepoMock = Mockery::mock(app(IssueRepository::class))
->makePartial()
->shouldReceive([
'get' => new \APP\issue\Issue(),
])
->withAnyArgs()
->getMock();

app()->instance(IssueRepository::class, $issueRepoMock);

$emailTemplateMock = Mockery::mock(\PKP\emailTemplate\EmailTemplate::class)
->makePartial()
->shouldReceive([
'getLocalizedData' => 'some test string',
])
->withAnyArgs()
->getMock();

$emailTemplateRepoMock = Mockery::mock(app(EmailTemplateRepository::class))
->makePartial()
->shouldReceive([
'getByKey' => $emailTemplateMock,
])
->withAnyArgs()
->getMock();

app()->instance(EmailTemplateRepository::class, $emailTemplateRepoMock);

$this->assertNull($openAccessMailUsersJob->handle());
}
}
86 changes: 86 additions & 0 deletions tests/jobs/statistics/CompileCounterSubmissionDailyMetricsTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
<?php

/**
* @file tests/jobs/statistics/CompileCounterSubmissionDailyMetricsTest.php
*
* Copyright (c) 2024 Simon Fraser University
* Copyright (c) 2024 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @brief Tests for compile counter submission daily metrics job.
*/

namespace APP\tests\jobs\statistics;

use APP\jobs\statistics\CompileCounterSubmissionDailyMetrics;
use Mockery;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
use PKP\db\DAORegistry;
use PKP\tests\PKPTestCase;

#[RunTestsInSeparateProcesses]
#[CoversClass(CompileCounterSubmissionDailyMetrics::class)]
class CompileCounterSubmissionDailyMetricsTest extends PKPTestCase
{
/**
* base64_encoded serializion from OJS 3.4.0
*/
protected string $serializedJobData = <<<END
O:56:"APP\\jobs\\statistics\\CompileCounterSubmissionDailyMetrics":3:{s:9:"\0*\0loadId";s:25:"usage_events_20240130.log";s:10:"connection";s:8:"database";s:5:"queue";s:5:"queue";}
END;

/**
* Test job is a proper instance
*/
public function testUnserializationGetProperDepositIssueJobInstance(): void
{
$this->assertInstanceOf(
CompileCounterSubmissionDailyMetrics::class,
unserialize($this->serializedJobData)
);
}

/**
* Ensure that a serialized job can be unserialized and executed
*/
public function testRunSerializedJob(): void
{
/** @var CompileCounterSubmissionDailyMetrics $compileCounterSubmissionDailyMetricsJob */
$compileCounterSubmissionDailyMetricsJob = unserialize($this->serializedJobData);

$temporaryTotalsDAOMock = Mockery::mock(\APP\statistics\TemporaryTotalsDAO::class)
->makePartial()
->shouldReceive([
'deleteCounterSubmissionDailyByLoadId' => null,
'compileCounterSubmissionDailyMetrics' => null,
])
->withAnyArgs()
->getMock();

DAORegistry::registerDAO('TemporaryTotalsDAO', $temporaryTotalsDAOMock);

$temporaryItemInvestigationsDAOMock = Mockery::mock(\APP\statistics\TemporaryItemInvestigationsDAO::class)
->makePartial()
->shouldReceive([
'compileCounterSubmissionDailyMetrics' => null,
])
->withAnyArgs()
->getMock();

DAORegistry::registerDAO('TemporaryItemInvestigationsDAO', $temporaryItemInvestigationsDAOMock);

$temporaryItemRequestsDAOMock = Mockery::mock(\APP\statistics\TemporaryItemRequestsDAO::class)
->makePartial()
->shouldReceive([
'compileCounterSubmissionDailyMetrics' => null,
])
->withAnyArgs()
->getMock();

DAORegistry::registerDAO('TemporaryItemRequestsDAO', $temporaryItemRequestsDAOMock);


$this->assertNull($compileCounterSubmissionDailyMetricsJob->handle());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
<?php

/**
* @file tests/jobs/statistics/CompileCounterSubmissionInstitutionDailyMetricsTest.php
*
* Copyright (c) 2024 Simon Fraser University
* Copyright (c) 2024 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @brief Tests for compile counter submission institution daily metrics job.
*/

namespace APP\tests\jobs\statistics;

use APP\jobs\statistics\CompileCounterSubmissionInstitutionDailyMetrics;
use Mockery;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\RunTestsInSeparateProcesses;
use PKP\db\DAORegistry;
use PKP\tests\PKPTestCase;

#[RunTestsInSeparateProcesses]
#[CoversClass(CompileCounterSubmissionInstitutionDailyMetrics::class)]
class CompileCounterSubmissionInstitutionDailyMetricsTest extends PKPTestCase
{
/**
* base64_encoded serializion from OJS 3.4.0
*/
protected string $serializedJobData = <<<END
O:67:"APP\\jobs\\statistics\\CompileCounterSubmissionInstitutionDailyMetrics":3:{s:9:"\0*\0loadId";s:25:"usage_events_20240130.log";s:10:"connection";s:8:"database";s:5:"queue";s:5:"queue";}
END;

/**
* Test job is a proper instance
*/
public function testUnserializationGetProperDepositIssueJobInstance(): void
{
$this->assertInstanceOf(
CompileCounterSubmissionInstitutionDailyMetrics::class,
unserialize($this->serializedJobData)
);
}

/**
* Ensure that a serialized job can be unserialized and executed
*/
public function testRunSerializedJob(): void
{
/** @var CompileCounterSubmissionInstitutionDailyMetrics $compileCounterSubmissionInstitutionDailyMetricsJob */
$compileCounterSubmissionInstitutionDailyMetricsJob = unserialize($this->serializedJobData);

$temporaryTotalsDAOMock = Mockery::mock(\APP\statistics\TemporaryTotalsDAO::class)
->makePartial()
->shouldReceive([
'deleteCounterSubmissionInstitutionDailyByLoadId' => null,
'compileCounterSubmissionDailyMetrics' => null,
])
->withAnyArgs()
->getMock();

DAORegistry::registerDAO('TemporaryTotalsDAO', $temporaryTotalsDAOMock);

$temporaryItemInvestigationsDAOMock = Mockery::mock(\APP\statistics\TemporaryItemInvestigationsDAO::class)
->makePartial()
->shouldReceive([
'compileCounterSubmissionInstitutionDailyMetrics' => null,
])
->withAnyArgs()
->getMock();

DAORegistry::registerDAO('TemporaryItemInvestigationsDAO', $temporaryItemInvestigationsDAOMock);

$temporaryItemRequestsDAOMock = Mockery::mock(\APP\statistics\TemporaryItemRequestsDAO::class)
->makePartial()
->shouldReceive([
'compileCounterSubmissionInstitutionDailyMetrics' => null,
])
->withAnyArgs()
->getMock();

DAORegistry::registerDAO('TemporaryItemRequestsDAO', $temporaryItemRequestsDAOMock);


$this->assertNull($compileCounterSubmissionInstitutionDailyMetricsJob->handle());
}
}
Loading

0 comments on commit 48e0042

Please sign in to comment.