ClassNameFinderTest   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 119
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 6
eloc 67
c 0
b 0
f 0
dl 0
loc 119
rs 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
A setUp() 0 4 1
A test_no_rules() 0 14 1
A test_rule_but_no_resolvable_types() 0 22 1
A test_rule_returns_invalid_class_name() 0 22 1
A test_rule_returns_valid_class_name() 0 22 1
A test_caching_valid_class_name() 0 22 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace GacelaTest\Unit\Framework\ClassResolver;
6
7
use Gacela\Framework\Bootstrap\GacelaConfig;
8
use Gacela\Framework\ClassResolver\Cache\CacheInterface;
9
use Gacela\Framework\ClassResolver\Cache\InMemoryCache;
10
use Gacela\Framework\ClassResolver\ClassInfo;
11
use Gacela\Framework\ClassResolver\ClassNameFinder\ClassNameFinder;
12
use Gacela\Framework\ClassResolver\ClassNameFinder\ClassValidatorInterface;
13
use Gacela\Framework\ClassResolver\ClassNameFinder\Rule\FinderRuleInterface;
14
use Gacela\Framework\Gacela;
15
use PHPUnit\Framework\TestCase;
16
17
final class ClassNameFinderTest extends TestCase
18
{
19
    protected function setUp(): void
20
    {
21
        Gacela::bootstrap(__DIR__, static function (GacelaConfig $config): void {
22
            $config->setFileCache(false);
23
        });
24
    }
25
26
    public function test_no_rules(): void
27
    {
28
        $classNameFinder = new ClassNameFinder(
29
            $this->createMock(ClassValidatorInterface::class),
30
            [],
31
            $this->createMock(CacheInterface::class),
32
            [],
33
        );
34
35
        $classInfo = new ClassInfo('callerNamespace', 'callerModuleName', 'cacheKey');
36
        $resolvableTypes = ['A', 'B'];
37
        $actual = $classNameFinder->findClassName($classInfo, $resolvableTypes);
38
39
        self::assertNull($actual);
40
    }
41
42
    public function test_rule_but_no_resolvable_types(): void
43
    {
44
        $classValidator = $this->createMock(ClassValidatorInterface::class);
45
        $classValidator->method('isClassNameValid')
46
            ->with('\valid\class\name')
47
            ->willReturn(true);
48
49
        $finderRule = $this->createStub(FinderRuleInterface::class);
50
        $finderRule->method('buildClassCandidate')->willReturn('\valid\class\name');
51
52
        $classNameFinder = new ClassNameFinder(
53
            $classValidator,
54
            [$finderRule],
55
            $this->createMock(CacheInterface::class),
56
            [],
57
        );
58
59
        $classInfo = new ClassInfo('callerNamespace', 'callerModuleName', 'cacheKey');
60
        $resolvableTypes = [];
61
        $actual = $classNameFinder->findClassName($classInfo, $resolvableTypes);
62
63
        self::assertNull($actual);
64
    }
65
66
    public function test_rule_returns_invalid_class_name(): void
67
    {
68
        $classValidator = $this->createMock(ClassValidatorInterface::class);
69
        $classValidator->method('isClassNameValid')
70
            ->with('\valid\class\name')
71
            ->willReturn(false);
72
73
        $finderRule = $this->createStub(FinderRuleInterface::class);
74
        $finderRule->method('buildClassCandidate')->willReturn('\valid\class\name');
75
76
        $classNameFinder = new ClassNameFinder(
77
            $classValidator,
78
            [$finderRule],
79
            $this->createMock(CacheInterface::class),
80
            [],
81
        );
82
83
        $classInfo = new ClassInfo('callerNamespace', 'callerModuleName', 'cacheKey');
84
        $resolvableTypes = ['A', 'B'];
85
        $actual = $classNameFinder->findClassName($classInfo, $resolvableTypes);
86
87
        self::assertNull($actual);
88
    }
89
90
    public function test_rule_returns_valid_class_name(): void
91
    {
92
        $classValidator = $this->createMock(ClassValidatorInterface::class);
93
        $classValidator->method('isClassNameValid')
94
            ->with('\valid\class\name')
95
            ->willReturn(true);
96
97
        $finderRule = $this->createStub(FinderRuleInterface::class);
98
        $finderRule->method('buildClassCandidate')->willReturn('\valid\class\name');
99
100
        $classNameFinder = new ClassNameFinder(
101
            $classValidator,
102
            [$finderRule],
103
            $this->createMock(CacheInterface::class),
104
            [],
105
        );
106
107
        $classInfo = new ClassInfo('callerNamespace', 'callerModuleName', 'cacheKey');
108
        $resolvableTypes = ['A', 'B'];
109
        $actual = $classNameFinder->findClassName($classInfo, $resolvableTypes);
110
111
        self::assertSame('\valid\class\name', $actual);
112
    }
113
114
    public function test_caching_valid_class_name(): void
115
    {
116
        $classValidator = $this->createMock(ClassValidatorInterface::class);
117
        $classValidator->method('isClassNameValid')->willReturn(true);
118
119
        $finderRule = $this->createMock(FinderRuleInterface::class);
120
        $finderRule->expects(self::once())
121
            ->method('buildClassCandidate')
122
            ->willReturn('\valid\class\name');
123
124
        $classNameFinder = new ClassNameFinder(
125
            $classValidator,
126
            [$finderRule],
127
            new InMemoryCache(ClassInfo::class),
128
            [],
129
        );
130
131
        $classInfo = new ClassInfo('callerNamespace', 'callerModuleName', 'cacheKey');
132
        $resolvableTypes = ['A', 'B'];
133
        $classNameFinder->findClassName($classInfo, $resolvableTypes);
134
        $classNameFinder->findClassName($classInfo, $resolvableTypes);
135
        $classNameFinder->findClassName($classInfo, $resolvableTypes);
136
    }
137
}
138