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
16
tests/Feature/AdminHomeControllerTest.php
Normal file
16
tests/Feature/AdminHomeControllerTest.php
Normal file
|
@ -0,0 +1,16 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use Tests\TestCase;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
|
||||
class AdminHomeControllerTest extends TestCase
|
||||
{
|
||||
public function test_admin_homepage()
|
||||
{
|
||||
$response = $this->withSession(['loggedin' => true])
|
||||
->get('/admin');
|
||||
$response->assertViewIs('admin.welcome');
|
||||
}
|
||||
}
|
39
tests/Feature/AdminTest.php
Normal file
39
tests/Feature/AdminTest.php
Normal file
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use Tests\TestCase;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
|
||||
class AdminTest extends TestCase
|
||||
{
|
||||
public function test_admin_page_redirects_to_login()
|
||||
{
|
||||
$response = $this->get('/admin');
|
||||
$response->assertRedirect('/login');
|
||||
}
|
||||
|
||||
public function test_login_page()
|
||||
{
|
||||
$response = $this->get('/login');
|
||||
$response->assertViewIs('login');
|
||||
}
|
||||
|
||||
public function test_attempt_login_with_good_credentials()
|
||||
{
|
||||
$response = $this->post('/login', [
|
||||
'username' => config('admin.user'),
|
||||
'password' => config('admin.pass'),
|
||||
]);
|
||||
$response->assertRedirect('/admin');
|
||||
}
|
||||
|
||||
public function test_attempt_login_with_bad_credentials()
|
||||
{
|
||||
$response = $this->post('/login', [
|
||||
'username' => 'bad',
|
||||
'password' => 'credentials',
|
||||
]);
|
||||
$response->assertRedirect('/login');
|
||||
}
|
||||
}
|
|
@ -10,6 +10,20 @@ class ArticlesAdminTest extends TestCase
|
|||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_index_page()
|
||||
{
|
||||
$response = $this->withSession(['loggedin' => true])
|
||||
->get('/admin/blog');
|
||||
$response->assertSeeText('Select article to edit:');
|
||||
}
|
||||
|
||||
public function test_create_page()
|
||||
{
|
||||
$response = $this->withSession(['loggedin' => true])
|
||||
->get('/admin/blog/create');
|
||||
$response->assertSeeText('Title (URL)');
|
||||
}
|
||||
|
||||
public function test_create_new_article()
|
||||
{
|
||||
$this->withSession(['loggedin' => true])
|
||||
|
@ -42,4 +56,36 @@ class ArticlesAdminTest extends TestCase
|
|||
'main' => $text,
|
||||
]);
|
||||
}
|
||||
|
||||
public function test_see_edit_form()
|
||||
{
|
||||
$response = $this->withSession(['loggedin' => true])
|
||||
->get('/admin/blog/1/edit');
|
||||
$response->assertSeeText('This is *my* new blog. It uses `Markdown`.');
|
||||
}
|
||||
|
||||
public function test_edit_article()
|
||||
{
|
||||
$this->withSession(['loggedin' => true])
|
||||
->post('/admin/blog/1', [
|
||||
'_method' => 'PUT',
|
||||
'title' => 'My New Blog',
|
||||
'main' => 'This article has been edited',
|
||||
]);
|
||||
$this->assertDatabaseHas('articles', [
|
||||
'title' => 'My New Blog',
|
||||
'main' => 'This article has been edited',
|
||||
]);
|
||||
}
|
||||
|
||||
public function test_delete_article()
|
||||
{
|
||||
$this->withSession(['loggedin' => true])
|
||||
->post('/admin/blog/1', [
|
||||
'_method' => 'DELETE',
|
||||
]);
|
||||
$this->assertSoftDeleted('articles', [
|
||||
'title' => 'My New Blog',
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
33
tests/Feature/ArticlesTest.php
Normal file
33
tests/Feature/ArticlesTest.php
Normal file
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use Tests\TestCase;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
|
||||
class ArticlesTest extends TestCase
|
||||
{
|
||||
public function test_articles_page()
|
||||
{
|
||||
$response = $this->get('/blog');
|
||||
$response->assertViewIs('articles.index');
|
||||
}
|
||||
|
||||
public function test_single_article()
|
||||
{
|
||||
$response = $this->get('/blog/' . date('Y') . '/' . date('m') . '/my-new-blog');
|
||||
$response->assertViewIs('articles.show');
|
||||
}
|
||||
|
||||
public function test_wrong_date_redirects()
|
||||
{
|
||||
$response = $this->get('/blog/1900/01/my-new-blog');
|
||||
$response->assertRedirect('/blog/' . date('Y') . '/' . date('m') . '/my-new-blog');
|
||||
}
|
||||
|
||||
public function test_redirect_for_id()
|
||||
{
|
||||
$response = $this->get('/blog/s/1');
|
||||
$response->assertRedirect('/blog/' . date('Y') . '/' . date('m') . '/my-new-blog');
|
||||
}
|
||||
}
|
|
@ -6,13 +6,27 @@ use Tests\TestCase;
|
|||
use Tests\TestToken;
|
||||
use App\Jobs\ProcessBookmark;
|
||||
use Illuminate\Support\Facades\Queue;
|
||||
use App\Jobs\SyndicateBookmarkToTwitter;
|
||||
use App\Jobs\SyndicateBookmarkToFacebook;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class BookmarksTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions, TestToken;
|
||||
|
||||
public function test_browsershot_job_dispatches_when_bookmark_added()
|
||||
public function test_bookmarks_page()
|
||||
{
|
||||
$response = $this->get('/bookmarks');
|
||||
$response->assertViewIs('bookmarks.index');
|
||||
}
|
||||
|
||||
public function test_single_bookmark_page()
|
||||
{
|
||||
$response = $this->get('/bookmarks/1');
|
||||
$response->assertViewIs('bookmarks.show');
|
||||
}
|
||||
|
||||
public function test_browsershot_job_dispatches_when_bookmark_added_http_post_syntax()
|
||||
{
|
||||
Queue::fake();
|
||||
|
||||
|
@ -21,6 +35,95 @@ class BookmarksTest extends TestCase
|
|||
])->post('/api/post', [
|
||||
'h' => 'entry',
|
||||
'bookmark-of' => 'https://example.org/blog-post',
|
||||
'mp-syndicate-to' => [
|
||||
'https://twitter.com/jonnybarnes',
|
||||
'https://facebook.com/jonnybarnes',
|
||||
],
|
||||
]);
|
||||
|
||||
$response->assertJson(['response' => 'created']);
|
||||
|
||||
Queue::assertPushed(ProcessBookmark::class);
|
||||
Queue::assertPushed(SyndicateBookmarkToTwitter::class);
|
||||
Queue::assertPushed(SyndicateBookmarkToFacebook::class);
|
||||
$this->assertDatabaseHas('bookmarks', ['url' => 'https://example.org/blog-post']);
|
||||
}
|
||||
|
||||
public function test_browsershot_job_dispatches_when_bookmark_added_json_syntax()
|
||||
{
|
||||
Queue::fake();
|
||||
|
||||
$response = $this->withHeaders([
|
||||
'Authorization' => 'Bearer ' . $this->getToken(),
|
||||
])->json('POST', '/api/post', [
|
||||
'type' => ['h-entry'],
|
||||
'properties' => [
|
||||
'bookmark-of' => ['https://example.org/blog-post'],
|
||||
'mp-syndicate-to' => [
|
||||
'https://twitter.com/jonnybarnes',
|
||||
'https://facebook.com/jonnybarnes',
|
||||
],
|
||||
],
|
||||
]);
|
||||
|
||||
$response->assertJson(['response' => 'created']);
|
||||
|
||||
Queue::assertPushed(ProcessBookmark::class);
|
||||
Queue::assertPushed(SyndicateBookmarkToTwitter::class);
|
||||
Queue::assertPushed(SyndicateBookmarkToFacebook::class);
|
||||
$this->assertDatabaseHas('bookmarks', ['url' => 'https://example.org/blog-post']);
|
||||
}
|
||||
|
||||
public function test_single_twitter_syndication_target_causes_job_dispatch_http_post_syntax()
|
||||
{
|
||||
Queue::fake();
|
||||
|
||||
$response = $this->withHeaders([
|
||||
'Authorization' => 'Bearer ' . $this->getToken(),
|
||||
])->post('/api/post', [
|
||||
'h' => 'entry',
|
||||
'bookmark-of' => 'https://example.org/blog-post',
|
||||
'mp-syndicate-to' => 'https://twitter.com/jonnybarnes',
|
||||
]);
|
||||
|
||||
$response->assertJson(['response' => 'created']);
|
||||
|
||||
Queue::assertPushed(ProcessBookmark::class);
|
||||
Queue::assertPushed(SyndicateBookmarkToTwitter::class);
|
||||
$this->assertDatabaseHas('bookmarks', ['url' => 'https://example.org/blog-post']);
|
||||
}
|
||||
|
||||
public function test_single_facebook_syndication_target_causes_job_dispatch_http_post_syntax()
|
||||
{
|
||||
Queue::fake();
|
||||
|
||||
$response = $this->withHeaders([
|
||||
'Authorization' => 'Bearer ' . $this->getToken(),
|
||||
])->post('/api/post', [
|
||||
'h' => 'entry',
|
||||
'bookmark-of' => 'https://example.org/blog-post',
|
||||
'mp-syndicate-to' => 'https://facebook.com/jonnybarnes',
|
||||
]);
|
||||
|
||||
$response->assertJson(['response' => 'created']);
|
||||
|
||||
Queue::assertPushed(ProcessBookmark::class);
|
||||
Queue::assertPushed(SyndicateBookmarkToFacebook::class);
|
||||
$this->assertDatabaseHas('bookmarks', ['url' => 'https://example.org/blog-post']);
|
||||
}
|
||||
|
||||
public function test_tags_created_with_new_bookmark()
|
||||
{
|
||||
Queue::fake();
|
||||
|
||||
$response = $this->withHeaders([
|
||||
'Authorization' => 'Bearer ' . $this->getToken(),
|
||||
])->json('POST', '/api/post', [
|
||||
'type' => ['h-entry'],
|
||||
'properties' => [
|
||||
'bookmark-of' => ['https://example.org/blog-post'],
|
||||
'category' => ['tag1', 'tag2'],
|
||||
],
|
||||
]);
|
||||
|
||||
$response->assertJson(['response' => 'created']);
|
||||
|
@ -28,13 +131,4 @@ class BookmarksTest extends TestCase
|
|||
Queue::assertPushed(ProcessBookmark::class);
|
||||
$this->assertDatabaseHas('bookmarks', ['url' => 'https://example.org/blog-post']);
|
||||
}
|
||||
|
||||
public function test_screenshot_of_google()
|
||||
{
|
||||
$url = 'https://www.google.co.uk';
|
||||
|
||||
$uuid = (new \App\Services\BookmarkService())->saveScreenshot($url);
|
||||
|
||||
$this->assertTrue(file_exists(public_path() . '/assets/img/bookmarks/' . $uuid . '.png'));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ class BridgyPosseTest extends TestCase
|
|||
{
|
||||
public function test_bridgy_twitter_content()
|
||||
{
|
||||
$response = $this->get('/notes/C');
|
||||
$response = $this->get('/notes/E');
|
||||
|
||||
$html = $response->content();
|
||||
$this->assertTrue(is_string(mb_stristr($html, 'p-bridgy-twitter-content')));
|
||||
|
@ -16,7 +16,7 @@ class BridgyPosseTest extends TestCase
|
|||
|
||||
public function test_bridgy_facebook_content()
|
||||
{
|
||||
$response = $this->get('/notes/C');
|
||||
$response = $this->get('/notes/E');
|
||||
|
||||
$html = $response->content();
|
||||
$this->assertTrue(is_string(mb_stristr($html, 'p-bridgy-facebook-content')));
|
||||
|
|
70
tests/Feature/ClientsAdminTest.php
Normal file
70
tests/Feature/ClientsAdminTest.php
Normal file
|
@ -0,0 +1,70 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use Tests\TestCase;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class ClientsAdminTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_index_page()
|
||||
{
|
||||
$response = $this->withSession(['loggedin' => true])
|
||||
->get('/admin/clients');
|
||||
$response->assertSeeText('Clients');
|
||||
}
|
||||
|
||||
public function test_create_page()
|
||||
{
|
||||
$response = $this->withSession(['loggedin' => true])
|
||||
->get('/admin/clients/create');
|
||||
$response->assertSeeText('New Client');
|
||||
}
|
||||
|
||||
public function test_create_new_client()
|
||||
{
|
||||
$this->withSession(['loggedin' => true])
|
||||
->post('/admin/clients', [
|
||||
'client_name' => 'Micropublish',
|
||||
'client_url' => 'https://micropublish.net'
|
||||
]);
|
||||
$this->assertDatabaseHas('clients', [
|
||||
'client_name' => 'Micropublish',
|
||||
'client_url' => 'https://micropublish.net'
|
||||
]);
|
||||
}
|
||||
|
||||
public function test_see_edit_form()
|
||||
{
|
||||
$response = $this->withSession(['loggedin' => true])
|
||||
->get('/admin/clients/1/edit');
|
||||
$response->assertSee('https://jbl5.dev/notes/new');
|
||||
}
|
||||
|
||||
public function test_edit_client()
|
||||
{
|
||||
$this->withSession(['loggedin' => true])
|
||||
->post('/admin/clients/1', [
|
||||
'_method' => 'PUT',
|
||||
'client_url' => 'https://jbl5.dev/notes/new',
|
||||
'client_name' => 'JBL5dev',
|
||||
]);
|
||||
$this->assertDatabaseHas('clients', [
|
||||
'client_url' => 'https://jbl5.dev/notes/new',
|
||||
'client_name' => 'JBL5dev',
|
||||
]);
|
||||
}
|
||||
|
||||
public function test_delete_client()
|
||||
{
|
||||
$this->withSession(['loggedin' => true])
|
||||
->post('/admin/clients/1', [
|
||||
'_method' => 'DELETE',
|
||||
]);
|
||||
$this->assertDatabaseMissing('clients', [
|
||||
'client_url' => 'https://jbl5.dev/notes/new',
|
||||
]);
|
||||
}
|
||||
}
|
194
tests/Feature/ContactsAdminTest.php
Normal file
194
tests/Feature/ContactsAdminTest.php
Normal file
|
@ -0,0 +1,194 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Contact;
|
||||
use Tests\TestCase;
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\HandlerStack;
|
||||
use GuzzleHttp\Psr7\Response;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use GuzzleHttp\Handler\MockHandler;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class ContactsAdminTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function tearDown()
|
||||
{
|
||||
if (file_exists(public_path() . '/assets/profile-images/tantek.com/image')) {
|
||||
unlink(public_path() . '/assets/profile-images/tantek.com/image');
|
||||
rmdir(public_path() . '/assets/profile-images/tantek.com');
|
||||
}
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
public function test_index_page()
|
||||
{
|
||||
$response = $this->withSession([
|
||||
'loggedin' => true
|
||||
])->get('/admin/contacts');
|
||||
$response->assertViewIs('admin.contacts.index');
|
||||
}
|
||||
|
||||
public function test_create_page()
|
||||
{
|
||||
$response = $this->withSession([
|
||||
'loggedin' => true
|
||||
])->get('/admin/contacts/create');
|
||||
$response->assertViewIs('admin.contacts.create');
|
||||
}
|
||||
|
||||
public function test_create_new_contact()
|
||||
{
|
||||
$this->withSession([
|
||||
'loggedin' => true
|
||||
])->post('/admin/contacts', [
|
||||
'name' => 'Fred Bloggs',
|
||||
'nick' => 'fred',
|
||||
'homepage' => 'https://fred.blog/gs',
|
||||
]);
|
||||
$this->assertDatabaseHas('contacts', [
|
||||
'name' => 'Fred Bloggs',
|
||||
'nick' => 'fred',
|
||||
'homepage' => 'https://fred.blog/gs'
|
||||
]);
|
||||
}
|
||||
|
||||
public function test_see_edit_form()
|
||||
{
|
||||
$response = $this->withSession([
|
||||
'loggedin' => true
|
||||
])->get('/admin/contacts/1/edit');
|
||||
$response->assertViewIs('admin.contacts.edit');
|
||||
}
|
||||
|
||||
public function test_update_contact_no_uploaded_avatar()
|
||||
{
|
||||
$this->withSession([
|
||||
'loggedin' => true
|
||||
])->post('/admin/contacts/1', [
|
||||
'_method' => 'PUT',
|
||||
'name' => 'Tantek Celik',
|
||||
'nick' => 'tantek',
|
||||
'homepage' => 'https://tantek.com',
|
||||
'twitter' => 't',
|
||||
]);
|
||||
$this->assertDatabaseHas('contacts', [
|
||||
'name' => 'Tantek Celik',
|
||||
'homepage' => 'https://tantek.com',
|
||||
]);
|
||||
}
|
||||
|
||||
public function test_edit_contact_with_uploaded_avatar()
|
||||
{
|
||||
copy(__DIR__ . '/../aaron.png', sys_get_temp_dir() . '/tantek.png');
|
||||
$path = sys_get_temp_dir() . '/tantek.png';
|
||||
$file = new UploadedFile($path, 'tantek.png', 'image/png', filesize($path), null, true);
|
||||
$this->withSession([
|
||||
'loggedin' => true
|
||||
])->post('/admin/contacts/1', [
|
||||
'_method' => 'PUT',
|
||||
'name' => 'Tantek Celik',
|
||||
'nick' => 'tantek',
|
||||
'homepage' => 'https://tantek.com',
|
||||
'twitter' => 't',
|
||||
'avatar' => $file,
|
||||
]);
|
||||
$this->assertFileEquals(
|
||||
__DIR__ . '/../aaron.png',
|
||||
public_path() . '/assets/profile-images/tantek.com/image'
|
||||
);
|
||||
}
|
||||
|
||||
public function test_delete_contact()
|
||||
{
|
||||
$this->withSession([
|
||||
'loggedin' => true
|
||||
])->post('/admin/contacts/1', [
|
||||
'_method' => 'DELETE',
|
||||
]);
|
||||
$this->assertDatabaseMissing('contacts', [
|
||||
'nick' => 'tantek',
|
||||
]);
|
||||
}
|
||||
|
||||
public function test_get_avatar_method()
|
||||
{
|
||||
$html = <<<HTML
|
||||
<div class="h-card">
|
||||
<img class="u-photo" src="http://tantek.com/tantek.png">
|
||||
</div>
|
||||
HTML;
|
||||
$file = fopen(__DIR__ . '/../aaron.png', 'r');
|
||||
$mock = new MockHandler([
|
||||
new Response(200, ['Content-Type' => 'text/html'], $html),
|
||||
new Response(200, ['Content-Type' => 'iamge/png'], $file),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
$this->app->instance(Client::class, $client);
|
||||
|
||||
$response = $this->withSession([
|
||||
'loggedin' => true,
|
||||
])->get('/admin/contacts/1/getavatar');
|
||||
|
||||
$this->assertFileEquals(
|
||||
__DIR__ . '/../aaron.png',
|
||||
public_path() . '/assets/profile-images/tantek.com/image'
|
||||
);
|
||||
}
|
||||
|
||||
public function test_get_avatar_method_redirects_with_failed_homepage()
|
||||
{
|
||||
$mock = new MockHandler([
|
||||
new Response(404),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
$this->app->instance(Client::class, $client);
|
||||
|
||||
$response = $this->withSession([
|
||||
'loggedin' => true,
|
||||
])->get('/admin/contacts/1/getavatar');
|
||||
|
||||
$response->assertRedirect('/admin/contacts/1/edit');
|
||||
}
|
||||
|
||||
public function test_get_avatar_method_redirects_with_failed_avatar_download()
|
||||
{
|
||||
$html = <<<HTML
|
||||
<div class="h-card">
|
||||
<img class="u-photo" src="http://tantek.com/tantek.png">
|
||||
</div>
|
||||
HTML;
|
||||
$mock = new MockHandler([
|
||||
new Response(200, ['Content-Type' => 'text/html'], $html),
|
||||
new Response(404),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
$this->app->instance(Client::class, $client);
|
||||
|
||||
$response = $this->withSession([
|
||||
'loggedin' => true,
|
||||
])->get('/admin/contacts/1/getavatar');
|
||||
|
||||
$response->assertRedirect('/admin/contacts/1/edit');
|
||||
}
|
||||
|
||||
public function test_get_avatar_for_contact_with_no_homepage()
|
||||
{
|
||||
$contact = Contact::create([
|
||||
'nick' => 'fred',
|
||||
'name' => 'Fred Bloggs',
|
||||
]);
|
||||
|
||||
$response = $this->withSession([
|
||||
'loggedin' => true,
|
||||
])->get('/admin/contacts/' . $contact->id . '/getavatar');
|
||||
|
||||
$response->assertRedirect('/admin/contacts/' . $contact->id . '/edit');
|
||||
}
|
||||
}
|
|
@ -32,7 +32,7 @@ class LikesTest extends TestCase
|
|||
$response->assertViewIs('likes.show');
|
||||
}
|
||||
|
||||
public function test_like_micropub_request()
|
||||
public function test_like_micropub_json_request()
|
||||
{
|
||||
Queue::fake();
|
||||
|
||||
|
@ -51,7 +51,24 @@ class LikesTest extends TestCase
|
|||
$this->assertDatabaseHas('likes', ['url' => 'https://example.org/blog-post']);
|
||||
}
|
||||
|
||||
public function test_process_like_job()
|
||||
public function test_like_micropub_form_request()
|
||||
{
|
||||
Queue::fake();
|
||||
|
||||
$response = $this->withHeaders([
|
||||
'Authorization' => 'Bearer ' . $this->getToken(),
|
||||
])->post('/api/post', [
|
||||
'h' => 'entry',
|
||||
'like-of' => 'https://example.org/blog-post',
|
||||
]);
|
||||
|
||||
$response->assertStatus(201);
|
||||
|
||||
Queue::assertPushed(ProcessLike::class);
|
||||
$this->assertDatabaseHas('likes', ['url' => 'https://example.org/blog-post']);
|
||||
}
|
||||
|
||||
public function test_process_like_job_with_simple_author()
|
||||
{
|
||||
$like = new Like();
|
||||
$like->url = 'http://example.org/note/id';
|
||||
|
@ -85,4 +102,75 @@ END;
|
|||
|
||||
$this->assertEquals('Fred Bloggs', Like::find($id)->author_name);
|
||||
}
|
||||
|
||||
public function test_process_like_job_with_h_card()
|
||||
{
|
||||
$like = new Like();
|
||||
$like->url = 'http://example.org/note/id';
|
||||
$like->save();
|
||||
$id = $like->id;
|
||||
|
||||
$job = new ProcessLike($like);
|
||||
|
||||
$content = <<<END
|
||||
<html>
|
||||
<body>
|
||||
<div class="h-entry">
|
||||
<div class="e-content">
|
||||
A post that I like.
|
||||
</div>
|
||||
by
|
||||
<div class="p-author h-card">
|
||||
<span class="p-name">Fred Bloggs</span>
|
||||
<a class="u-url" href="https://fredd.blog/gs"></a>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
END;
|
||||
$mock = new MockHandler([
|
||||
new Response(200, [], $content),
|
||||
new Response(200, [], $content),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
$this->app->bind(Client::class, $client);
|
||||
$authorship = new Authorship();
|
||||
|
||||
$job->handle($client, $authorship);
|
||||
|
||||
$this->assertEquals('Fred Bloggs', Like::find($id)->author_name);
|
||||
}
|
||||
|
||||
public function test_process_like_job_without_mf2()
|
||||
{
|
||||
$like = new Like();
|
||||
$like->url = 'http://example.org/note/id';
|
||||
$like->save();
|
||||
$id = $like->id;
|
||||
|
||||
$job = new ProcessLike($like);
|
||||
|
||||
$content = <<<END
|
||||
<html>
|
||||
<body>
|
||||
<div>
|
||||
I liked a post
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
END;
|
||||
$mock = new MockHandler([
|
||||
new Response(200, [], $content),
|
||||
new Response(200, [], $content),
|
||||
]);
|
||||
$handler = HandlerStack::create($mock);
|
||||
$client = new Client(['handler' => $handler]);
|
||||
$this->app->bind(Client::class, $client);
|
||||
$authorship = new Authorship();
|
||||
|
||||
$job->handle($client, $authorship);
|
||||
|
||||
$this->assertNull(Like::find($id)->author_name);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,11 @@ namespace Tests\Feature;
|
|||
use Tests\TestCase;
|
||||
use Tests\TestToken;
|
||||
use Lcobucci\JWT\Builder;
|
||||
use App\Jobs\ProcessMedia;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use Lcobucci\JWT\Signer\Hmac\Sha256;
|
||||
use Illuminate\Support\Facades\Queue;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class MicropubControllerTest extends TestCase
|
||||
|
@ -18,7 +22,7 @@ class MicropubControllerTest extends TestCase
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_micropub_request_without_token_returns_401_response()
|
||||
public function test_micropub_get_request_without_token_returns_401_response()
|
||||
{
|
||||
$response = $this->get('/api/post');
|
||||
$response->assertStatus(401);
|
||||
|
@ -31,7 +35,7 @@ class MicropubControllerTest extends TestCase
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_micropub_request_without_valid_token_returns_400_response()
|
||||
public function test_micropub_get_request_without_valid_token_returns_400_response()
|
||||
{
|
||||
$response = $this->call('GET', '/api/post', [], [], [], ['HTTP_Authorization' => 'Bearer abc123']);
|
||||
$response->assertStatus(400);
|
||||
|
@ -44,7 +48,7 @@ class MicropubControllerTest extends TestCase
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_micropub_request_with_valid_token_returns_200_response()
|
||||
public function test_micropub_get_request_with_valid_token_returns_200_response()
|
||||
{
|
||||
$response = $this->call('GET', '/api/post', [], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
|
||||
$response->assertStatus(200);
|
||||
|
@ -56,7 +60,7 @@ class MicropubControllerTest extends TestCase
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_micropub_request_for_syndication_targets()
|
||||
public function test_micropub_get_request_for_syndication_targets()
|
||||
{
|
||||
$response = $this->call('GET', '/api/post', ['q' => 'syndicate-to'], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
|
||||
$response->assertJsonFragment(['uid' => 'https://twitter.com/jonnybarnes']);
|
||||
|
@ -67,7 +71,7 @@ class MicropubControllerTest extends TestCase
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_micropub_request_for_nearby_places()
|
||||
public function test_micropub_get_request_for_nearby_places()
|
||||
{
|
||||
$response = $this->call('GET', '/api/post', ['q' => 'geo:53.5,-2.38'], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
|
||||
$response->assertJson(['places' => [['slug' =>'the-bridgewater-pub']]]);
|
||||
|
@ -78,7 +82,7 @@ class MicropubControllerTest extends TestCase
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_micropub_request_for_nearby_places_with_uncertainty_parameter()
|
||||
public function test_micropub_get_request_for_nearby_places_with_uncertainty_parameter()
|
||||
{
|
||||
$response = $this->call('GET', '/api/post', ['q' => 'geo:53.5,-2.38;u=35'], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
|
||||
$response->assertJson(['places' => [['slug' => 'the-bridgewater-pub']]]);
|
||||
|
@ -89,7 +93,7 @@ class MicropubControllerTest extends TestCase
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_micropub_request_for_nearby_places_where_non_exist()
|
||||
public function test_micropub_get_request_for_nearby_places_where_non_exist()
|
||||
{
|
||||
$response = $this->call('GET', '/api/post', ['q' => 'geo:1.23,4.56'], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
|
||||
$response->assertJson(['places' => []]);
|
||||
|
@ -100,7 +104,7 @@ class MicropubControllerTest extends TestCase
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_micropub_request_for_config()
|
||||
public function test_micropub_get_request_for_config()
|
||||
{
|
||||
$response = $this->call('GET', '/api/post', ['q' => 'config'], [], [], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()]);
|
||||
$response->assertJsonFragment(['uid' => 'https://twitter.com/jonnybarnes']);
|
||||
|
@ -111,7 +115,7 @@ class MicropubControllerTest extends TestCase
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_micropub_request_creates_new_note()
|
||||
public function test_micropub_post_request_creates_new_note()
|
||||
{
|
||||
$faker = \Faker\Factory::create();
|
||||
$note = $faker->text;
|
||||
|
@ -135,7 +139,7 @@ class MicropubControllerTest extends TestCase
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_micropub_request_creates_new_place()
|
||||
public function test_micropub_post_request_creates_new_place()
|
||||
{
|
||||
$response = $this->call(
|
||||
'POST',
|
||||
|
@ -153,12 +157,37 @@ class MicropubControllerTest extends TestCase
|
|||
$this->assertDatabaseHas('places', ['slug' => 'the-barton-arms']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test a valid micropub requests creates a new place with latitude
|
||||
* and longitude values defined separately.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_micropub_post_request_creates_new_place_with_latlng()
|
||||
{
|
||||
$response = $this->call(
|
||||
'POST',
|
||||
'/api/post',
|
||||
[
|
||||
'h' => 'card',
|
||||
'name' => 'The Barton Arms',
|
||||
'latitude' => '53.4974',
|
||||
'longitude' => '-2.3768',
|
||||
],
|
||||
[],
|
||||
[],
|
||||
['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
|
||||
);
|
||||
$response->assertJson(['response' => 'created']);
|
||||
$this->assertDatabaseHas('places', ['slug' => 'the-barton-arms']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test a valid micropub requests using JSON syntax creates a new note.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_micropub_request_with_json_syntax_creates_new_note()
|
||||
public function test_micropub_post_request_with_json_syntax_creates_new_note()
|
||||
{
|
||||
$faker = \Faker\Factory::create();
|
||||
$note = $faker->text;
|
||||
|
@ -184,7 +213,7 @@ class MicropubControllerTest extends TestCase
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_micropub_request_with_json_syntax_without_token_returns_error()
|
||||
public function test_micropub_post_request_with_json_syntax_without_token_returns_error()
|
||||
{
|
||||
$faker = \Faker\Factory::create();
|
||||
$note = $faker->text;
|
||||
|
@ -212,7 +241,7 @@ class MicropubControllerTest extends TestCase
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_micropub_request_with_json_syntax_with_invalid_token_returns_error()
|
||||
public function test_micropub_post_request_with_json_syntax_with_invalid_token_returns_error()
|
||||
{
|
||||
$faker = \Faker\Factory::create();
|
||||
$note = $faker->text;
|
||||
|
@ -235,7 +264,7 @@ class MicropubControllerTest extends TestCase
|
|||
->assertStatus(401);
|
||||
}
|
||||
|
||||
public function test_micropub_request_with_json_syntax_creates_new_place()
|
||||
public function test_micropub_post_request_with_json_syntax_creates_new_place()
|
||||
{
|
||||
$faker = \Faker\Factory::create();
|
||||
$response = $this->json(
|
||||
|
@ -255,7 +284,7 @@ class MicropubControllerTest extends TestCase
|
|||
->assertStatus(201);
|
||||
}
|
||||
|
||||
public function test_micropub_request_with_json_syntax_and_uncertainty_parameter_creates_new_place()
|
||||
public function test_micropub_post_request_with_json_syntax_and_uncertainty_parameter_creates_new_place()
|
||||
{
|
||||
$faker = \Faker\Factory::create();
|
||||
$response = $this->json(
|
||||
|
@ -275,7 +304,7 @@ class MicropubControllerTest extends TestCase
|
|||
->assertStatus(201);
|
||||
}
|
||||
|
||||
public function test_micropub_request_with_json_syntax_update_replace_post()
|
||||
public function test_micropub_post_request_with_json_syntax_update_replace_post()
|
||||
{
|
||||
$response = $this->json(
|
||||
'POST',
|
||||
|
@ -294,7 +323,7 @@ class MicropubControllerTest extends TestCase
|
|||
->assertStatus(200);
|
||||
}
|
||||
|
||||
public function test_micropub_request_with_json_syntax_update_add_post()
|
||||
public function test_micropub_post_request_with_json_syntax_update_add_post()
|
||||
{
|
||||
$response = $this->json(
|
||||
'POST',
|
||||
|
@ -315,4 +344,54 @@ class MicropubControllerTest extends TestCase
|
|||
'swarm_url' => 'https://www.swarmapp.com/checkin/123'
|
||||
]);
|
||||
}
|
||||
|
||||
public function test_media_endpoint_request_with_invalid_token_return_400_response()
|
||||
{
|
||||
$response = $this->call(
|
||||
'POST',
|
||||
'/api/media',
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
['HTTP_Authorization' => 'Bearer abc123']
|
||||
);
|
||||
$response->assertStatus(400);
|
||||
$response->assertJsonFragment(['error_description' => 'The provided token did not pass validation']);
|
||||
}
|
||||
|
||||
public function test_media_endpoint_request_with_insufficient_token_scopes_returns_401_response()
|
||||
{
|
||||
$response = $this->call(
|
||||
'POST',
|
||||
'/api/media',
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
['HTTP_Authorization' => 'Bearer ' . $this->getInvalidToken()]
|
||||
);
|
||||
$response->assertStatus(401);
|
||||
$response->assertJsonFragment(['error_description' => 'The token’s scope does not have the necessary requirements.']);
|
||||
}
|
||||
|
||||
public function test_media_endpoint_upload_a_file()
|
||||
{
|
||||
Queue::fake();
|
||||
Storage::fake('local');
|
||||
|
||||
$response = $this->call(
|
||||
'POST',
|
||||
'/api/media',
|
||||
[],
|
||||
[],
|
||||
[
|
||||
'file' => UploadedFile::fake()->image('scrot.png', 1920, 1080)->size(250),
|
||||
],
|
||||
['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
|
||||
);
|
||||
|
||||
$path = parse_url($response->getData()->location, PHP_URL_PATH);
|
||||
$filename = substr($path, 7);
|
||||
Queue::assertPushed(ProcessMedia::class);
|
||||
Storage::disk('local')->assertExists($filename);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,58 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use Tests\TestCase;
|
||||
use App\Services\NoteService;
|
||||
use App\Jobs\SyndicateNoteToTwitter;
|
||||
use App\Jobs\SyndicateNoteToFacebook;
|
||||
use Illuminate\Support\Facades\Queue;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class NoteServiceTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_syndicate_to_twitter_job_is_sent()
|
||||
{
|
||||
Queue::fake();
|
||||
|
||||
$noteService = new NoteService();
|
||||
$note = $noteService->createNote([
|
||||
'content' => 'Hello Fred',
|
||||
'in-reply-to' => 'https://fredbloggs.com/note/abc',
|
||||
'syndicate' => ['twitter'],
|
||||
]);
|
||||
|
||||
Queue::assertPushed(SyndicateNoteToTwitter::class);
|
||||
}
|
||||
|
||||
public function test_syndicate_to_facebook_job_is_sent()
|
||||
{
|
||||
Queue::fake();
|
||||
|
||||
$noteService = new NoteService();
|
||||
$note = $noteService->createNote([
|
||||
'content' => 'Hello Fred',
|
||||
'in-reply-to' => 'https://fredbloggs.com/note/abc',
|
||||
'syndicate' => ['facebook'],
|
||||
]);
|
||||
|
||||
Queue::assertPushed(SyndicateNoteToFacebook::class);
|
||||
}
|
||||
|
||||
public function test_syndicate_to_target_jobs_are_sent()
|
||||
{
|
||||
Queue::fake();
|
||||
|
||||
$noteService = new NoteService();
|
||||
$note = $noteService->createNote([
|
||||
'content' => 'Hello Fred',
|
||||
'in-reply-to' => 'https://fredbloggs.com/note/abc',
|
||||
'syndicate' => ['twitter', 'facebook'],
|
||||
]);
|
||||
|
||||
Queue::assertPushed(SyndicateNoteToTwitter::class);
|
||||
Queue::assertPushed(SyndicateNoteToFacebook::class);
|
||||
}
|
||||
}
|
79
tests/Feature/NotesAdminTest.php
Normal file
79
tests/Feature/NotesAdminTest.php
Normal file
|
@ -0,0 +1,79 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use Tests\TestCase;
|
||||
use App\Jobs\SendWebMentions;
|
||||
use Illuminate\Support\Facades\Queue;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class NotesAdminTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_index_page()
|
||||
{
|
||||
$response = $this->withSession([
|
||||
'loggedin' => true,
|
||||
])->get('/admin/notes');
|
||||
$response->assertViewIs('admin.notes.index');
|
||||
}
|
||||
|
||||
public function test_create_page()
|
||||
{
|
||||
$response = $this->withSession([
|
||||
'loggedin' => true,
|
||||
])->get('/admin/notes/create');
|
||||
$response->assertViewIs('admin.notes.create');
|
||||
}
|
||||
|
||||
public function test_create_a_new_note()
|
||||
{
|
||||
$this->withSession([
|
||||
'loggedin' => true,
|
||||
])->post('/admin/notes', [
|
||||
'content' => 'A new test note',
|
||||
]);
|
||||
$this->assertDatabaseHas('notes', [
|
||||
'note' => 'A new test note',
|
||||
]);
|
||||
}
|
||||
|
||||
public function test_edit_page()
|
||||
{
|
||||
$response = $this->withSession([
|
||||
'loggedin' => true,
|
||||
])->get('/admin/notes/1/edit');
|
||||
$response->assertViewIs('admin.notes.edit');
|
||||
}
|
||||
|
||||
public function test_edit_a_note()
|
||||
{
|
||||
Queue::fake();
|
||||
|
||||
$this->withSession([
|
||||
'loggedin' => true,
|
||||
])->post('/admin/notes/1', [
|
||||
'_method' => 'PUT',
|
||||
'content' => 'An edited note',
|
||||
'webmentions' => true,
|
||||
]);
|
||||
|
||||
$this->assertDatabaseHas('notes', [
|
||||
'note' => 'An edited note',
|
||||
]);
|
||||
Queue::assertPushed(SendWebMentions::class);
|
||||
}
|
||||
|
||||
public function test_delete_note()
|
||||
{
|
||||
$this->withSession([
|
||||
'loggedin' => true,
|
||||
])->post('/admin/notes/1', [
|
||||
'_method' => 'DELETE',
|
||||
]);
|
||||
$this->assertSoftDeleted('notes', [
|
||||
'id' => '1',
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -30,6 +30,12 @@ class NotesControllerTest extends TestCase
|
|||
$response->assertViewHas('note');
|
||||
}
|
||||
|
||||
public function test_note_replying_to_tweet()
|
||||
{
|
||||
$response = $this->get('/notes/B');
|
||||
$response->assertViewHas('note');
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that `/note/{decID}` redirects to `/notes/{nb60id}`.
|
||||
*
|
||||
|
|
57
tests/Feature/ParseCachedWebMentionsTest.php
Normal file
57
tests/Feature/ParseCachedWebMentionsTest.php
Normal file
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\WebMention;
|
||||
use Tests\TestCase;
|
||||
use Illuminate\Support\Facades\Artisan;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class ParseCachedWebMentionsTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
mkdir(storage_path('HTML') . '/https/aaronpk.localhost/reply', 0777, true);
|
||||
mkdir(storage_path('HTML') . '/http/tantek.com', 0777, true);
|
||||
copy(__DIR__.'/../aaron.html', storage_path('HTML') . '/https/aaronpk.localhost/reply/1');
|
||||
copy(__DIR__.'/../tantek.html', storage_path('HTML') . '/http/tantek.com/index.html');
|
||||
}
|
||||
|
||||
public function test_parsing_html()
|
||||
{
|
||||
$this->assertFileExists(storage_path('HTML') . '/https/aaronpk.localhost/reply/1');
|
||||
$this->assertFileExists(storage_path('HTML') . '/http/tantek.com/index.html');
|
||||
$htmlAaron = file_get_contents(storage_path('HTML') . '/https/aaronpk.localhost/reply/1');
|
||||
$htmlAaron = str_replace('href="/notes', 'href="' . config('app.url') . '/notes', $htmlAaron);
|
||||
$htmlAaron = str_replace('datetime=""', 'dateime="' . carbon()->now()->toIso8601String() . '"', $htmlAaron);
|
||||
file_put_contents(storage_path('HTML') . '/https/aaronpk.localhost/reply/1', $htmlAaron);
|
||||
$htmlTantek = file_get_contents(storage_path('HTML') . '/http/tantek.com/index.html');
|
||||
$htmlTantek = str_replace('href="/notes', 'href="' . config('app.url') . '/notes', $htmlTantek);
|
||||
$htmlTantek = str_replace('datetime=""', 'dateime="' . carbon()->now()->toIso8601String() . '"', $htmlTantek);
|
||||
file_put_contents(storage_path('HTML') . '/http/tantek.com/index.html', $htmlTantek);
|
||||
|
||||
Artisan::call('webmentions:parsecached');
|
||||
|
||||
$webmentionAaron = WebMention::find(1);
|
||||
$webmentionTantek = WebMention::find(2);
|
||||
$this->assertTrue($webmentionAaron->updated_at->gt($webmentionAaron->created_at));
|
||||
$this->assertTrue($webmentionTantek->updated_at->gt($webmentionTantek->created_at));
|
||||
}
|
||||
|
||||
public function tearDown()
|
||||
{
|
||||
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');
|
||||
unlink(storage_path('HTML') . '/http/tantek.com/index.html');
|
||||
rmdir(storage_path('HTML') . '/http/tantek.com');
|
||||
rmdir(storage_path('HTML') . '/http');
|
||||
|
||||
parent::tearDown();
|
||||
}
|
||||
}
|
67
tests/Feature/PlacesAdminTest.php
Normal file
67
tests/Feature/PlacesAdminTest.php
Normal file
|
@ -0,0 +1,67 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use Tests\TestCase;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
|
||||
class PlacesAdminTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
public function test_index_page()
|
||||
{
|
||||
$response = $this->withSession([
|
||||
'loggedin' => true,
|
||||
])->get('/admin/places');
|
||||
$response->assertViewIs('admin.places.index');
|
||||
}
|
||||
|
||||
public function test_create_page()
|
||||
{
|
||||
$response = $this->withSession([
|
||||
'loggedin' => true,
|
||||
])->get('/admin/places/create');
|
||||
$response->assertViewIs('admin.places.create');
|
||||
}
|
||||
|
||||
public function test_create_new_place()
|
||||
{
|
||||
$this->withSession([
|
||||
'loggedin' => true,
|
||||
])->post('/admin/places', [
|
||||
'name' => 'Test Place',
|
||||
'description' => 'A dummy place for feature tests',
|
||||
'latitude' => '1.23',
|
||||
'longitude' => '4.56',
|
||||
]);
|
||||
$this->assertDatabaseHas('places', [
|
||||
'name' => 'Test Place',
|
||||
'description' => 'A dummy place for feature tests',
|
||||
]);
|
||||
}
|
||||
|
||||
public function test_edit_page()
|
||||
{
|
||||
$response = $this->withSession([
|
||||
'loggedin' => true,
|
||||
])->get('/admin/places/1/edit');
|
||||
$response->assertViewIs('admin.places.edit');
|
||||
}
|
||||
|
||||
public function test_updating_a_place()
|
||||
{
|
||||
$this->withSession([
|
||||
'loggedin' => true,
|
||||
])->post('/admin/places/1', [
|
||||
'_method' => 'PUT',
|
||||
'name' => 'The Bridgewater',
|
||||
'description' => 'Who uses “Pub” anyway',
|
||||
'latitude' => '53.4983',
|
||||
'longitude' => '-2.3805',
|
||||
]);
|
||||
$this->assertDatabaseHas('places', [
|
||||
'name' => 'The Bridgewater',
|
||||
]);
|
||||
}
|
||||
}
|
20
tests/Feature/ReDownloadWebMentionsTest.php
Normal file
20
tests/Feature/ReDownloadWebMentionsTest.php
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use Tests\TestCase;
|
||||
use App\Jobs\DownloadWebMention;
|
||||
use Illuminate\Support\Facades\Queue;
|
||||
use Illuminate\Support\Facades\Artisan;
|
||||
|
||||
class ReDownloadWebMentionsTest extends TestCase
|
||||
{
|
||||
public function test_jobs_are_dispatched()
|
||||
{
|
||||
Queue::fake();
|
||||
|
||||
Artisan::call('webmentions:redownload');
|
||||
|
||||
Queue::assertPushed(DownloadWebMention::class);
|
||||
}
|
||||
}
|
15
tests/Feature/SearchControllerTest.php
Normal file
15
tests/Feature/SearchControllerTest.php
Normal file
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use Tests\TestCase;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
|
||||
class SearchControllerTest extends TestCase
|
||||
{
|
||||
public function test_search()
|
||||
{
|
||||
$response = $this->get('/search?terms=wedding');
|
||||
$response->assertSee('#weddingfavour');
|
||||
}
|
||||
}
|
15
tests/Feature/SessionStoreControllerTest.php
Normal file
15
tests/Feature/SessionStoreControllerTest.php
Normal file
|
@ -0,0 +1,15 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use Tests\TestCase;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
|
||||
class SessionStoreControllerTest extends TestCase
|
||||
{
|
||||
public function test_colour_preference_saved()
|
||||
{
|
||||
$response = $this->post('update-colour-scheme', ['css' => 'some.css']);
|
||||
$response->assertJson(['status' => 'ok']);
|
||||
}
|
||||
}
|
39
tests/Feature/ShortURLsControllerTest.php
Normal file
39
tests/Feature/ShortURLsControllerTest.php
Normal file
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use Tests\TestCase;
|
||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||
|
||||
class ShortURLsControllerTest extends TestCase
|
||||
{
|
||||
public function test_short_domain_redirects_to_long_domain()
|
||||
{
|
||||
$response = $this->get('http://' . config('app.shorturl'));
|
||||
$response->assertRedirect(config('app.url'));
|
||||
}
|
||||
|
||||
public function test_short_domain_slashat_redirects_to_twitter()
|
||||
{
|
||||
$response = $this->get('http://' . config('app.shorturl') . '/@');
|
||||
$response->assertRedirect('https://twitter.com/jonnybarnes');
|
||||
}
|
||||
|
||||
public function test_short_domain_slashplus_redirects_to_googleplus()
|
||||
{
|
||||
$response = $this->get('http://' . config('app.shorturl') . '/+');
|
||||
$response->assertRedirect('https://plus.google.com/u/0/117317270900655269082/about');
|
||||
}
|
||||
|
||||
public function test_short_domain_slasht_redirects_to_long_domain_slash_notes()
|
||||
{
|
||||
$response = $this->get('http://' . config('app.shorturl') . '/t/E');
|
||||
$response->assertRedirect(config('app.url') . '/notes/E');
|
||||
}
|
||||
|
||||
public function test_short_domain_slashb_redirects_to_long_domain_slash_blog()
|
||||
{
|
||||
$response = $this->get('http://' . config('app.shorturl') . '/b/1');
|
||||
$response->assertRedirect(config('app.url') . '/blog/s/1');
|
||||
}
|
||||
}
|
|
@ -12,7 +12,7 @@ class SwarmTest extends TestCase
|
|||
{
|
||||
use DatabaseTransactions, TestToken;
|
||||
|
||||
public function test_faked_ownyourswarm_request()
|
||||
public function test_faked_ownyourswarm_request_with_foursquare()
|
||||
{
|
||||
$response = $this->json(
|
||||
'POST',
|
||||
|
@ -42,11 +42,81 @@ class SwarmTest extends TestCase
|
|||
$response
|
||||
->assertStatus(201)
|
||||
->assertJson(['response' => 'created']);
|
||||
$this->assertDatabaseHas('notes', [
|
||||
'swarm_url' => 'https://www.swarmapp.com/checkin/abc'
|
||||
]);
|
||||
$this->assertDatabaseHas('places', [
|
||||
'external_urls' => '{"foursquare": "https://foursquare.com/v/123456"}'
|
||||
]);
|
||||
$this->assertDatabaseHas('notes', [
|
||||
'swarm_url' => 'https://www.swarmapp.com/checkin/abc'
|
||||
}
|
||||
|
||||
// this request would actually come from another client than OwnYourSwarm
|
||||
public function test_faked_ownyourswarm_request_with_osm()
|
||||
{
|
||||
$response = $this->json(
|
||||
'POST',
|
||||
'api/post',
|
||||
[
|
||||
'type' => ['h-entry'],
|
||||
'properties' => [
|
||||
'published' => [\Carbon\Carbon::now()->toDateTimeString()],
|
||||
'content' => [[
|
||||
'value' => 'My first #checkin using Example Product',
|
||||
'html' => 'My first #checkin using <a href="http://example.org">Example Product</a>',
|
||||
]],
|
||||
'checkin' => [[
|
||||
'type' => ['h-card'],
|
||||
'properties' => [
|
||||
'name' => ['Awesome Venue'],
|
||||
'url' => ['https://www.openstreetmap.org/way/123456'],
|
||||
'latitude' => ['1.23'],
|
||||
'longitude' => ['4.56'],
|
||||
],
|
||||
]],
|
||||
],
|
||||
],
|
||||
['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
|
||||
);
|
||||
$response
|
||||
->assertStatus(201)
|
||||
->assertJson(['response' => 'created']);
|
||||
$this->assertDatabaseHas('places', [
|
||||
'external_urls' => '{"osm": "https://www.openstreetmap.org/way/123456"}'
|
||||
]);
|
||||
}
|
||||
|
||||
// this request would actually come from another client than OwnYourSwarm
|
||||
public function test_faked_ownyourswarm_request_without_known_external_url()
|
||||
{
|
||||
$response = $this->json(
|
||||
'POST',
|
||||
'api/post',
|
||||
[
|
||||
'type' => ['h-entry'],
|
||||
'properties' => [
|
||||
'published' => [\Carbon\Carbon::now()->toDateTimeString()],
|
||||
'content' => [[
|
||||
'value' => 'My first #checkin using Example Product',
|
||||
'html' => 'My first #checkin using <a href="http://example.org">Example Product</a>',
|
||||
]],
|
||||
'checkin' => [[
|
||||
'type' => ['h-card'],
|
||||
'properties' => [
|
||||
'name' => ['Awesome Venue'],
|
||||
'url' => ['https://www.example.org/way/123456'],
|
||||
'latitude' => ['1.23'],
|
||||
'longitude' => ['4.56'],
|
||||
],
|
||||
]],
|
||||
],
|
||||
],
|
||||
['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
|
||||
);
|
||||
$response
|
||||
->assertStatus(201)
|
||||
->assertJson(['response' => 'created']);
|
||||
$this->assertDatabaseHas('places', [
|
||||
'external_urls' => '{"default": "https://www.example.org/way/123456"}'
|
||||
]);
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,9 @@
|
|||
namespace Tests\Feature;
|
||||
|
||||
use Tests\TestCase;
|
||||
use Lcobucci\JWT\Builder;
|
||||
use App\Services\TokenService;
|
||||
use Lcobucci\JWT\Signer\Hmac\Sha256;
|
||||
|
||||
class TokenServiceTest extends TestCase
|
||||
{
|
||||
|
@ -30,4 +32,29 @@ class TokenServiceTest extends TestCase
|
|||
];
|
||||
$this->assertSame($data, $validData);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException App\Exceptions\InvalidTokenException
|
||||
* @expectedExceptionMessage Token failed validation
|
||||
*/
|
||||
public function test_token_with_different_singing_key_throws_exception()
|
||||
{
|
||||
$data = [
|
||||
'me' => 'https://example.org',
|
||||
'client_id' => 'https://quill.p3k.io',
|
||||
'scope' => 'post'
|
||||
];
|
||||
$signer = new Sha256();
|
||||
$token = (new Builder())->set('me', $data['me'])
|
||||
->set('client_id', $data['client_id'])
|
||||
->set('scope', $data['scope'])
|
||||
->set('date_issued', time())
|
||||
->set('nonce', bin2hex(random_bytes(8)))
|
||||
->sign($signer, 'r4ndomk3y')
|
||||
->getToken();
|
||||
|
||||
$service = new TokenService();
|
||||
$token = $service->validateToken($token);
|
||||
dump($token);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,6 +8,12 @@ use Illuminate\Support\Facades\Queue;
|
|||
|
||||
class WebMentionsControllerTest extends TestCase
|
||||
{
|
||||
public function test_get_endpoint()
|
||||
{
|
||||
$response = $this->get('/webmention');
|
||||
$response->assertViewIs('webmention-endpoint');
|
||||
}
|
||||
|
||||
/**
|
||||
* Test webmentions without source and target are rejected.
|
||||
*
|
||||
|
|
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,
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -1,18 +1,20 @@
|
|||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
namespace Tests\Unit;
|
||||
|
||||
use Storage;
|
||||
use Tests\TestCase;
|
||||
use App\Jobs\ProcessMedia;
|
||||
use Intervention\Image\ImageManager;
|
||||
|
||||
class ProcessImageTest extends TestCase
|
||||
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 \App\Jobs\ProcessImage('file.txt');
|
||||
$job = new ProcessMedia('file.txt');
|
||||
$job->handle($manager);
|
||||
|
||||
$this->assertFalse(file_exists(storage_path('app') . '/file.txt'));
|
||||
|
@ -20,9 +22,10 @@ class ProcessImageTest extends TestCase
|
|||
|
||||
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 \App\Jobs\ProcessImage('aaron.png');
|
||||
$job = new ProcessMedia('aaron.png');
|
||||
$job->handle($manager);
|
||||
|
||||
$this->assertFalse(file_exists(storage_path('app') . '/aaron.png'));
|
||||
|
@ -33,7 +36,7 @@ class ProcessImageTest extends TestCase
|
|||
$manager = app()->make(ImageManager::class);
|
||||
Storage::disk('local')->put('test-image.jpg', file_get_contents(__DIR__.'/../test-image.jpg'));
|
||||
Storage::fake('s3');
|
||||
$job = new \App\Jobs\ProcessImage('test-image.jpg');
|
||||
$job = new ProcessMedia('test-image.jpg');
|
||||
$job->handle($manager);
|
||||
|
||||
Storage::disk('s3')->assertExists('media/test-image-small.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);
|
||||
}
|
||||
}
|
||||
|
|
11
tests/aaron.html
Normal file
11
tests/aaron.html
Normal file
|
@ -0,0 +1,11 @@
|
|||
<div class="h-entry">
|
||||
<a class="u-in-reply-to" href="https://aaronpk.loclahost/reply/1"></a>
|
||||
<a class="u-in-reply-to" href="/notes/E"></a>
|
||||
<div class=e-content p-name">Hi too</div>
|
||||
<a class="u-url" href="https://aaronpk.localhost/reply/1"></a>
|
||||
<time class="dt-published" datetime=""></time>
|
||||
</div>
|
||||
<p>Posted by:</p>
|
||||
<div class="h-card">
|
||||
<a class="u-url" href="https://aaronpk.localhost"><span class="p-name">Aaron Parecki</span></a> <img class="u-photo" src="https://aaronparecki.com/images/profile.jpg">
|
||||
</div>
|
BIN
tests/f1bc8faa-1a8f-45b8-a9b1-57282fa73f87.jpg
Normal file
BIN
tests/f1bc8faa-1a8f-45b8-a9b1-57282fa73f87.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.5 MiB |
10
tests/tantek.html
Normal file
10
tests/tantek.html
Normal file
|
@ -0,0 +1,10 @@
|
|||
<div class="h-entry">
|
||||
<a class="u-in-reply-to" href="/notes/D"></a>
|
||||
<div class=e-content p-name">Hi too</div>
|
||||
<a class="u-url" href="http://tantek.com/"></a>
|
||||
<time class="dt-published" datetime=""></time>
|
||||
</div>
|
||||
<p>Posted by:</p>
|
||||
<div class="h-card">
|
||||
<a class="u-url" href="http://tantek.com"><span class="p-name">Tantek Celik</span></a>
|
||||
</div>
|
Loading…
Add table
Add a link
Reference in a new issue