File: CallableResolverTest.php

package info (click to toggle)
php-di-invoker 2.3.6-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 324 kB
  • sloc: php: 1,161; makefile: 13; sh: 6
file content (174 lines) | stat: -rw-r--r-- 4,554 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
<?php declare(strict_types=1);

namespace Invoker\Test;

use Invoker\CallableResolver;
use Invoker\Exception\NotCallableException;
use Invoker\Test\Mock\ArrayContainer;
use Invoker\Test\Mock\CallableSpy;
use PHPUnit\Framework\TestCase;
use stdClass;

class CallableResolverTest extends TestCase
{
    /** @var CallableResolver */
    private $resolver;

    /** @var ArrayContainer */
    private $container;

    public function setUp(): void
    {
        parent::setUp();
        $this->container = new ArrayContainer;
        $this->resolver = new CallableResolver($this->container);
    }

    /**
     * @test
     */
    #[\PHPUnit\Framework\Attributes\Test]
    public function resolves_function()
    {
        $result = $this->resolver->resolve('strlen');

        $this->assertSame(strlen('Hello world!'), $result('Hello world!'));
    }

    /**
     * @test
     */
    #[\PHPUnit\Framework\Attributes\Test]
    public function resolves_namespaced_function()
    {
        $result = $this->resolver->resolve(__NAMESPACE__ . '\foo');

        $this->assertEquals('bar', $result());
    }

    /**
     * @test
     */
    #[\PHPUnit\Framework\Attributes\Test]
    public function resolves_callable_from_container()
    {
        $callable = function () {
        };
        $this->container->set('thing-to-call', $callable);

        $this->assertSame($callable, $this->resolver->resolve('thing-to-call'));
    }

    /**
     * @test
     */
    #[\PHPUnit\Framework\Attributes\Test]
    public function resolves_invokable_class()
    {
        $callable = new CallableSpy;
        $this->container->set(CallableSpy::class, $callable);

        $this->assertSame($callable, $this->resolver->resolve(CallableSpy::class));
    }

    /**
     * @test
     */
    #[\PHPUnit\Framework\Attributes\Test]
    public function resolve_array_method_call()
    {
        $fixture = new InvokerTestFixture;
        $this->container->set(InvokerTestFixture::class, $fixture);

        $result = $this->resolver->resolve([InvokerTestFixture::class, 'foo']);

        $result();
        $this->assertTrue($fixture->wasCalled);
    }

    /**
     * @test
     */
    #[\PHPUnit\Framework\Attributes\Test]
    public function resolve_string_method_call()
    {
        $fixture = new InvokerTestFixture;
        $this->container->set(InvokerTestFixture::class, $fixture);

        $result = $this->resolver->resolve('Invoker\Test\InvokerTestFixture::foo');

        $result();
        $this->assertTrue($fixture->wasCalled);
    }

    /**
     * @test
     */
    #[\PHPUnit\Framework\Attributes\Test]
    public function resolves_array_method_call_with_service()
    {
        $fixture = new InvokerTestFixture;
        $this->container->set('thing-to-call', $fixture);

        $result = $this->resolver->resolve(['thing-to-call', 'foo']);

        $result();
        $this->assertTrue($fixture->wasCalled);
    }

    /**
     * @test
     */
    #[\PHPUnit\Framework\Attributes\Test]
    public function resolves_string_method_call_with_service()
    {
        $fixture = new InvokerTestFixture;
        $this->container->set('thing-to-call', $fixture);

        $result = $this->resolver->resolve('thing-to-call::foo');

        $result();
        $this->assertTrue($fixture->wasCalled);
    }

    /**
     * @test
     */
    #[\PHPUnit\Framework\Attributes\Test]
    public function throws_resolving_non_callable_from_container()
    {
        $this->expectExceptionMessage("'foo' is neither a callable nor a valid container entry");
        $this->expectException(NotCallableException::class);
        $resolver = new CallableResolver(new ArrayContainer);
        $resolver->resolve('foo');
    }

    /**
     * @test
     */
    #[\PHPUnit\Framework\Attributes\Test]
    public function handles_objects_correctly_in_exception_message()
    {
        $this->expectExceptionMessage('Instance of stdClass is not a callable');
        $this->expectException(NotCallableException::class);
        $resolver = new CallableResolver(new ArrayContainer);
        $resolver->resolve(new stdClass);
    }

    /**
     * @test
     */
    #[\PHPUnit\Framework\Attributes\Test]
    public function handles_method_calls_correctly_in_exception_message()
    {
        $this->expectExceptionMessage('stdClass::test() is not a callable');
        $this->expectException(NotCallableException::class);
        $resolver = new CallableResolver(new ArrayContainer);
        $resolver->resolve([new stdClass, 'test']);
    }
}

function foo()
{
    return 'bar';
}