Test Setup Failed
Push — master ( d9a06b...c9d9e0 )
by Chema
03:47
created

testCrawlUsingNamedExtractor()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 9
c 0
b 0
f 0
dl 0
loc 15
rs 9.9666
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Chemaclass\StockTickerTests\Unit\Domain\Crawler\Site\FinanceYahoo;
6
7
use Chemaclass\StockTicker\Domain\Crawler\Site\FinanceYahoo\FinanceYahooSiteCrawler;
8
use Chemaclass\StockTicker\Domain\Crawler\Site\FinanceYahoo\JsonExtractorInterface;
9
use Chemaclass\StockTicker\Domain\ReadModel\Site;
10
use Chemaclass\StockTicker\Domain\ReadModel\Symbol;
11
use Chemaclass\StockTickerTests\Unit\WithFakeHttpClient;
12
use PHPUnit\Framework\TestCase;
13
14
use function get_class;
15
16
final class FinanceYahooSiteCrawlerTest extends TestCase
17
{
18
    use WithFakeHttpClient;
19
20
    private const RESPONSE_BODY = <<<BODY
21
any random string 1
22
root.App.main = {"key": {"sub-key": "example expected value"}};
23
any random string 2
24
BODY;
25
26
    public function test_crawl_using_named_extractor(): void
27
    {
28
        $crawler = new FinanceYahooSiteCrawler([
29
            'extractor name' => $this->stubJsonExtractor(),
30
        ]);
31
32
        $actual = $crawler->crawl(
33
            $this->mockHttpClient(self::RESPONSE_BODY),
34
            Symbol::fromString('EXAMPLE_TICKER'),
35
        );
36
37
        self::assertEquals(new Site([
38
            'symbol' => 'EXAMPLE_TICKER',
39
            'extractor name' => ['example expected value'],
40
        ]), $actual);
41
    }
42
43
    public function test_crawl_using_extractor_without_name(): void
44
    {
45
        $jsonExtractor = $this->stubJsonExtractor();
46
        $crawler = new FinanceYahooSiteCrawler([$jsonExtractor]);
47
48
        $actual = $crawler->crawl(
49
            $this->mockHttpClient(self::RESPONSE_BODY),
50
            Symbol::fromString('EXAMPLE_TICKER'),
51
        );
52
53
        self::assertEquals(new Site([
54
            'symbol' => 'EXAMPLE_TICKER',
55
            get_class($jsonExtractor) => ['example expected value'],
56
        ]), $actual);
57
    }
58
59
    private function stubJsonExtractor(): JsonExtractorInterface
60
    {
61
        return new class() implements JsonExtractorInterface {
62
            public function extractFromJson(array $json): array
63
            {
64
                return [
65
                    $json['key']['sub-key'],
66
                ];
67
            }
68
        };
69
    }
70
}
71