mirror of
				https://github.com/BookStackApp/BookStack.git
				synced 2025-11-03 02:13:16 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			97 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Tests;
 | 
						|
 | 
						|
use BookStack\Entities\Repos\BaseRepo;
 | 
						|
use BookStack\Entities\Repos\BookRepo;
 | 
						|
use Illuminate\Support\Str;
 | 
						|
use Illuminate\Testing\TestResponse;
 | 
						|
 | 
						|
class OpenGraphTest extends TestCase
 | 
						|
{
 | 
						|
    public function test_page_tags()
 | 
						|
    {
 | 
						|
        $page = $this->entities->page();
 | 
						|
        $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 = $this->entities->chapter();
 | 
						|
        $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 = $this->entities->book();
 | 
						|
        $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->files->uploadedImage('image.png'));
 | 
						|
        $resp = $this->asEditor()->get($book->getUrl());
 | 
						|
        $tags = $this->getOpenGraphTags($resp);
 | 
						|
 | 
						|
        $this->assertEquals($book->getBookCover(), $tags['image']);
 | 
						|
    }
 | 
						|
 | 
						|
    public function test_shelf_tags()
 | 
						|
    {
 | 
						|
        $shelf = $this->entities->shelf();
 | 
						|
        $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
 | 
						|
        $baseRepo = app(BaseRepo::class);
 | 
						|
        $baseRepo->updateCoverImage($shelf, $this->files->uploadedImage('image.png'));
 | 
						|
        $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;
 | 
						|
    }
 | 
						|
}
 |