Completed
Pull Request — develop (#745)
by Alejandro
05:29
created

ShortUrlVisitsActionTest   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 49
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 4
eloc 20
dl 0
loc 49
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A tryingToGetVisitsForInvalidUrlReturnsNotFoundError() 0 15 1
A properVisitsAreReturnedWhenDomainIsProvided() 0 14 2
A provideDomains() 0 4 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace ShlinkioApiTest\Shlink\Rest\Action;
6
7
use Laminas\Diactoros\Uri;
8
use Shlinkio\Shlink\TestUtils\ApiTest\ApiTestCase;
9
use ShlinkioApiTest\Shlink\Rest\Utils\NotFoundUrlHelpersTrait;
10
11
use function GuzzleHttp\Psr7\build_query;
12
use function sprintf;
13
14
class ShortUrlVisitsActionTest extends ApiTestCase
15
{
16
    use NotFoundUrlHelpersTrait;
17
18
    /**
19
     * @test
20
     * @dataProvider provideInvalidUrls
21
     */
22
    public function tryingToGetVisitsForInvalidUrlReturnsNotFoundError(
23
        string $shortCode,
24
        ?string $domain,
25
        string $expectedDetail
26
    ): void {
27
        $resp = $this->callApiWithKey(self::METHOD_GET, $this->buildShortUrlPath($shortCode, $domain, '/visits'));
28
        $payload = $this->getJsonResponsePayload($resp);
29
30
        $this->assertEquals(self::STATUS_NOT_FOUND, $resp->getStatusCode());
31
        $this->assertEquals(self::STATUS_NOT_FOUND, $payload['status']);
32
        $this->assertEquals('INVALID_SHORTCODE', $payload['type']);
33
        $this->assertEquals($expectedDetail, $payload['detail']);
34
        $this->assertEquals('Short URL not found', $payload['title']);
35
        $this->assertEquals($shortCode, $payload['shortCode']);
36
        $this->assertEquals($domain, $payload['domain'] ?? null);
37
    }
38
39
    /**
40
     * @test
41
     * @dataProvider provideDomains
42
     */
43
    public function properVisitsAreReturnedWhenDomainIsProvided(?string $domain, int $expectedAmountOfVisits): void
44
    {
45
        $shortCode = 'ghi789';
46
        $url = new Uri(sprintf('/short-urls/%s/visits', $shortCode));
47
48
        if ($domain !== null) {
49
            $url = $url->withQuery(build_query(['domain' => $domain]));
50
        }
51
52
        $resp = $this->callApiWithKey(self::METHOD_GET, (string) $url);
53
        $payload = $this->getJsonResponsePayload($resp);
54
55
        $this->assertEquals($expectedAmountOfVisits, $payload['visits']['pagination']['totalItems'] ?? -1);
56
        $this->assertCount($expectedAmountOfVisits, $payload['visits']['data'] ?? []);
57
    }
58
59
    public function provideDomains(): iterable
60
    {
61
        yield 'domain' => ['example.com', 0];
62
        yield 'no domain' => [null, 2];
63
    }
64
}
65