| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Tests; | 
					
						
							| 
									
										
										
										
											2021-06-24 03:42:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | use BookStack\Entities\Models\Book; | 
					
						
							|  |  |  | use BookStack\Entities\Models\Bookshelf; | 
					
						
							|  |  |  | use BookStack\Entities\Models\Chapter; | 
					
						
							|  |  |  | use BookStack\Entities\Models\Page; | 
					
						
							| 
									
										
										
										
											2022-06-14 00:20:21 +08:00
										 |  |  | use BookStack\Entities\Repos\BaseRepo; | 
					
						
							| 
									
										
										
										
											2021-06-24 03:42:48 +08:00
										 |  |  | use BookStack\Entities\Repos\BookRepo; | 
					
						
							|  |  |  | use Illuminate\Support\Str; | 
					
						
							|  |  |  | use Tests\Uploads\UsesImages; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class OpenGraphTest extends TestCase | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     use UsesImages; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_page_tags() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = Page::query()->first(); | 
					
						
							|  |  |  |         $resp = $this->asEditor()->get($page->getUrl()); | 
					
						
							|  |  |  |         $tags = $this->getOpenGraphTags($resp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertEquals($page->getShortName() . ' | BookStack', $tags['title']); | 
					
						
							|  |  |  |         $this->assertEquals($page->getUrl(), $tags['url']); | 
					
						
							|  |  |  |         $this->assertEquals(Str::limit($page->text, 100, '...'), $tags['description']); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_chapter_tags() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $chapter = Chapter::query()->first(); | 
					
						
							|  |  |  |         $resp = $this->asEditor()->get($chapter->getUrl()); | 
					
						
							|  |  |  |         $tags = $this->getOpenGraphTags($resp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertEquals($chapter->getShortName() . ' | BookStack', $tags['title']); | 
					
						
							|  |  |  |         $this->assertEquals($chapter->getUrl(), $tags['url']); | 
					
						
							|  |  |  |         $this->assertEquals(Str::limit($chapter->description, 100, '...'), $tags['description']); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_book_tags() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $book = Book::query()->first(); | 
					
						
							|  |  |  |         $resp = $this->asEditor()->get($book->getUrl()); | 
					
						
							|  |  |  |         $tags = $this->getOpenGraphTags($resp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertEquals($book->getShortName() . ' | BookStack', $tags['title']); | 
					
						
							|  |  |  |         $this->assertEquals($book->getUrl(), $tags['url']); | 
					
						
							|  |  |  |         $this->assertEquals(Str::limit($book->description, 100, '...'), $tags['description']); | 
					
						
							|  |  |  |         $this->assertArrayNotHasKey('image', $tags); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Test image set if image has cover image
 | 
					
						
							|  |  |  |         $bookRepo = app(BookRepo::class); | 
					
						
							|  |  |  |         $bookRepo->updateCoverImage($book, $this->getTestImage('image.png')); | 
					
						
							|  |  |  |         $resp = $this->asEditor()->get($book->getUrl()); | 
					
						
							|  |  |  |         $tags = $this->getOpenGraphTags($resp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertEquals($book->getBookCover(), $tags['image']); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function test_shelf_tags() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $shelf = Bookshelf::query()->first(); | 
					
						
							|  |  |  |         $resp = $this->asEditor()->get($shelf->getUrl()); | 
					
						
							|  |  |  |         $tags = $this->getOpenGraphTags($resp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertEquals($shelf->getShortName() . ' | BookStack', $tags['title']); | 
					
						
							|  |  |  |         $this->assertEquals($shelf->getUrl(), $tags['url']); | 
					
						
							|  |  |  |         $this->assertEquals(Str::limit($shelf->description, 100, '...'), $tags['description']); | 
					
						
							|  |  |  |         $this->assertArrayNotHasKey('image', $tags); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Test image set if image has cover image
 | 
					
						
							| 
									
										
										
										
											2022-06-14 00:20:21 +08:00
										 |  |  |         $baseRepo = app(BaseRepo::class); | 
					
						
							|  |  |  |         $baseRepo->updateCoverImage($shelf, $this->getTestImage('image.png')); | 
					
						
							| 
									
										
										
										
											2021-06-24 03:42:48 +08:00
										 |  |  |         $resp = $this->asEditor()->get($shelf->getUrl()); | 
					
						
							|  |  |  |         $tags = $this->getOpenGraphTags($resp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->assertEquals($shelf->getBookCover(), $tags['image']); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Parse the open graph tags from a test response. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function getOpenGraphTags(TestResponse $resp): array | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $tags = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         libxml_use_internal_errors(true); | 
					
						
							|  |  |  |         $doc = new \DOMDocument(); | 
					
						
							|  |  |  |         $doc->loadHTML($resp->getContent()); | 
					
						
							|  |  |  |         $metaElems = $doc->getElementsByTagName('meta'); | 
					
						
							|  |  |  |         /** @var \DOMElement $elem */ | 
					
						
							|  |  |  |         foreach ($metaElems as $elem) { | 
					
						
							|  |  |  |             $prop = $elem->getAttribute('property'); | 
					
						
							|  |  |  |             $name = explode(':', $prop)[1] ?? null; | 
					
						
							|  |  |  |             if ($name) { | 
					
						
							|  |  |  |                 $tags[$name] = $elem->getAttribute('content'); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $tags; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | } |