diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index a4be5c58..81e6fd40 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -4,6 +4,9 @@ namespace App\Http\Middleware; use Illuminate\Auth\Middleware\Authenticate as Middleware; +/** + * @codeCoverageIgnore + */ class Authenticate extends Middleware { /** diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index 362b48b0..4e0fd5c4 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -7,6 +7,9 @@ use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +/** + * @codeCoverageIgnore + */ class RedirectIfAuthenticated { /** diff --git a/app/Http/Middleware/TrustHosts.php b/app/Http/Middleware/TrustHosts.php index b0550cfc..79426404 100644 --- a/app/Http/Middleware/TrustHosts.php +++ b/app/Http/Middleware/TrustHosts.php @@ -4,6 +4,9 @@ namespace App\Http\Middleware; use Illuminate\Http\Middleware\TrustHosts as Middleware; +/** + * @codeCoverageIgnore + */ class TrustHosts extends Middleware { /** diff --git a/app/Jobs/ProcessLike.php b/app/Jobs/ProcessLike.php index 976ad010..1975fef7 100644 --- a/app/Jobs/ProcessLike.php +++ b/app/Jobs/ProcessLike.php @@ -60,7 +60,7 @@ class ProcessLike implements ShouldQueue //POSSE like try { - $response = $client->request( + $client->request( 'POST', 'https://brid.gy/publish/webmention', [ @@ -70,8 +70,8 @@ class ProcessLike implements ShouldQueue ], ] ); - } catch (RequestException $exception) { - //no biggie + } catch (RequestException) { + return 0; } return 0; diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 73269ee7..1de324c9 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -38,6 +38,8 @@ class AppServiceProvider extends ServiceProvider }); // Bind the Codebird client + // Codebird gets mocked in tests + // @codeCoverageIgnoreStart $this->app->bind('Codebird\Codebird', function () { Codebird::setConsumerKey( env('TWITTER_CONSUMER_KEY'), @@ -53,6 +55,7 @@ class AppServiceProvider extends ServiceProvider return $cb; }); + // @codeCoverageIgnoreEnd /** * Paginate a standard Laravel Collection. diff --git a/app/Providers/HorizonServiceProvider.php b/app/Providers/HorizonServiceProvider.php index 0db3c49c..89a3c7b4 100644 --- a/app/Providers/HorizonServiceProvider.php +++ b/app/Providers/HorizonServiceProvider.php @@ -34,9 +34,7 @@ class HorizonServiceProvider extends HorizonApplicationServiceProvider protected function gate() { Gate::define('viewHorizon', function ($user) { - return in_array($user->name, [ - 'jonny', - ]); + return $user->name === 'jonny'; }); } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 1eb1b5af..3f8af660 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -44,6 +44,8 @@ class RouteServiceProvider extends ServiceProvider * Configure the rate limiters for the application. * * @return void + * + * @codeCoverageIgnore */ protected function configureRateLimiting() { diff --git a/app/Services/BookmarkService.php b/app/Services/BookmarkService.php index 871bf078..ccbeaf43 100644 --- a/app/Services/BookmarkService.php +++ b/app/Services/BookmarkService.php @@ -79,11 +79,12 @@ class BookmarkService } /** - * Given a URL, use browsershot to save an image of the page. + * Given a URL, use `browsershot` to save an image of the page. * * @param string $url * @return string The uuid for the screenshot * @throws CouldNotTakeBrowsershot + * @codeCoverageIgnore */ public function saveScreenshot(string $url): string { diff --git a/database/factories/WebMentionFactory.php b/database/factories/WebMentionFactory.php index bb26f0da..b9a97fef 100644 --- a/database/factories/WebMentionFactory.php +++ b/database/factories/WebMentionFactory.php @@ -24,7 +24,7 @@ class WebMentionFactory extends Factory return [ 'source' => $this->faker->url, 'target' => url('notes/1'), - 'type' => 'reply', + 'type' => 'in-reply-to', 'content' => $this->faker->paragraph, ]; } diff --git a/tests/Feature/ActivityStreamTest.php b/tests/Feature/ActivityStreamTest.php index 3453f220..5e618992 100644 --- a/tests/Feature/ActivityStreamTest.php +++ b/tests/Feature/ActivityStreamTest.php @@ -25,6 +25,19 @@ class ActivityStreamTest extends TestCase ]); } + /** @test */ + public function notesPageContainsAuthorActivityStreamData(): void + { + $response = $this->get('/notes', ['Accept' => 'application/activity+json']); + $response->assertHeader('Content-Type', 'application/activity+json'); + $response->assertJson([ + '@context' => 'https://www.w3.org/ns/activitystreams', + 'id' => config('app.url'), + 'type' => 'Person', + 'name' => config('user.displayname'), + ]); + } + /** @test */ public function requestForNoteIncludesActivityStreamData(): void { diff --git a/tests/Feature/Admin/AdminTest.php b/tests/Feature/Admin/AdminTest.php index 4ae91055..2d3f8f70 100644 --- a/tests/Feature/Admin/AdminTest.php +++ b/tests/Feature/Admin/AdminTest.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Tests\Feature\Admin; +use App\Models\User; use Tests\TestCase; class AdminTest extends TestCase @@ -31,4 +32,51 @@ class AdminTest extends TestCase ]); $response->assertRedirect('/login'); } + + /** @test */ + public function loginSucceeds(): void + { + User::factory([ + 'name' => 'admin', + 'password' => bcrypt('password'), + ])->create(); + + $response = $this->post('/login', [ + 'name' => 'admin', + 'password' => 'password', + ]); + + $response->assertRedirect('/'); + } + + /** @test */ + public function whenLoggedInRedirectsToAdminPage(): void + { + $user = User::factory()->create(); + $response = $this->actingAs($user)->get('/login'); + $response->assertRedirect('/'); + } + + /** @test */ + public function loggedOutUsersSimplyRedirected(): void + { + $response = $this->get('/logout'); + $response->assertRedirect('/'); + } + + /** @test */ + public function loggedInUsersShownLogoutForm(): void + { + $user = User::factory()->create(); + $response = $this->actingAs($user)->get('/logout'); + $response->assertViewIs('logout'); + } + + /** @test */ + public function loggedInUsersCanLogout(): void + { + $user = User::factory()->create(); + $response = $this->actingAs($user)->post('/logout'); + $response->assertRedirect('/'); + } } diff --git a/tests/Feature/FrontPageTest.php b/tests/Feature/FrontPageTest.php new file mode 100644 index 00000000..6f24a851 --- /dev/null +++ b/tests/Feature/FrontPageTest.php @@ -0,0 +1,33 @@ +create(['note' => 'Note 1']); + Article::factory()->create(['title' => 'Article 1']); + Bookmark::factory()->create(['url' => 'https://example.com']); + Like::factory()->create([ + 'url' => 'https://example.org/1', + 'content' => 'Like 1', + ]); + + $this->get('/') + ->assertSee('Note 1') + ->assertSee('Article 1') + ->assertSee('https://example.com') + ->assertSee('Like 1'); + } +} diff --git a/tests/Feature/HorizonTest.php b/tests/Feature/HorizonTest.php new file mode 100644 index 00000000..fe264981 --- /dev/null +++ b/tests/Feature/HorizonTest.php @@ -0,0 +1,28 @@ +create([ + 'name' => 'jonny', + ]); + + $response = $this->actingAs($user)->get('/horizon'); + + $response->assertStatus(200); + } +} diff --git a/tests/Feature/LikesTest.php b/tests/Feature/LikesTest.php index 7e56f6b2..b521f957 100644 --- a/tests/Feature/LikesTest.php +++ b/tests/Feature/LikesTest.php @@ -233,6 +233,44 @@ class LikesTest extends TestCase $this->assertEquals('Jonny Barnes', Like::find($id)->author_name); } + /** @test */ + public function noErrorForFailureToPosseWithBridgy(): void + { + $like = new Like(); + $like->url = 'https://twitter.com/jonnybarnes/status/1050823255123251200'; + $like->save(); + $id = $like->id; + + $job = new ProcessLike($like); + + $mock = new MockHandler([ + new Response(404, [], 'Not found'), + ]); + $handler = HandlerStack::create($mock); + $client = new Client(['handler' => $handler]); + $this->app->bind(Client::class, function () use ($client) { + return $client; + }); + + $info = (object) [ + 'author_name' => 'Jonny Barnes', + 'author_url' => 'https://twitter.com/jonnybarnes', + 'html' => '
In reply to
+In reply to