TestHelper::assertException()   B
last analyzed

Complexity

Conditions 9
Paths 28

Size

Total Lines 34

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 34
rs 8.0555
c 0
b 0
f 0
cc 9
nc 28
nop 4
1
<?php
2
3
namespace Ntb\RestAPI;
4
5
/**
6
 * Test Helper class provides some helpful functions for tests.
7
 * @author Christian Blank <[email protected]>
8
 */
9
class TestHelper {
10
11
    /**
12
     * @param callable $callback
13
     * @param string $expectedException
14
     * @param int $expectedCode
0 ignored issues
show
Documentation introduced by
Should the type for parameter $expectedCode not be integer|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
15
     * @param string $expectedMessage
0 ignored issues
show
Documentation introduced by
Should the type for parameter $expectedMessage not be string|null?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
16
     * @author VladaHejda
17
     */
18
    public static function assertException(callable $callback, $expectedException = 'Exception', $expectedCode = null, $expectedMessage = null) {
19
        $self = new \SapphireTest;
20
        if (!\ClassInfo::exists($expectedException)) {
21
            $self->fail(sprintf('An exception of type "%s" does not exist.', $expectedException));
0 ignored issues
show
Bug introduced by
The method fail() does not seem to exist on object<SapphireTest>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
22
        }
23
        try {
24
            $callback();
25
        } catch (\Exception $e) {
26
            $class = \ClassInfo::class_name($e);
27
            $message = $e->getMessage();
28
            $code = $e->getCode();
29
            $errorMessage = 'Failed asserting the class of exception';
30
            if ($message && $code) {
31
                $errorMessage .= sprintf(' (message was %s, code was %d)', $message, $code);
32
            } else if ($code) {
33
                $errorMessage .= sprintf(' (code was %d)', $code);
34
            }
35
            $errorMessage .= '.';
36
            $self->assertInstanceOf($expectedException, $e, $errorMessage);
0 ignored issues
show
Bug introduced by
The method assertInstanceOf() does not seem to exist on object<SapphireTest>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
37
            if ($expectedCode !== null) {
38
                $self->assertEquals($expectedCode, $code, sprintf('Failed asserting code of thrown %s.', $class));
0 ignored issues
show
Bug introduced by
The method assertEquals() does not seem to exist on object<SapphireTest>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
39
            }
40
            if ($expectedMessage !== null) {
41
                $self->assertContains($expectedMessage, $message, sprintf('Failed asserting the message of thrown %s.', $class));
42
            }
43
            return;
44
        }
45
        $errorMessage = 'Failed asserting that exception';
46
        if (strtolower($expectedException) !== 'exception') {
47
            $errorMessage .= sprintf(' of type %s', $expectedException);
48
        }
49
        $errorMessage .= ' was thrown.';
50
        $self->fail($errorMessage);
0 ignored issues
show
Bug introduced by
The method fail() does not seem to exist on object<SapphireTest>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
51
    }
52
53
    /**
54
     * Call protected/private method of a class.
55
     *
56
     * @param object|string &$object Instantiated object that we will run method on.
57
     * @param string $methodName Method name to call
58
     * @param array $parameters Array of parameters to pass into method.
59
     *
60
     * @return mixed Method return.
61
     *
62
     * @author Juan Treminio
63
     * @author Christian Blank
64
     */
65
    public static function invoke(&$object, $methodName, array $parameters = []) {
66
        if(is_object($object)) {
67
            $className = get_class($object);
68
        } else {
69
            $className = $object;
70
        }
71
        $reflection = new \ReflectionClass($className);
72
        $method = $reflection->getMethod($methodName);
73
        $method->setAccessible(true);
74
        return $method->invokeArgs($object, $parameters);
75
    }
76
}
77