Improved test code coverage, including necessary refactor
Squashed commit of the following: commit 18996bc4916e945e130ad4abb17149ea2d0afa93 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Thu Dec 7 14:46:41 2017 +0000 Fixing styleci issue commit e5bfedfdede637d3090603b55946cc34aec8b52d Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Thu Dec 7 14:45:47 2017 +0000 The Micorpub controller istelf is basically refactored now commit 9eacc968c8bf9b0f5e746c38f04423c51f678d50 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Thu Dec 7 14:16:23 2017 +0000 Add more tests, easily into 90% plus test coverage now commit 2dcbf94298841884083f752f17de46ef7809a369 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Thu Dec 7 10:57:42 2017 +0000 Fix some styleci issues commit 6a989f61af412d59751281bc09ba0778597f09ec Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Thu Dec 7 10:56:13 2017 +0000 First real attempt at refactoring micropub controller commit c10da3d630ca8e06b120122041bb6c64c1084325 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Tue Dec 5 16:51:20 2017 +0000 Fix a styleci issue commit d7ee556fdebdd2160620e65d4bf3c67134f01187 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Tue Dec 5 16:47:52 2017 +0000 Improve the code for the media endpoint and add tests commit bc81bbaff3fad8afcc2135d76f213bba8ba54534 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Tue Dec 5 16:47:07 2017 +0000 Modify process image to process media, this allows for improvment within the micropub controller commit d13035cb2cbeff41d15ff017beb9a5b6bb41daee Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Mon Dec 4 15:14:18 2017 +0000 Better name the current tests commit 0a2ef16f74f3e322a945a8d6b239be3f97e8c5b8 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Mon Dec 4 14:08:13 2017 +0000 Reach 100% code coverage for webmentions commit 60f8b196a0fb4e6570b74d7577a9ff5f6c218613 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Mon Dec 4 13:35:03 2017 +0000 Fix a styleci issue commit e96be1869da909b8b080a38e4e33f94656b5b786 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Mon Dec 4 13:32:54 2017 +0000 Add tests for Notes Admin code commit 213319798bf5b3118034ab18a7c9eca5cf18296f Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Mon Dec 4 12:44:02 2017 +0000 Fix a styleci issue commit a614332c7664f66edcb78ef23db392a417c0deb0 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Mon Dec 4 12:43:02 2017 +0000 Fix a phpcs issue commit 6a2e445dbf87fb8b48a24b34ca0fc3518b4376b6 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Mon Dec 4 12:20:19 2017 +0000 Add some tests fopr editing places in the admin cp commit 7044f2555228ffd7df2823c0c19a4380ca886b5d Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Mon Dec 4 11:35:59 2017 +0000 Add tests for contacts admin code commit 280c4498dbe2cf2879a08ee45a90a0c9ff2f296a Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sat Dec 2 13:45:27 2017 +0000 Improve admin related tests commit ee93a108d11053b1f2fe38f30f3219b3e96267fc Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sat Dec 2 00:01:42 2017 +0000 Measure coverage with coveralls commit 47c4f5088b1b12e4d183a72b9792e723bda64f77 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 23:57:32 2017 +0000 Remove un-used PhotosController commit 5737621dbc0ff7009896b483e1d004cdf2eb1523 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 23:47:08 2017 +0000 Remove the curl test that was used for debugging purposes commit b4d312b056df884eef7e4b0392b5dd1a3ae978bd Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 23:39:47 2017 +0000 We don’t want ports in the longurl/shorturl env vars commit 915370845448ef4e1be1ff5e7f4ef084c4200953 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 23:30:17 2017 +0000 Use the right port commit f9a3eac51063899fd003a8fa572dcf972d2f3a5c Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 23:18:57 2017 +0000 I can’t get nginx listening on custom domains commit 3742a04cda5b5ae56ad839bf0ed74ddd9874e74c Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 23:10:51 2017 +0000 Try naked domains, i.e. without .localhost commit d46040f86f32f0a70dae3bd1cf7c27465ee83a77 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 23:02:51 2017 +0000 Add some default values back for pid and error_log commit f15eb73b995f215e3b56243bbba49f23393beb5e Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 22:56:38 2017 +0000 Let pid be the default value commit 91048b96302b5f13c1eba4ae9ab226ff00859ea6 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 22:51:22 2017 +0000 Don’t try and run php-fpm and nginx on the same port commit 4203f7de976df9d0e832c09b18f15fff05837af7 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 22:36:26 2017 +0000 Can only have one default_server commit 6d117929d09707add7d687883d4cb6eba5881e96 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 22:10:35 2017 +0000 Try and get a long url and short url both working commit 995c7721e3dd96b01307cf75ae0f839fad96aaf9 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 22:01:14 2017 +0000 Test the remaining shorturl redirects commit d4c8a1a9c41c4e807d986b54c397b88a54292713 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 22:00:54 2017 +0000 Get rid of some of my legacy redirects commit 96d8c5b4cf576d66864a9e241cbef89b7bbe4597 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 21:46:42 2017 +0000 Try and fix which url is being replied to commit 692a7d0a2dcb3050f9c6da4afce2bb6c8ee72583 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 21:22:15 2017 +0000 Add tests and improve code for the search feature commit 442c26ff485a4d20710e1c38ab78bb1df212edda Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 20:04:00 2017 +0000 Add tests for saving css preference in the session commit e2180f0c40e4e8de293d2dd174816095affb0e3f Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 19:35:32 2017 +0000 Some styleci fixes commit a90bbe79c092ee4548f4fbad1399b99fddcb432c Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 19:33:40 2017 +0000 Don’t consider un-used laravel middleware when calculating code coverage commit 15edeb0d0179d5a37648c454d316c99250ba9bea Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 19:27:42 2017 +0000 Add some tests for the process webmention job commit a354c63945c582196990823845b57c7e51ff182d Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 17:55:47 2017 +0000 Add tests for save profile image job commit 0230102bafddbccd81512c37330be0e2fcb39a53 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 15:05:30 2017 +0000 Test sending webmentions commit e664e911c5fcca7fc884eda39253b503970a8bc2 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 15:04:44 2017 +0000 Fix typo in test name commit 391d1aa8f584b9e8bd8a7154b68447a2098ddc1a Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 12:04:05 2017 +0000 Add tests for syndication jobs commit 16d8215c09ff235c5b8253189055ad6c17f2f009 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 1 11:49:05 2017 +0000 Fix issue with scope date and month being 12 the int or 12 the string commit 0d9aaaa178b088a6856a70f4338fffea0ad8a0f3 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Thu Nov 30 19:00:39 2017 +0000 Improve Bookmark processing code and test coverage commit 93d4419b37af7d0fcf8fe48cb855c1290512b30c Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Thu Nov 30 18:59:10 2017 +0000 Improve Like processing code and test coverage commit 1ccb42c48a4760daf9cf0bed744740aa931a6a89 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Thu Nov 30 14:12:07 2017 +0000 Try and install nginx natively, given its listed in travis-ci/apt-package-whitelist commit 126a3c4c9639eae1a986674a952923dd4e1384cc Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Thu Nov 30 12:09:47 2017 +0000 Test the download webmention job commit 2889e95c1526796684613d7fbb0998f654dbef28 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Thu Nov 30 12:08:56 2017 +0000 Test the add client job commit 4054a24e93ffe5dd68c2ab211bf6a88b114c3f10 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Mon Nov 27 21:21:09 2017 +0000 Ignore code coverage for such a trivial command commit 5bda55d401fa677a84d334b6200d7ce045e23a90 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Mon Nov 27 18:22:18 2017 +0000 For now don’t analyse laravel’s exception handler commit bb21e2ffc620cf22c14b49f2f292616f0d1bcc77 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Mon Nov 27 18:21:55 2017 +0000 test coverage commit 2980127778d5be8dee7dd119cc6eb20b7a9f5e52 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Mon Nov 27 16:30:44 2017 +0000 phpcs fixes commit 6e802bf78a93e5886a38007177d54d33ed85b31b Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Mon Nov 27 16:28:47 2017 +0000 Increase and improve tests for bookmarks commit 1f6ffbacb86be86faa2cd37022d50e41f9582d59 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Mon Nov 27 13:04:11 2017 +0000 Increase test coverage for token generation/validation commit 66d866fdbfd1dcd0f161d4d30c7fb79fbb4a7250 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sun Nov 26 16:58:30 2017 +0000 Increase test coverage for Place relasted code commit 6774d5c837ccc8c7d9f1cd80607dd40ffb5257f5 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sun Nov 26 16:57:42 2017 +0000 Increase test coverage for Like relasted code commit 4e055527276499eca721cf9be64473d91b30e1d9 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sun Nov 26 10:21:21 2017 +0000 Ignore code that can’t be tested from coverage analysis commit fbe7a88ab2319a3dcf4d441bd6db7be49e6445c5 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sun Nov 26 10:20:48 2017 +0000 Increase test coverages for note creation/deletion commit cae9bce276372a4870b0cbe7ebd561ef49d1b131 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Nov 24 15:16:52 2017 +0000 Test a single bookmark page commit e23cf9846ae5bb28554d7665aee92826e237dc38 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Nov 24 15:16:34 2017 +0000 Test login route for admin page commit 9e2902f2048edac949edd0cc73e1abbf84a4f224 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Nov 24 14:11:46 2017 +0000 Improve articles controller to redirect outdated links, add tests commit 49bfaaf615461149a06bcfb74fd7a676eb3d49f8 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Nov 24 13:57:03 2017 +0000 Remove Auth controllers we don’t use commit 5cebbc45aa72d24fc729c314c4f6ef1fc99c16d3 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Nov 24 13:36:11 2017 +0000 More testing, looking at middleware being applied commit 2e5c9dd77143d3b23b3461decd5d1cda1375c510 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Nov 24 13:12:56 2017 +0000 Tweak reply webmentions and re-parsing them, as well as add tests commit 766739f42fe8432daa10172ae7fcff84fe29d78d Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Thu Nov 23 21:18:56 2017 +0000 Test redownload webmentions command dispatches the job commit 6a25e99af4bad4ea3070a1ac4277542a52f6b465 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Thu Nov 23 20:24:18 2017 +0000 Fixing and increasing test coverage for notes, still some work left to do commit 1e10fffb344b50a4665060d42e94cb564a8404e7 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Thu Nov 23 15:16:11 2017 +0000 Increase test coverage for places commit 0b40ccedd285262b57be2414dfa2fd637e80ef2b Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Thu Nov 23 11:54:08 2017 +0000 Tweak of code and increased test coverage commit 64dc03b381fb79046e57ba2c623cb3a667adc345 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Wed Nov 22 15:38:17 2017 +0000 Increase text coverage for Tags commit 62bdb775ec5ec2c06595fc4d427703c683ae81a7 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Wed Nov 22 15:25:33 2017 +0000 Increase test coverage for media-client code commit 6bcf4cb909048e94aed7b7807bbe380833c258a1 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Wed Nov 22 15:25:05 2017 +0000 Incurease test coverage for media commit 89ede0fd1c9d7ee66b1af8be2b4d75b03b4bd8b9 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Wed Nov 22 15:24:36 2017 +0000 Fix some issues with notes and increase test coverage commit 1ad7c952703e9098bd80c2024eeec0a0937c9db3 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Tue Nov 21 14:40:33 2017 +0000 Improve bookmarks test coverage commit 5a3cb440edeb9c63e9c447a36b3000dcb0b0ec7a Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Tue Nov 21 14:40:05 2017 +0000 Add Like tests commit 8481e367ea74b081269a99ee97175f49d71176b8 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Tue Nov 21 14:08:38 2017 +0000 Add a another Like to the db without content and with an auhtor_url commit 4053dcf8ec02e8b3618eb3ad2b875870368eab49 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Tue Nov 21 14:07:32 2017 +0000 Don’t show the url instead of content, just leave blank commit 8e12a125b927efd327323044e5f86beef6ccef8c Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Tue Nov 21 14:05:36 2017 +0000 Add tests for Article model commit d827d3399a1ed9513c4bac05e5078345f2768081 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Tue Nov 21 14:05:14 2017 +0000 Make sure year and month are cast to ints for scopeDate commit db747d95bc80e521604b4b3487bed6c7fd46b8fe Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Tue Nov 21 14:04:26 2017 +0000 Remove un-needed webmentions method, change scopeDate to use integers for month
This commit is contained in:
parent
6e02e31f52
commit
a4f07e510e
117 changed files with 3336 additions and 1330 deletions
22
tests/Unit/AddClientToDatabaseJobTest.php
Normal file
22
tests/Unit/AddClientToDatabaseJobTest.php
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use Tests\TestCase;
|
||||
use App\Jobs\AddClientToDatabase;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class AddClientToDatabaseJobTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_job_adds_client()
|
||||
{
|
||||
$job = new AddClientToDatabase('https://example.org/client');
|
||||
$job->handle();
|
||||
$this->assertDatabaseHas('clients', [
|
||||
'client_url' => 'https://example.org/client',
|
||||
'client_name' => 'https://example.org/client',
|
||||
]);
|
||||
}
|
||||
}
|
72
tests/Unit/ArticlesTest.php
Normal file
72
tests/Unit/ArticlesTest.php
Normal file
|
@ -0,0 +1,72 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use App\Article;
|
||||
use Tests\TestCase;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class ArticlesTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_sluggable_method()
|
||||
{
|
||||
$article = new Article();
|
||||
$article->title = 'My Title';
|
||||
$article->main = 'Content';
|
||||
$article->save();
|
||||
|
||||
$this->assertEquals('my-title', $article->titleurl);
|
||||
}
|
||||
|
||||
public function test_markdown_conversion()
|
||||
{
|
||||
$article = new Article();
|
||||
$article->main = 'Some *markdown*';
|
||||
|
||||
$this->assertEquals('<p>Some <em>markdown</em></p>'.PHP_EOL, $article->html);
|
||||
}
|
||||
|
||||
public function test_time_attributes()
|
||||
{
|
||||
$article = Article::create([
|
||||
'title' => 'Test',
|
||||
'main' => 'test',
|
||||
]);
|
||||
|
||||
$this->assertEquals($article->w3c_time, $article->updated_at->toW3CString());
|
||||
$this->assertEquals($article->tooltip_time, $article->updated_at->toRFC850String());
|
||||
$this->assertEquals($article->human_time, $article->updated_at->diffForHumans());
|
||||
$this->assertEquals($article->pubdate, $article->updated_at->toRSSString());
|
||||
}
|
||||
|
||||
public function test_link_accessor()
|
||||
{
|
||||
$article = Article::create([
|
||||
'title' => 'Test',
|
||||
'main' => 'Test',
|
||||
]);
|
||||
$article->title = 'Test Title';
|
||||
|
||||
$this->assertEquals(
|
||||
'/blog/' . date('Y') . '/' . date('m') . '/test',
|
||||
$article->link
|
||||
);
|
||||
}
|
||||
|
||||
public function test_date_scope()
|
||||
{
|
||||
$yearAndMonth = Article::date(date('Y'), date('m'))->get();
|
||||
$this->assertTrue(count($yearAndMonth) === 1);
|
||||
|
||||
$monthDecember = Article::date(date('Y') - 1, 12)->get();
|
||||
$this->assertTrue(count($monthDecember) === 0);
|
||||
|
||||
$monthNotDecember = Article::date(date('Y') - 1, 1)->get();
|
||||
$this->assertTrue(count($monthNotDecember) === 0);
|
||||
|
||||
$emptyScope = Article::date()->get();
|
||||
$this->assertTrue(count($emptyScope) === 1);
|
||||
}
|
||||
}
|
59
tests/Unit/BookmarksTest.php
Normal file
59
tests/Unit/BookmarksTest.php
Normal file
|
@ -0,0 +1,59 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use Tests\TestCase;
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\HandlerStack;
|
||||
use GuzzleHttp\Psr7\Response;
|
||||
use App\Services\BookmarkService;
|
||||
use GuzzleHttp\Handler\MockHandler;
|
||||
|
||||
class BookmarksTest extends TestCase
|
||||
{
|
||||
public function test_screenshot_of_google()
|
||||
{
|
||||
$uuid = (new BookmarkService())->saveScreenshot('https://www.google.co.uk');
|
||||
$this->assertTrue(file_exists(public_path() . '/assets/img/bookmarks/' . $uuid . '.png'));
|
||||
}
|
||||
|
||||
public function test_archive_link_method()
|
||||
{
|
||||
$mock = new MockHandler([
|
||||
new Response(200, ['Content-Location' => '/web/1234/example.org']),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
$this->app->instance(Client::class, $client);
|
||||
$url = (new BookmarkService())->getArchiveLink('https://example.org');
|
||||
$this->assertEquals('/web/1234/example.org', $url);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException App\Exceptions\InternetArchiveException
|
||||
*/
|
||||
public function test_archive_link_method_archive_site_error_exception()
|
||||
{
|
||||
$mock = new MockHandler([
|
||||
new Response(403),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
$this->app->instance(Client::class, $client);
|
||||
$url = (new BookmarkService())->getArchiveLink('https://example.org');
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException App\Exceptions\InternetArchiveException
|
||||
*/
|
||||
public function test_archive_link_method_archive_site_no_location_exception()
|
||||
{
|
||||
$mock = new MockHandler([
|
||||
new Response(200),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
$this->app->instance(Client::class, $client);
|
||||
$url = (new BookmarkService())->getArchiveLink('https://example.org');
|
||||
}
|
||||
}
|
112
tests/Unit/DownloadWebMentionJobTest.php
Normal file
112
tests/Unit/DownloadWebMentionJobTest.php
Normal file
|
@ -0,0 +1,112 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use Tests\TestCase;
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\HandlerStack;
|
||||
use GuzzleHttp\Psr7\Response;
|
||||
use App\Jobs\DownloadWebMention;
|
||||
use GuzzleHttp\Handler\MockHandler;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
|
||||
class DownloadWebMentionJobTest extends TestCase
|
||||
{
|
||||
public function tearDown()
|
||||
{
|
||||
$this->delTree(storage_path('HTML/https'));
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
public function test_the_job_saves_html()
|
||||
{
|
||||
$this->assertFileNotExists(storage_path('HTML/https'));
|
||||
$source = 'https://example.org/reply/1';
|
||||
$html = <<<HTML
|
||||
<div class="h-entry">
|
||||
<a class="u-like-of" href=""></a>
|
||||
</div>
|
||||
HTML;
|
||||
$html = str_replace('href=""', 'href="' . config('app.url') . '/notes/A"', $html);
|
||||
$mock = new MockHandler([
|
||||
new Response(200, ['X-Foo' => 'Bar'], $html),
|
||||
new Response(200, ['X-Foo' => 'Bar'], $html),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
|
||||
$job = new DownloadWebMention($source);
|
||||
$job->handle($client);
|
||||
|
||||
$this->assertFileExists(storage_path('HTML/https'));
|
||||
|
||||
$job->handle($client);
|
||||
|
||||
$this->assertFileNotExists(storage_path('HTML/https/example.org/reply') . '/1.' . date('Y-m-d') . '.backup');
|
||||
}
|
||||
|
||||
public function test_the_job_saves_html_and_backup()
|
||||
{
|
||||
$this->assertFileNotExists(storage_path('HTML/https'));
|
||||
$source = 'https://example.org/reply/1';
|
||||
$html = <<<HTML
|
||||
<div class="h-entry">
|
||||
<a class="u-like-of" href=""></a>
|
||||
</div>
|
||||
HTML;
|
||||
$html2 = <<<HTML
|
||||
<div class="h-entry">
|
||||
<a class="u-like-of" href=""></a>
|
||||
<a class="u-repost-of" href=""></a>
|
||||
</div>
|
||||
HTML;
|
||||
$html = str_replace('href=""', 'href="' . config('app.url') . '/notes/A"', $html);
|
||||
$html2 = str_replace('href=""', 'href="' . config('app.url') . '/notes/A"', $html2);
|
||||
$mock = new MockHandler([
|
||||
new Response(200, ['X-Foo' => 'Bar'], $html),
|
||||
new Response(200, ['X-Foo' => 'Bar'], $html2),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
|
||||
$job = new DownloadWebMention($source);
|
||||
$job->handle($client);
|
||||
|
||||
$this->assertFileExists(storage_path('HTML/https'));
|
||||
|
||||
$job->handle($client);
|
||||
|
||||
$this->assertFileExists(storage_path('HTML/https/example.org/reply') . '/1.' . date('Y-m-d') . '.backup');
|
||||
}
|
||||
|
||||
public function test_an_index_html_file()
|
||||
{
|
||||
$this->assertFileNotExists(storage_path('HTML/https'));
|
||||
$source = 'https://example.org/reply-one/';
|
||||
$html = <<<HTML
|
||||
<div class="h-entry">
|
||||
<a class="u-like-of" href=""></a>
|
||||
</div>
|
||||
HTML;
|
||||
$html = str_replace('href=""', 'href="' . config('app.url') . '/notes/A"', $html);
|
||||
$mock = new MockHandler([
|
||||
new Response(200, ['X-Foo' => 'Bar'], $html),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
|
||||
$job = new DownloadWebMention($source);
|
||||
$job->handle($client);
|
||||
|
||||
$this->assertFileExists(storage_path('HTML/https/example.org/reply-one/index.html'));
|
||||
}
|
||||
|
||||
private function delTree($dir) {
|
||||
$files = array_diff(scandir($dir), array('.','..'));
|
||||
foreach ($files as $file) {
|
||||
(is_dir("$dir/$file")) ? $this->delTree("$dir/$file") : unlink("$dir/$file");
|
||||
}
|
||||
|
||||
return rmdir($dir);
|
||||
}
|
||||
}
|
16
tests/Unit/LikesTest.php
Normal file
16
tests/Unit/LikesTest.php
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use App\Like;
|
||||
use Tests\TestCase;
|
||||
|
||||
class LikesTest extends TestCase
|
||||
{
|
||||
public function test_setting_author_url()
|
||||
{
|
||||
$like = new Like();
|
||||
$like->author_url = 'https://joe.bloggs/';
|
||||
$this->assertEquals('https://joe.bloggs', $like->author_url);
|
||||
}
|
||||
}
|
16
tests/Unit/MediaTest.php
Normal file
16
tests/Unit/MediaTest.php
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use App\Media;
|
||||
use Tests\TestCase;
|
||||
|
||||
class MediaTest extends TestCase
|
||||
{
|
||||
public function test_get_note_from_media()
|
||||
{
|
||||
$media = Media::find(1);
|
||||
$note = $media->note;
|
||||
$this->assertInstanceOf('App\Note', $note);
|
||||
}
|
||||
}
|
17
tests/Unit/MicropbClientsTest.php
Normal file
17
tests/Unit/MicropbClientsTest.php
Normal file
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use Tests\TestCase;
|
||||
use App\MicropubClient;
|
||||
use Illuminate\Database\Eloquent\Collection;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
|
||||
class MicropbClientsTest extends TestCase
|
||||
{
|
||||
public function test_notes_relationship()
|
||||
{
|
||||
$client = MicropubClient::find(3);
|
||||
$this->assertInstanceOf(Collection::class, $client->notes);
|
||||
}
|
||||
}
|
|
@ -2,21 +2,23 @@
|
|||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use App\Tag;
|
||||
use App\Note;
|
||||
use Tests\TestCase;
|
||||
use Thujohn\Twitter\Facades\Twitter;
|
||||
|
||||
class NotesTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* Test the getNoteAttribute method. This note will check the markdown,
|
||||
* emoji-a11y, and hashtag sub-methods.
|
||||
* Test the getNoteAttribute method. This will then also call the
|
||||
* relevant sub-methods.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_get_note_attribute_method()
|
||||
{
|
||||
$expected = '<p>Having a <a rel="tag" class="p-category" href="/notes/tagged/beer">#beer</a> at the local. <span role="img" aria-label="beer mug">🍺</span></p>' . PHP_EOL;
|
||||
$note = Note::find(11);
|
||||
$note = Note::find(12);
|
||||
$this->assertEquals($expected, $note->note);
|
||||
}
|
||||
|
||||
|
@ -28,7 +30,7 @@ class NotesTest extends TestCase
|
|||
public function test_default_image_used_in_makehcards_method()
|
||||
{
|
||||
$expected = '<p>Hi <span class="u-category h-card mini-h-card"><a class="u-url p-name" href="http://tantek.com">Tantek Çelik</a><span class="hovercard"> <a class="u-url" href="https://twitter.com/t"><img class="social-icon" src="/assets/img/social-icons/twitter.svg"> t</a><img class="u-photo" alt="" src="/assets/profile-images/default-image"></span></span></p>' . PHP_EOL;
|
||||
$note = Note::find(12);
|
||||
$note = Note::find(13);
|
||||
$this->assertEquals($expected, $note->note);
|
||||
}
|
||||
|
||||
|
@ -39,8 +41,8 @@ class NotesTest extends TestCase
|
|||
*/
|
||||
public function test_specific_profile_image_used_in_makehcards_method()
|
||||
{
|
||||
$expected = '<p>Hi <span class="u-category h-card mini-h-card"><a class="u-url p-name" href="https://aaronparecki.com">Aaron Parecki</a><span class="hovercard"><a class="u-url" href="https://www.facebook.com/123456"><img class="social-icon" src="/assets/img/social-icons/facebook.svg"> Facebook</a> <a class="u-url" href="https://twitter.com/aaronpk"><img class="social-icon" src="/assets/img/social-icons/twitter.svg"> aaronpk</a><img class="u-photo" alt="" src="/assets/profile-images/aaronparecki.com/image"></span></span></p>' . PHP_EOL;
|
||||
$note = Note::find(13);
|
||||
$expected = '<p>Hi <span class="u-category h-card mini-h-card"><a class="u-url p-name" href="https://aaronparecki.com">Aaron Parecki</a><span class="hovercard"><a class="u-url" href="https://www.facebook.com/123456"><img class="social-icon" src="/assets/img/social-icons/facebook.svg"> Facebook</a> <img class="u-photo" alt="" src="/assets/profile-images/aaronparecki.com/image"></span></span></p>' . PHP_EOL;
|
||||
$note = Note::find(14);
|
||||
$this->assertEquals($expected, $note->note);
|
||||
}
|
||||
|
||||
|
@ -52,7 +54,47 @@ class NotesTest extends TestCase
|
|||
public function test_twitter_link_created_when_no_contact_found()
|
||||
{
|
||||
$expected = '<p>Hi <a href="https://twitter.com/bob">@bob</a></p>' . PHP_EOL;
|
||||
$note = Note::find(14);
|
||||
$note = Note::find(15);
|
||||
$this->assertEquals($expected, $note->note);
|
||||
}
|
||||
|
||||
public function test_shorturl_method()
|
||||
{
|
||||
$note = Note::find(14);
|
||||
$this->assertEquals(config('app.shorturl') . '/notes/E', $note->shorturl);
|
||||
}
|
||||
|
||||
public function test_latlng_of_associated_place()
|
||||
{
|
||||
$note = Note::find(12); // should be having beer at bridgewater note
|
||||
$this->assertEquals('53.4983', $note->latitude);
|
||||
$this->assertEquals('-2.3805', $note->longitude);
|
||||
}
|
||||
|
||||
public function test_latlng_returns_null_otherwise()
|
||||
{
|
||||
$note = Note::find(5);
|
||||
$this->assertNull($note->latitude);
|
||||
$this->assertNull($note->longitude);
|
||||
}
|
||||
|
||||
public function test_address_attribute_for_places()
|
||||
{
|
||||
$note = Note::find(12);
|
||||
$this->assertEquals('The Bridgewater Pub', $note->address);
|
||||
}
|
||||
|
||||
public function test_deleting_event_observer()
|
||||
{
|
||||
// first we’ll create a temporary note to delete
|
||||
$note = Note::create(['note' => 'temporary #temp']);
|
||||
$this->assertDatabaseHas('tags', [
|
||||
'tag' => 'temp',
|
||||
]);
|
||||
$tag = Tag::where('tag', 'temp')->first();
|
||||
$note->forceDelete();
|
||||
$this->assertDatabaseMissing('note_tag', [
|
||||
'tag_id' => $tag->id,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,10 +4,21 @@ namespace Tests\Unit;
|
|||
|
||||
use App\Place;
|
||||
use Tests\TestCase;
|
||||
use App\Services\PlaceService;
|
||||
use Phaza\LaravelPostgis\Geometries\Point;
|
||||
use Illuminate\Database\Eloquent\Collection;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class PlacesTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_notes_method()
|
||||
{
|
||||
$place = Place::find(1);
|
||||
$this->assertInstanceOf(Collection::class, $place->notes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the near method returns a collection.
|
||||
*
|
||||
|
@ -18,4 +29,67 @@ class PlacesTest extends TestCase
|
|||
$nearby = Place::near(new Point(53.5, -2.38), 1000)->get();
|
||||
$this->assertEquals('the-bridgewater-pub', $nearby[0]->slug);
|
||||
}
|
||||
|
||||
public function test_longurl_method()
|
||||
{
|
||||
$place = Place::find(1);
|
||||
$this->assertEquals(config('app.url') . '/places/the-bridgewater-pub', $place->longurl);
|
||||
}
|
||||
|
||||
public function test_uri_method()
|
||||
{
|
||||
$place = Place::find(1);
|
||||
$this->assertEquals(config('app.url') . '/places/the-bridgewater-pub', $place->uri);
|
||||
|
||||
}
|
||||
|
||||
public function test_shorturl_method()
|
||||
{
|
||||
$place = Place::find(1);
|
||||
$this->assertEquals(config('app.shorturl') . '/places/the-bridgewater-pub', $place->shorturl);
|
||||
}
|
||||
|
||||
public function test_service_returns_existing_place()
|
||||
{
|
||||
$place = new Place();
|
||||
$place->name = 'Temp Place';
|
||||
$place->location = new Point(37.422009, -122.084047);
|
||||
$place->external_urls = 'https://www.openstreetmap.org/way/1234';
|
||||
$place->save();
|
||||
$service = new PlaceService();
|
||||
$ret = $service->createPlaceFromCheckin([
|
||||
'properties' => [
|
||||
'url' => ['https://www.openstreetmap.org/way/1234'],
|
||||
]
|
||||
]);
|
||||
$this->assertInstanceOf('App\Place', $ret); // a place was returned
|
||||
$this->assertEquals(2, count(Place::all())); // still 2 places
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException InvalidArgumentException
|
||||
* @expectedExceptionMessage Missing required name
|
||||
*/
|
||||
public function test_service_requires_name()
|
||||
{
|
||||
$service = new PlaceService();
|
||||
$service->createPlaceFromCheckin(['foo' => 'bar']);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException InvalidArgumentException
|
||||
* @expectedExceptionMessage Missing required longitude/latitude
|
||||
*/
|
||||
public function test_service_requires_latitude()
|
||||
{
|
||||
$service = new PlaceService();
|
||||
$service->createPlaceFromCheckin(['properties' => ['name' => 'bar']]);
|
||||
}
|
||||
|
||||
public function test_updating_external_urls()
|
||||
{
|
||||
$place = Place::find(1);
|
||||
$place->external_urls = 'https://bridgewater.pub';
|
||||
$this->assertEquals('{"osm":"https:\/\/www.openstreetmap.org\/way\/987654","foursquare":"https:\/\/foursquare.com\/v\/123435\/the-bridgewater-pub","default":"https:\/\/bridgewater.pub"}', $place->external_urls);
|
||||
}
|
||||
}
|
||||
|
|
60
tests/Unit/ProcessBookmarkJobTest.php
Normal file
60
tests/Unit/ProcessBookmarkJobTest.php
Normal file
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use App\Bookmark;
|
||||
use Tests\TestCase;
|
||||
use Ramsey\Uuid\Uuid;
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\HandlerStack;
|
||||
use App\Jobs\ProcessBookmark;
|
||||
use GuzzleHttp\Psr7\Response;
|
||||
use App\Services\BookmarkService;
|
||||
use GuzzleHttp\Handler\MockHandler;
|
||||
use App\Exceptions\InternetArchiveException;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class ProcessBookmarkJobTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_screenshot_and_archive_link_are_saved()
|
||||
{
|
||||
$bookmark = Bookmark::find(1);
|
||||
$uuid = Uuid::uuid4();
|
||||
$service = $this->createMock(BookmarkService::class);
|
||||
$service->method('saveScreenshot')
|
||||
->willReturn($uuid->toString());
|
||||
$service->method('getArchiveLink')
|
||||
->willReturn('https://web.archive.org/web/1234');
|
||||
$this->app->instance(BookmarkService::class, $service);
|
||||
|
||||
$job = new ProcessBookmark($bookmark);
|
||||
$job->handle();
|
||||
|
||||
$this->assertDatabaseHas('bookmarks', [
|
||||
'screenshot' => $uuid->toString(),
|
||||
'archive' => 'https://web.archive.org/web/1234',
|
||||
]);
|
||||
}
|
||||
|
||||
public function test_exception_casesu_null_value_for_archive_link()
|
||||
{
|
||||
$bookmark = Bookmark::find(1);
|
||||
$uuid = Uuid::uuid4();
|
||||
$service = $this->createMock(BookmarkService::class);
|
||||
$service->method('saveScreenshot')
|
||||
->willReturn($uuid->toString());
|
||||
$service->method('getArchiveLink')
|
||||
->will($this->throwException(new InternetArchiveException));
|
||||
$this->app->instance(BookmarkService::class, $service);
|
||||
|
||||
$job = new ProcessBookmark($bookmark);
|
||||
$job->handle();
|
||||
|
||||
$this->assertDatabaseHas('bookmarks', [
|
||||
'screenshot' => $uuid->toString(),
|
||||
'archive' => null,
|
||||
]);
|
||||
}
|
||||
}
|
46
tests/Unit/ProcessMediaJobTest.php
Normal file
46
tests/Unit/ProcessMediaJobTest.php
Normal file
|
@ -0,0 +1,46 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use Storage;
|
||||
use Tests\TestCase;
|
||||
use App\Jobs\ProcessMedia;
|
||||
use Intervention\Image\ImageManager;
|
||||
|
||||
class ProcessMediaJobTest extends TestCase
|
||||
{
|
||||
public function test_job_does_nothing_to_non_image()
|
||||
{
|
||||
Storage::fake('s3');
|
||||
$manager = app()->make(ImageManager::class);
|
||||
Storage::disk('local')->put('file.txt', 'This is not an image');
|
||||
$job = new ProcessMedia('file.txt');
|
||||
$job->handle($manager);
|
||||
|
||||
$this->assertFalse(file_exists(storage_path('app') . '/file.txt'));
|
||||
}
|
||||
|
||||
public function test_job_does_nothing_to_small_images()
|
||||
{
|
||||
Storage::fake('s3');
|
||||
$manager = app()->make(ImageManager::class);
|
||||
Storage::disk('local')->put('aaron.png', file_get_contents(__DIR__.'/../aaron.png'));
|
||||
$job = new ProcessMedia('aaron.png');
|
||||
$job->handle($manager);
|
||||
|
||||
$this->assertFalse(file_exists(storage_path('app') . '/aaron.png'));
|
||||
}
|
||||
|
||||
public function test_large_images_have_smaller_files_created()
|
||||
{
|
||||
$manager = app()->make(ImageManager::class);
|
||||
Storage::disk('local')->put('test-image.jpg', file_get_contents(__DIR__.'/../test-image.jpg'));
|
||||
Storage::fake('s3');
|
||||
$job = new ProcessMedia('test-image.jpg');
|
||||
$job->handle($manager);
|
||||
|
||||
Storage::disk('s3')->assertExists('media/test-image-small.jpg');
|
||||
Storage::disk('s3')->assertExists('media/test-image-medium.jpg');
|
||||
$this->assertFalse(file_exists(storage_path('app') . '/test-image.jpg'));
|
||||
}
|
||||
}
|
121
tests/Unit/ProcessWebMentionJobTest.php
Normal file
121
tests/Unit/ProcessWebMentionJobTest.php
Normal file
|
@ -0,0 +1,121 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use App\Note;
|
||||
use Tests\TestCase;
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\HandlerStack;
|
||||
use GuzzleHttp\Psr7\Response;
|
||||
use App\Jobs\SaveProfileImage;
|
||||
use App\Jobs\ProcessWebMention;
|
||||
use GuzzleHttp\Handler\MockHandler;
|
||||
use Illuminate\Support\Facades\Queue;
|
||||
use Jonnybarnes\WebmentionsParser\Parser;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class ProcessWebMentionJobTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function tearDown()
|
||||
{
|
||||
if (file_exists(storage_path() . '/HTML/https/example.org/mention/1/index.html')) {
|
||||
unlink(storage_path() . '/HTML/https/example.org/mention/1/index.html');
|
||||
rmdir(storage_path() . '/HTML/https/example.org/mention/1');
|
||||
rmdir(storage_path() . '/HTML/https/example.org/mention');
|
||||
rmdir(storage_path() . '/HTML/https/example.org');
|
||||
rmdir(storage_path() . '/HTML/https');
|
||||
}
|
||||
if (file_exists(storage_path() . '/HTML/https/aaronpk.localhost/reply/1')) {
|
||||
unlink(storage_path() . '/HTML/https/aaronpk.localhost/reply/1');
|
||||
rmdir(storage_path() . '/HTML/https/aaronpk.localhost/reply');
|
||||
rmdir(storage_path() . '/HTML/https/aaronpk.localhost');
|
||||
rmdir(storage_path() . '/HTML/https');
|
||||
}
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \App\Exceptions\RemoteContentNotFoundException
|
||||
*/
|
||||
public function test_for_exception_from_failure_to_get_webmention()
|
||||
{
|
||||
$parser = new Parser();
|
||||
$mock = new MockHandler([
|
||||
new Response(404),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
|
||||
$note = Note::find(1);
|
||||
$source = 'https://example.org/mention/1/';
|
||||
|
||||
$job = new ProcessWebMention($note, $source);
|
||||
$job->handle($parser, $client);
|
||||
}
|
||||
|
||||
public function test_a_new_webmention_gets_saved()
|
||||
{
|
||||
Queue::fake();
|
||||
|
||||
$parser = new Parser();
|
||||
|
||||
$html = <<<HTML
|
||||
<div class="h-entry">
|
||||
I liked <a class="u-like-of" href="/notes/1">a note</a>.
|
||||
</div>
|
||||
HTML;
|
||||
$html = str_replace('href="', 'href="' . config('app.url'), $html);
|
||||
$mock = new MockHandler([
|
||||
new Response(200, [], $html),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
|
||||
$note = Note::find(1);
|
||||
$source = 'https://example.org/mention/1/';
|
||||
|
||||
$job = new ProcessWebMention($note, $source);
|
||||
$job->handle($parser, $client);
|
||||
|
||||
Queue::assertPushed(SaveProfileImage::class);
|
||||
$this->assertDatabaseHas('webmentions', [
|
||||
'source' => $source,
|
||||
'type' => 'like-of',
|
||||
]);
|
||||
}
|
||||
|
||||
public function test_existing_webmention_gets_updated()
|
||||
{
|
||||
Queue::fake();
|
||||
|
||||
$parser = new Parser();
|
||||
|
||||
$html = <<<HTML
|
||||
<div class="h-entry">
|
||||
<p>In reply to <a class="u-in-reply-to" href="/notes/E">a note</a></p>
|
||||
<div class="e-content">Updated reply</div>
|
||||
</div>
|
||||
HTML;
|
||||
$html = str_replace('href="', 'href="' . config('app.url'), $html);
|
||||
$mock = new MockHandler([
|
||||
new Response(200, [], $html),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
|
||||
$note = Note::find(14);
|
||||
$source = 'https://aaronpk.localhost/reply/1';
|
||||
|
||||
$job = new ProcessWebMention($note, $source);
|
||||
$job->handle($parser, $client);
|
||||
|
||||
Queue::assertPushed(SaveProfileImage::class);
|
||||
$this->assertDatabaseHas('webmentions', [
|
||||
'source' => $source,
|
||||
'type' => 'in-reply-to',
|
||||
'mf2' => '{"rels": [], "items": [{"type": ["h-entry"], "properties": {"name": ["In reply to a note \\n Updated reply"], "content": [{"html": "Updated reply", "value": "Updated reply"}], "in-reply-to": ["' . config('app.url') . '/notes/E"]}}]}',
|
||||
]);
|
||||
}
|
||||
}
|
103
tests/Unit/SaveProfileImageJobTest.php
Normal file
103
tests/Unit/SaveProfileImageJobTest.php
Normal file
|
@ -0,0 +1,103 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use Tests\TestCase;
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\HandlerStack;
|
||||
use GuzzleHttp\Psr7\Response;
|
||||
use App\Jobs\SaveProfileImage;
|
||||
use GuzzleHttp\Handler\MockHandler;
|
||||
use Jonnybarnes\WebmentionsParser\Authorship;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
use Jonnybarnes\WebmentionsParser\Exceptions\AuthorshipParserException;
|
||||
|
||||
class SaveProfileImageJobTest extends TestCase
|
||||
{
|
||||
public function tearDown()
|
||||
{
|
||||
if (file_exists(public_path() . '/assets/profile-images/example.org/image')) {
|
||||
unlink(public_path() . '/assets/profile-images/example.org/image');
|
||||
rmdir(public_path() . '/assets/profile-images/example.org');
|
||||
}
|
||||
parent::tearDown();
|
||||
}
|
||||
public function test_authorship_algo_exception_return_null()
|
||||
{
|
||||
$mf = ['items' => []];
|
||||
$authorship = $this->createMock(Authorship::class);
|
||||
$authorship->method('findAuthor')
|
||||
->will($this->throwException(new AuthorshipParserException));
|
||||
$job = new SaveProfileImage($mf);
|
||||
|
||||
$this->assertNull($job->handle($authorship));
|
||||
}
|
||||
|
||||
public function test_we_dont_process_twitter_images()
|
||||
{
|
||||
$mf = ['items' => []];
|
||||
$author = [
|
||||
'properties' => [
|
||||
'photo' => ['https://pbs.twimg.com/abc.jpg'],
|
||||
'url' => ['https://twitter.com/profile'],
|
||||
],
|
||||
];
|
||||
$authorship = $this->createMock(Authorship::class);
|
||||
$authorship->method('findAuthor')
|
||||
->willReturn($author);
|
||||
$job = new SaveProfileImage($mf);
|
||||
|
||||
$this->assertNull($job->handle($authorship));
|
||||
}
|
||||
|
||||
public function test_saving_of_remote_image()
|
||||
{
|
||||
$mock = new MockHandler([
|
||||
new Response(200, ['Content-Type' => 'image/jpeg'], 'fake jpeg image'),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
$this->app->instance(Client::class, $client);
|
||||
$mf = ['items' => []];
|
||||
$author = [
|
||||
'properties' => [
|
||||
'photo' => ['https://example.org/profile.jpg'],
|
||||
'url' => ['https://example.org'],
|
||||
],
|
||||
];
|
||||
$authorship = $this->createMock(Authorship::class);
|
||||
$authorship->method('findAuthor')
|
||||
->willReturn($author);
|
||||
|
||||
$job = new SaveProfileImage($mf);
|
||||
$job->handle($authorship);
|
||||
$this->assertFileExists(public_path() . '/assets/profile-images/example.org/image');
|
||||
}
|
||||
|
||||
public function test_copying_of_local_image()
|
||||
{
|
||||
$mock = new MockHandler([
|
||||
new Response(404),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
$this->app->instance(Client::class, $client);
|
||||
$mf = ['items' => []];
|
||||
$author = [
|
||||
'properties' => [
|
||||
'photo' => ['https://example.org/profile.jpg'],
|
||||
'url' => ['https://example.org'],
|
||||
],
|
||||
];
|
||||
$authorship = $this->createMock(Authorship::class);
|
||||
$authorship->method('findAuthor')
|
||||
->willReturn($author);
|
||||
|
||||
$job = new SaveProfileImage($mf);
|
||||
$job->handle($authorship);
|
||||
$this->assertFileEquals(
|
||||
public_path() . '/assets/profile-images/default-image',
|
||||
public_path() . '/assets/profile-images/example.org/image'
|
||||
);
|
||||
}
|
||||
}
|
102
tests/Unit/SendWebMentionJobTest.php
Normal file
102
tests/Unit/SendWebMentionJobTest.php
Normal file
|
@ -0,0 +1,102 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use App\Note;
|
||||
use Tests\TestCase;
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\HandlerStack;
|
||||
use App\Jobs\SendWebMentions;
|
||||
use GuzzleHttp\Psr7\Response;
|
||||
use GuzzleHttp\Handler\MockHandler;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
|
||||
class SendWebMentionJobTest extends TestCase
|
||||
{
|
||||
public function test_dicover_endoint_method_on_self()
|
||||
{
|
||||
$note = new Note();
|
||||
$job = new SendWebMentions($note);
|
||||
$this->assertNull($job->discoverWebmentionEndpoint(config('app.url')));
|
||||
$this->assertNull($job->discoverWebmentionEndpoint('/notes/tagged/test'));
|
||||
}
|
||||
|
||||
public function test_discover_endpoint_gets_link_from_headers()
|
||||
{
|
||||
$url = 'https://example.org/webmention';
|
||||
$mock = new MockHandler([
|
||||
new Response(200, ['Link' => '<' . $url . '>; rel="webmention"']),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
$this->app->instance(Client::class, $client);
|
||||
|
||||
$job = new SendWebMentions(new Note());
|
||||
$this->assertEquals($url, $job->discoverWebmentionEndpoint('https://example.org'));
|
||||
}
|
||||
|
||||
public function test_discover_endpoint_correctly_parses_html()
|
||||
{
|
||||
$html = '<link rel="webmention" href="https://example.org/webmention">';
|
||||
$mock = new MockHandler([
|
||||
new Response(200, [], $html),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
$this->app->instance(Client::class, $client);
|
||||
|
||||
$job = new SendWebMentions(new Note());
|
||||
$this->assertEquals(
|
||||
'https://example.org/webmention',
|
||||
$job->discoverWebmentionEndpoint('https://example.org')
|
||||
);
|
||||
}
|
||||
|
||||
public function test_discover_endpoint_correctly_parses_html_legacy()
|
||||
{
|
||||
$html = '<link rel="http://webmention.org/" href="https://example.org/webmention">';
|
||||
$mock = new MockHandler([
|
||||
new Response(200, [], $html),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
$this->app->instance(Client::class, $client);
|
||||
|
||||
$job = new SendWebMentions(new Note());
|
||||
$this->assertEquals(
|
||||
'https://example.org/webmention',
|
||||
$job->discoverWebmentionEndpoint('https://example.org')
|
||||
);
|
||||
}
|
||||
|
||||
public function test_empty_note_does_nothing()
|
||||
{
|
||||
$job = new SendWebMentions(new Note());
|
||||
$this->assertNull($job->handle());
|
||||
}
|
||||
|
||||
public function test_resolve_uri()
|
||||
{
|
||||
$uri = '/blog/post';
|
||||
$base = 'https://example.org/';
|
||||
$job = new SendWebMentions(new Note());
|
||||
$this->assertEquals('https://example.org/blog/post', $job->resolveUri($uri, $base));
|
||||
}
|
||||
|
||||
public function test_the_job()
|
||||
{
|
||||
$html = '<link rel="http://webmention.org/" href="https://example.org/webmention">';
|
||||
$mock = new MockHandler([
|
||||
new Response(200, [], $html),
|
||||
new Response(202),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
$this->app->instance(Client::class, $client);
|
||||
|
||||
$note = new Note();
|
||||
$note->note = 'Hi [Aaron](https://aaronparecki.com)';
|
||||
$job = new SendWebMentions($note);
|
||||
$this->assertNull($job->handle());
|
||||
}
|
||||
}
|
38
tests/Unit/SyndicateBookmarkToFacebookJobTest.php
Normal file
38
tests/Unit/SyndicateBookmarkToFacebookJobTest.php
Normal file
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use App\Bookmark;
|
||||
use Tests\TestCase;
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\HandlerStack;
|
||||
use GuzzleHttp\Psr7\Response;
|
||||
use GuzzleHttp\Handler\MockHandler;
|
||||
use App\Jobs\SyndicateBookmarkToFacebook;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class SyndicateBookmarkToFacebookJobTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_the_job()
|
||||
{
|
||||
$json = json_encode([
|
||||
'url' => 'https://facebook.com/123'
|
||||
]);
|
||||
$mock = new MockHandler([
|
||||
new Response(201, ['Content-Type' => 'application/json'], $json),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
|
||||
$bookmark = Bookmark::find(1);
|
||||
$job = new SyndicateBookmarkToFacebook($bookmark);
|
||||
$job->handle($client);
|
||||
|
||||
$this->assertDatabaseHas('bookmarks', [
|
||||
'id' => 1,
|
||||
'syndicates' => '{"facebook": "https://facebook.com/123"}',
|
||||
]);
|
||||
}
|
||||
}
|
38
tests/Unit/SyndicateBookmarkToTwitterJobTest.php
Normal file
38
tests/Unit/SyndicateBookmarkToTwitterJobTest.php
Normal file
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use App\Bookmark;
|
||||
use Tests\TestCase;
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\HandlerStack;
|
||||
use GuzzleHttp\Psr7\Response;
|
||||
use GuzzleHttp\Handler\MockHandler;
|
||||
use App\Jobs\SyndicateBookmarkToTwitter;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class SyndicateBookmarkToTwitterJobTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_the_job()
|
||||
{
|
||||
$json = json_encode([
|
||||
'url' => 'https://twitter.com/123'
|
||||
]);
|
||||
$mock = new MockHandler([
|
||||
new Response(201, ['Content-Type' => 'application/json'], $json),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
|
||||
$bookmark = Bookmark::find(1);
|
||||
$job = new SyndicateBookmarkToTwitter($bookmark);
|
||||
$job->handle($client);
|
||||
|
||||
$this->assertDatabaseHas('bookmarks', [
|
||||
'id' => 1,
|
||||
'syndicates' => '{"twitter": "https://twitter.com/123"}',
|
||||
]);
|
||||
}
|
||||
}
|
38
tests/Unit/SyndicateNoteToFacebookJobTest.php
Normal file
38
tests/Unit/SyndicateNoteToFacebookJobTest.php
Normal file
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use App\Note;
|
||||
use Tests\TestCase;
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\HandlerStack;
|
||||
use GuzzleHttp\Psr7\Response;
|
||||
use GuzzleHttp\Handler\MockHandler;
|
||||
use App\Jobs\SyndicateNoteToFacebook;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class SyndicateNoteToFacebookJobTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_the_job()
|
||||
{
|
||||
$json = json_encode([
|
||||
'url' => 'https://facebook.com/123'
|
||||
]);
|
||||
$mock = new MockHandler([
|
||||
new Response(201, ['Content-Type' => 'application/json'], $json),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
|
||||
$note = Note::find(1);
|
||||
$job = new SyndicateNoteToFacebook($note);
|
||||
$job->handle($client);
|
||||
|
||||
$this->assertDatabaseHas('notes', [
|
||||
'id' => 1,
|
||||
'facebook_url' => 'https://facebook.com/123',
|
||||
]);
|
||||
}
|
||||
}
|
38
tests/Unit/SyndicateNoteToTwitterJobTest.php
Normal file
38
tests/Unit/SyndicateNoteToTwitterJobTest.php
Normal file
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use App\Note;
|
||||
use Tests\TestCase;
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\HandlerStack;
|
||||
use GuzzleHttp\Psr7\Response;
|
||||
use GuzzleHttp\Handler\MockHandler;
|
||||
use App\Jobs\SyndicateNoteToTwitter;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class SyndicateNoteToTwitterJobTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_the_job()
|
||||
{
|
||||
$json = json_encode([
|
||||
'url' => 'https://twitter.com/i/web/status/123'
|
||||
]);
|
||||
$mock = new MockHandler([
|
||||
new Response(201, ['Content-Type' => 'application/json'], $json),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
|
||||
$note = Note::find(1);
|
||||
$job = new SyndicateNoteToTwitter($note);
|
||||
$job->handle($client);
|
||||
|
||||
$this->assertDatabaseHas('notes', [
|
||||
'id' => 1,
|
||||
'tweet_id' => '123',
|
||||
]);
|
||||
}
|
||||
}
|
21
tests/Unit/TagsTest.php
Normal file
21
tests/Unit/TagsTest.php
Normal file
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use App\Tag;
|
||||
use Tests\TestCase;
|
||||
|
||||
class TagsTest extends TestCase
|
||||
{
|
||||
public function test_notes_method()
|
||||
{
|
||||
$tag = Tag::find(1); // should be beer tag
|
||||
$this->assertEquals(1, count($tag->notes));
|
||||
}
|
||||
|
||||
public function test_bookmarks_method()
|
||||
{
|
||||
$tag = Tag::find(4); //should be first random tag for bookmarks
|
||||
$this->assertEquals(1, count($tag->bookmarks));
|
||||
}
|
||||
}
|
|
@ -2,12 +2,43 @@
|
|||
|
||||
namespace Tests\Unit;
|
||||
|
||||
use Cache;
|
||||
use App\WebMention;
|
||||
use Tests\TestCase;
|
||||
use Thujohn\Twitter\Facades\Twitter;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
class WebMentionTest extends TestCase
|
||||
{
|
||||
public function test_commentable_method()
|
||||
{
|
||||
$webmention = WebMention::find(1);
|
||||
$this->assertInstanceOf('App\Note', $webmention->commentable);
|
||||
}
|
||||
public function test_published_attribute_when_no_relavent_mf2()
|
||||
{
|
||||
$webmention = new WebMention();
|
||||
$updated_at = carbon()->now();
|
||||
$webmention->updated_at = $updated_at;
|
||||
$this->assertEquals($updated_at->toDayDateTimeString(), $webmention->published);
|
||||
}
|
||||
|
||||
public function test_published_attribute_when_error_parsing_mf2()
|
||||
{
|
||||
$webmention = new WebMention();
|
||||
$updated_at = carbon()->now();
|
||||
$webmention->updated_at = $updated_at;
|
||||
$webmention->mf2 = json_encode([
|
||||
'items' => [[
|
||||
'properties' => [
|
||||
'published' => [
|
||||
'error',
|
||||
],
|
||||
],
|
||||
]],
|
||||
]);
|
||||
$this->assertEquals($updated_at->toDayDateTimeString(), $webmention->published);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test a correct profile link is formed from a generic URL.
|
||||
*
|
||||
|
@ -60,4 +91,31 @@ class WebMentionTest extends TestCase
|
|||
Cache::put($twitterURL, $expected, 1);
|
||||
$this->assertEquals($expected, $webmention->createPhotoLink($twitterURL));
|
||||
}
|
||||
|
||||
public function test_create_photo_link_with_noncached_twitter_url()
|
||||
{
|
||||
Cache::shouldReceive('has')
|
||||
->once()
|
||||
->andReturn(false);
|
||||
Cache::shouldReceive('put')
|
||||
->once()
|
||||
->andReturn(true);
|
||||
$info = new \stdClass();
|
||||
$info->profile_image_url_https = 'https://pbs.twimg.com/static_profile_link.jpg';
|
||||
Twitter::shouldReceive('getUsers')
|
||||
->once()
|
||||
->with(['screen_name' => 'example'])
|
||||
->andReturn($info);
|
||||
|
||||
$webmention = new WebMention();
|
||||
$twitterURL = 'https://twitter.com/example';
|
||||
$expected = 'https://pbs.twimg.com/static_profile_link.jpg';
|
||||
$this->assertEquals($expected, $webmention->createPhotoLink($twitterURL));
|
||||
}
|
||||
|
||||
public function test_get_reply_attribute_returns_null()
|
||||
{
|
||||
$webmention = new WebMention();
|
||||
$this->assertNull($webmention->reply);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue