Passed
Pull Request — master (#113)
by
unknown
02:30
created

CounterTest   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 93
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 6
eloc 47
c 2
b 0
f 0
dl 0
loc 93
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * This file is part of Esi\SimpleCounter.
7
 *
8
 * (c) Eric Sizemore <https://github.com/ericsizemore>
9
 *
10
 * This source file is subject to the MIT license. For the full copyright and
11
 * license information, please view the LICENSE file that was distributed with
12
 * this source code.
13
 */
14
15
namespace Esi\SimpleCounter\Tests;
16
17
use Esi\SimpleCounter\Configuration\FlatfileConfiguration;
18
use Esi\SimpleCounter\Counter;
19
use Esi\SimpleCounter\Storage\FlatfileStorage;
20
use Esi\Utility\Arrays;
21
use Esi\Utility\Environment;
22
use Esi\Utility\Filesystem;
23
use PHPUnit\Framework\Attributes\CoversClass;
24
use PHPUnit\Framework\Attributes\TestDox;
25
use PHPUnit\Framework\Attributes\UsesClass;
26
use PHPUnit\Framework\TestCase;
27
28
use const DIRECTORY_SEPARATOR;
29
30
/**
31
 * @internal
32
 *
33
 * @psalm-suppress NullReference
34
 */
35
#[CoversClass(Counter::class)]
36
#[UsesClass(FlatfileStorage::class)]
37
#[UsesClass(FlatfileConfiguration::class)]
38
class CounterTest extends TestCase
39
{
40
    private ?Counter $counter;
41
42
    /**
43
     * @var string[]
44
     */
45
    private static array $logFiles;
46
47
    /**
48
     * @var string[]
49
     */
50
    private static array $testDirectories;
51
52
    #[\Override]
53
    protected function setUp(): void
54
    {
55
        Arrays::set($_SERVER, 'REMOTE_ADDR', '127.0.0.1');
56
57
        self::$testDirectories = [
58
            'logDir'   => \sprintf('%s%s%s', \dirname(__FILE__, 2), DIRECTORY_SEPARATOR, 'logs'),
59
            'imageDir' => \sprintf('%s%s%s', \dirname(__FILE__, 2), DIRECTORY_SEPARATOR, 'images'),
60
        ];
61
62
        self::$logFiles = [
63
            'countFile' => \sprintf('%s%s%s', self::$testDirectories['logDir'], DIRECTORY_SEPARATOR, 'counter.json'),
64
            'ipFile'    => \sprintf('%s%s%s', self::$testDirectories['logDir'], DIRECTORY_SEPARATOR, 'ips.json'),
65
        ];
66
67
        $this->counter = new Counter(new FlatfileStorage(FlatfileConfiguration::initOptions(
68
            [
69
                'logDir'   => self::$testDirectories['logDir'],
70
                'imageDir' => self::$testDirectories['imageDir'],
71
            ]
72
        )));
73
    }
74
75
    #[\Override]
76
    protected function tearDown(): void
77
    {
78
        $this->counter = null;
79
80
        Arrays::set($_SERVER, 'REMOTE_ADDR', Environment::var('REMOTE_ADDR', null));
81
82
        Filesystem::fileWrite(self::$logFiles['countFile'], '{"currentCount":"0"}');
83
        Filesystem::fileWrite(self::$logFiles['ipFile'], '{"ipList":[""]}');
84
    }
85
86
    #[TestDox('fetchCurrentCount is able to return the current count data accurately.')]
87
    public function testFetchCurrentCount(): void
88
    {
89
        self::assertInstanceOf(Counter::class, $this->counter);
90
91
        $currentCount = $this->counter->fetchCurrentCount();
92
        self::assertSame(0, $currentCount);
93
94
        $this->counter->display();
95
        $newCount = $this->counter->fetchCurrentCount();
96
        self::assertSame(1, $newCount);
97
    }
98
99
    #[TestDox('fetchCurrentIpList is able to return the current ip data accurately.')]
100
    public function testFetchCurrentIpList(): void
101
    {
102
        self::assertInstanceOf(Counter::class, $this->counter);
103
        self::assertEmpty($this->counter->fetchCurrentIpList());
104
        $this->counter->display();
105
        self::assertSame(['127.0.0.1'], $this->counter->fetchCurrentIpList());
106
    }
107
108
    #[TestDox('getOption is able to return the value of a given option.')]
109
    public function testGetOption(): void
110
    {
111
        self::assertInstanceOf(Counter::class, $this->counter);
112
        self::assertSame(self::$testDirectories['logDir'], $this->counter->getOption('logDir'));
113
    }
114
115
    #[TestDox('Was able to instantiate Counter with default options and retrieve count information.')]
116
    public function testWithDefaultOptions(): void
117
    {
118
        self::assertInstanceOf(Counter::class, $this->counter);
119
120
        $count    = $this->counter->display();
121
        $countTwo = $this->counter->display();
122
123
        self::assertNotEmpty($count);
124
        self::assertNotEmpty($countTwo);
125
        self::assertMatchesRegularExpression('/([A-Za-z]+( [A-Za-z]+)+)\s#[0-9]+/i', $count);
126
        self::assertMatchesRegularExpression('/([A-Za-z]+( [A-Za-z]+)+)\s#[0-9]+/i', $countTwo);
127
        self::assertSame($count, $countTwo);
128
    }
129
}
130