jonnybarnes.uk/tests/Feature/SwarmTest.php
Jonny Barnes 126bb29ae2
Some checks failed
PHP Unit / PHPUnit test suite (pull_request) Has been cancelled
Laravel Pint / Laravel Pint (pull_request) Has been cancelled
Laravel Pint fixes
2025-04-06 17:25:06 +01:00

321 lines
11 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
namespace Tests\Feature;
use App\Jobs\SendWebMentions;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Queue;
use PHPUnit\Framework\Attributes\Test;
use Tests\TestCase;
use Tests\TestToken;
class SwarmTest extends TestCase
{
use RefreshDatabase;
use TestToken;
/**
* Given a check in to Foursquare, this is the content Ownyourswarm will post to us.
*/
#[Test]
public function mocked_ownyourswarm_request_with_foursquare(): void
{
Queue::fake();
$response = $this->json(
'POST',
'api/post',
[
'type' => ['h-entry'],
'properties' => [
'published' => [Carbon::now()->toDateTimeString()],
'syndication' => ['https://www.swarmapp.com/checkin/abc'],
'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://foursquare.com/v/123456'],
'latitude' => ['1.23'],
'longitude' => ['4.56'],
],
],
],
['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
);
$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"}',
]);
Queue::assertPushed(SendWebMentions::class);
}
/**
* This request would actually come from another client than OwnYourSwarm, but were testing
* OpenStreetMap data.
*/
#[Test]
public function mocked_ownyourswarm_request_with_osm(): void
{
Queue::fake();
$response = $this->json(
'POST',
'api/post',
[
'type' => ['h-entry'],
'properties' => [
'published' => [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"}',
]);
Queue::assertPushed(SendWebMentions::class);
}
/**
* This request would actually come from another client than OwnYourSwarm, as that would include a Foursquare URL
*/
#[Test]
public function mocked_ownyourswarm_request_without_known_external_url(): void
{
Queue::fake();
$response = $this->json(
'POST',
'api/post',
[
'type' => ['h-entry'],
'properties' => [
'published' => [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"}',
]);
Queue::assertPushed(SendWebMentions::class);
}
#[Test]
public function mocked_ownyourswarm_request_with_no_text_content(): void
{
$response = $this->json(
'POST',
'api/post',
[
'type' => ['h-entry'],
'properties' => [
'published' => [Carbon::now()->toDateTimeString()],
'syndication' => ['https://www.swarmapp.com/checkin/def'],
],
'checkin' => [
'type' => ['h-card'],
'properties' => [
'name' => ['Awesomer Venue'],
'url' => ['https://foursquare.com/v/654321'],
'latitude' => ['3.21'],
'longitude' => ['6.54'],
],
],
],
['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
);
$response
->assertStatus(201)
->assertJson(['response' => 'created']);
$this->assertDatabaseHas('places', [
'external_urls' => '{"foursquare": "https://foursquare.com/v/654321"}',
]);
$this->assertDatabaseHas('notes', [
'swarm_url' => 'https://www.swarmapp.com/checkin/def',
]);
// Check the default text content for the note was saved
$this->get($response->__get('headers')->get('location'))->assertSee('📍');
}
#[Test]
public function mocked_ownyourswarm_request_saves_just_the_post_when_an_error_occurs_in_the_checkin_data(): void
{
Queue::fake();
$response = $this->json(
'POST',
'api/post',
[
'type' => ['h-entry'],
'properties' => [
'published' => [Carbon::now()->toDateTimeString()],
'syndication' => ['https://www.swarmapp.com/checkin/abc'],
'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://foursquare.com/v/123456'],
],
],
],
['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
);
$response
->assertStatus(201)
->assertJson(['response' => 'created']);
$this->assertDatabaseMissing('places', [
'name' => 'Awesome Venue',
]);
Queue::assertPushed(SendWebMentions::class);
}
#[Test]
public function mocked_ownyourswarm_request_with_h_adr_location(): void
{
Queue::fake();
$response = $this->json(
'POST',
'api/post',
[
'type' => ['h-entry'],
'properties' => [
'published' => [Carbon::now()->toDateTimeString()],
'syndication' => ['https://www.swarmapp.com/checkin/abc'],
'content' => [[
'value' => 'My first #checkin using Example Product',
'html' => 'My first #checkin using <a href="http://example.org">Example Product</a>',
]],
],
'location' => [
'type' => ['h-adr'],
'properties' => [
'latitude' => ['1.23'],
'longitude' => ['4.56'],
'street-address' => ['Awesome Street'],
],
],
'checkin' => [
'type' => ['h-card'],
'properties' => [
'name' => ['Awesome Venue'],
'url' => ['https://foursquare.com/v/123456'],
],
],
],
['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
);
$response
->assertStatus(201)
->assertJson(['response' => 'created']);
$this->assertDatabaseMissing('places', [
'name' => 'Awesome Venue',
]);
Queue::assertPushed(SendWebMentions::class);
}
#[Test]
public function ownyourswarm_checkin_test_using_real_data(): void
{
$response = $this->json(
'POST',
'api/post',
[
'type' => ['h-entry'],
'properties' => [
'published' => [Carbon::now()->toDateTimeString()],
],
'syndication' => [
'https://www.swarmapp.com/user/199841/checkin/5c4b1ac56dcf04002c0a4f58',
],
'checkin' => [
'type' => ['h-card'],
'properties' => [
'name' => ['Forbidden Planet'],
'url' => ['https://foursquare.com/v/4ade0e46f964a520bf6f21e3'],
'latitude' => [53.483153021713],
'longitude' => [-2.2350297792539],
'street-address' => ['65 Oldham St.'],
'locality' => ['Manchester'],
'country-name' => ['United Kingdom'],
'postal-code' => ['M1 1JR'],
],
'value' => 'https://foursquare.com/v/4ade0e46f964a520bf6f21e3',
],
'location' => [
'type' => ['h-adr'],
'properties' => [
'latitude' => [53.483153021713],
'longitude' => [-2.2350297792539],
'street-address' => ['65 Oldham St.'],
'locality' => ['Manchester'],
'country-name' => ['United Kingdom'],
'postal-code' => ['M1 1JR'],
],
],
],
['HTTP_Authorization' => 'Bearer ' . $this->getToken()]
);
$this->assertDatabaseHas('places', [
'name' => 'Forbidden Planet',
]);
$response
->assertStatus(201)
->assertJson(['response' => 'created']);
}
}