1 | <?php |
||
2 | |||
3 | /** |
||
4 | * This file is part of the tarantool/client package. |
||
5 | * |
||
6 | * (c) Eugene Leonovich <[email protected]> |
||
7 | * |
||
8 | * For the full copyright and license information, please view the LICENSE |
||
9 | * file that was distributed with this source code. |
||
10 | */ |
||
11 | |||
12 | declare(strict_types=1); |
||
13 | |||
14 | namespace Tarantool\Client\Tests\Integration; |
||
15 | |||
16 | use Tarantool\Client\Error; |
||
17 | use Tarantool\Client\Exception\RequestFailed; |
||
18 | |||
19 | final class BoxErrorTest extends TestCase |
||
20 | { |
||
21 | public function testExceptionIsThrown() : void |
||
22 | { |
||
23 | $this->expectException(RequestFailed::class); |
||
24 | $this->expectExceptionMessage('Because I can'); |
||
25 | $this->expectExceptionCode(42); |
||
26 | |||
27 | $this->client->evaluate('box.error({code = 42, reason = "Because I can"})'); |
||
0 ignored issues
–
show
|
|||
28 | } |
||
29 | |||
30 | /** |
||
31 | * @requires Tarantool >=2.4.1 |
||
32 | */ |
||
33 | public function testExceptionWithErrorIsThrown() : void |
||
34 | { |
||
35 | try { |
||
36 | /* |
||
37 | * Triggers "AccessDeniedError", which includes the fields |
||
38 | * "object_type", "object_name", "access_type", "user" (since 3.1). |
||
39 | * See https://www.tarantool.io/en/doc/2.4/dev_guide/internals/box_protocol/#binary-protocol-responses-for-errors-extra. |
||
40 | */ |
||
41 | $this->client->evaluate(" |
||
42 | local temp_user = 'user_with_no_privileges' |
||
43 | local curr_user = box.session.user() |
||
44 | box.schema.user.create(temp_user) |
||
45 | box.session.su(temp_user) |
||
46 | local _, err = pcall(box.schema.user.grant, temp_user, 'execute', 'universe') |
||
47 | box.session.su(curr_user) |
||
48 | box.schema.user.drop(temp_user) |
||
49 | box.error(err) |
||
50 | "); |
||
51 | self::fail(sprintf('"%s" exception was not thrown', RequestFailed::class)); |
||
52 | } catch (RequestFailed $e) { |
||
53 | self::assertSame("Write access to space '_priv' is denied for user 'user_with_no_privileges'", $e->getMessage()); |
||
54 | self::assertSame(42, $e->getCode()); |
||
55 | |||
56 | $error = $e->getError(); |
||
57 | self::assertInstanceOf(Error::class, $error); |
||
58 | self::assertSame('AccessDeniedError', $error->getType()); |
||
59 | self::assertSame("Write access to space '_priv' is denied for user 'user_with_no_privileges'", $error->getMessage()); |
||
60 | self::assertSame(42, $error->getCode()); |
||
61 | $expectedFields = [ |
||
62 | 'object_type' => 'space', |
||
63 | 'object_name' => '_priv', |
||
64 | 'access_type' => 'Write', |
||
65 | 'user' => 'user_with_no_privileges', |
||
66 | ]; |
||
67 | if ($this->tarantoolVersionSatisfies('< 3.1')) { |
||
68 | unset($expectedFields['user']); |
||
69 | } |
||
70 | self::assertEquals($expectedFields, $error->getFields()); |
||
71 | self::assertNull($error->getPrevious()); |
||
72 | } |
||
73 | } |
||
74 | |||
75 | /** |
||
76 | * @requires Tarantool >=2.4.1 |
||
77 | */ |
||
78 | public function testExceptionWithNestedErrorIsThrown() : void |
||
79 | { |
||
80 | try { |
||
81 | $this->client->evaluate(' |
||
82 | err1 = box.error.new({code = 1, type = "t1", reason = "r1"}) |
||
83 | err2 = box.error.new({code = 2, type = "t2", reason = "r2",}) |
||
84 | err1:set_prev(err2) |
||
85 | box.error(err1) |
||
86 | '); |
||
87 | self::fail(sprintf('"%s" exception was not thrown', RequestFailed::class)); |
||
88 | } catch (RequestFailed $e) { |
||
89 | self::assertSame('r1', $e->getMessage()); |
||
90 | self::assertSame(1, $e->getCode()); |
||
91 | |||
92 | $error = $e->getError(); |
||
93 | self::assertInstanceOf(Error::class, $error); |
||
94 | self::assertSame('CustomError', $error->getType()); |
||
95 | self::assertSame('r1', $error->getMessage()); |
||
96 | self::assertSame(1, $error->getCode()); |
||
97 | self::assertSame(['custom_type' => 't1'], $error->getFields()); |
||
98 | |||
99 | $prevError = $error->getPrevious(); |
||
100 | self::assertInstanceOf(Error::class, $prevError); |
||
101 | self::assertSame('CustomError', $prevError->getType()); |
||
102 | self::assertSame('r2', $prevError->getMessage()); |
||
103 | self::assertSame(2, $prevError->getCode()); |
||
104 | self::assertSame(['custom_type' => 't2'], $prevError->getFields()); |
||
105 | self::assertNull($prevError->getPrevious()); |
||
106 | } |
||
107 | } |
||
108 | } |
||
109 |
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.