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:
Jonny Barnes 2017-12-07 15:06:56 +00:00
parent 6e02e31f52
commit a4f07e510e
117 changed files with 3336 additions and 1330 deletions

View 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',
]);
}
}

View 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);
}
}

View 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');
}
}

View 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
View 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
View 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);
}
}

View 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);
}
}

View file

@ -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 well 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,
]);
}
}

View file

@ -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);
}
}

View 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,
]);
}
}

View 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'));
}
}

View 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"]}}]}',
]);
}
}

View 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'
);
}
}

View 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());
}
}

View 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"}',
]);
}
}

View 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"}',
]);
}
}

View 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',
]);
}
}

View 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
View 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));
}
}

View file

@ -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);
}
}