CryptoServiceTest::testExceptions()   A
last analyzed

Complexity

Conditions 3
Paths 9

Size

Total Lines 21
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 3
eloc 13
c 2
b 0
f 0
nc 9
nop 0
dl 0
loc 21
rs 9.8333
1
<?php declare(strict_types = 1);
2
3
namespace SlevomatCsobGateway\Crypto;
4
5
use PHPUnit\Framework\TestCase;
6
7
class CryptoServiceTest extends TestCase
8
{
9
10
	/** @var CryptoService */
11
	private $cryptoService;
12
13
	protected function setUp(): void
14
	{
15
		$this->cryptoService = new CryptoService(
16
			__DIR__ . '/../../keys/client.key',
17
			__DIR__ . '/../../keys/client.pub'
18
		);
19
	}
20
21
	/**
22
	 * @return mixed[]
23
	 */
24
	public function getSignDataData(): array
25
	{
26
		return [
27
			[
28
				[
29
					'name' => 'foo',
30
					'id' => 123,
31
					'cart' => [
32
						[
33
							'price' => 99,
34
							'name' => 'foo product',
35
						],
36
						[
37
							'name' => 'bar product',
38
						],
39
					],
40
					'description' => 'order description',
41
				],
42
				'YlsQZVFnYZTu9oqsRTtPCBz8EDVfvPq52LZs3DxuOP7p3UGQA+Eu2Q9G/xNB4Sb0WwxSrt17yUmvjCa4vxeU5rGc19Pvv+4jznkL7DWdhETSVzChomxOwmuZ0mM3yWepMgxjZgo/j31ilv+8JMItvG4270qZ99Vfl4MWo45vI7bqqA6eUaNYk6rL76gFkRNcwTfHmP9iRMOo1N6wtmaedlbqAEvvflVfLnyyRXhT7B9iJYMGXIh4LxvbLQfC8YuJKbW+D2coVcobeFrO4lX7uLGXSMYP2o0QW6U+WH3NyFtL3Unh2qJCKnoBRVKAsiQLfxk68wfBwrFdC6O5D+show==',
43
				true,
44
				new SignatureDataFormatter([
45
					'id' => null,
46
					'name' => null,
47
					'cart' => [
48
						[
49
							'name' => null,
50
							'price' => null,
51
						],
52
					],
53
					'description' => null,
54
				]),
55
			],
56
			[
57
				[
58
					'merchantId' => '012345',
59
					'orderNo' => '5547',
60
					'dttm' => '20140425131559',
61
				],
62
				'invalidSignature',
63
				false,
64
				new SignatureDataFormatter([]),
65
			],
66
		];
67
	}
68
69
	/**
70
	 * @dataProvider getSignDataData
71
	 *
72
	 * @param mixed[] $data
73
	 * @param string $expectedSignature
74
	 * @param bool $valid
75
	 * @param SignatureDataFormatter $signatureDataFormatter
76
	 */
77
	public function testSignData(array $data, string $expectedSignature, bool $valid, SignatureDataFormatter $signatureDataFormatter): void
78
	{
79
		$signature = $this->cryptoService->signData($data, $signatureDataFormatter);
80
81
		if ($valid) {
82
			self::assertSame($expectedSignature, $signature);
83
		} else {
84
			self::assertNotSame($expectedSignature, $signature);
85
		}
86
	}
87
88
	public function testExceptions(): void
89
	{
90
		$cryptoService = new CryptoService(
91
			__DIR__ . '/invalid-key.key',
92
			__DIR__ . '/invalid-key.key'
93
		);
94
95
		try {
96
			$cryptoService->signData([], new SignatureDataFormatter([]));
97
			self::fail();
98
99
		} catch (PrivateKeyFileException $e) {
100
			self::assertSame(__DIR__ . '/invalid-key.key', $e->getPrivateKeyFile());
101
		}
102
103
		try {
104
			$cryptoService->verifyData([], 'fooSignature', new SignatureDataFormatter([]));
105
			self::fail();
106
107
		} catch (PublicKeyFileException $e) {
108
			self::assertSame(__DIR__ . '/invalid-key.key', $e->getPublicKeyFile());
109
		}
110
	}
111
112
	/**
113
	 * @runInSeparateProcess
114
	 */
115
	public function testExceptions2(): void
116
	{
117
		include __DIR__ . '/GlobalFunctionsMock.php';
118
119
		$cryptoService = new CryptoService(
120
			__DIR__ . '/../../keys/client.key',
121
			__DIR__ . '/../../keys/bank.pub'
122
		);
123
124
		try {
125
			$cryptoService->signData([], new SignatureDataFormatter([]));
126
			self::fail();
127
128
		} catch (SigningFailedException $e) {
129
			self::assertSame([], $e->getData());
130
		}
131
132
		try {
133
			$cryptoService->verifyData([], 'fooSignature', new SignatureDataFormatter([]));
134
			self::fail();
135
136
		} catch (VerificationFailedException $e) {
137
			self::assertSame([], $e->getData());
138
			self::assertSame('error_message', $e->getErrorMessage());
139
		}
140
	}
141
142
	/**
143
	 * @dataProvider getSignDataData
144
	 *
145
	 * @param mixed[] $data
146
	 * @param string $signature
147
	 * @param bool $valid
148
	 * @param SignatureDataFormatter $signatureDataFormatter
149
	 */
150
	public function testVerifyData(array $data, string $signature, bool $valid, SignatureDataFormatter $signatureDataFormatter): void
151
	{
152
		if ($valid) {
153
			self::assertTrue($this->cryptoService->verifyData($data, $signature, $signatureDataFormatter));
154
		} else {
155
			self::assertFalse($this->cryptoService->verifyData($data, $signature, $signatureDataFormatter));
156
		}
157
	}
158
159
}
160