Skip to content

Commit 064a7e5

Browse files
committed
some kv fixes
1 parent 23a684c commit 064a7e5

13 files changed

Lines changed: 1435 additions & 236 deletions

.github/copilot-instructions.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
* **Always** ensure that constructor parameters for enum fields also accept the enum value type
2020
(e.g. `public function __construct(string $foo, string|MyEnum $bar)`).
2121
* Write tests for both cases.
22+
* **Never** leave imports unused in generated code.
2223

2324
# When generting code for concrete implementations of AbstractType:
2425
* **Always** ensure that class fields have an associated getter and setter method.

phpstan.neon

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
parameters:
2-
level: 6
3-
paths:
4-
- src
5-
- tests
2+
level: 6
3+
paths:
4+
- src
5+
- tests
6+
treatPhpDocTypesAsCertain: false

src/KV/KVClient.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
use DCarbone\PHPConsulAPI\PHPLib\WriteResponse;
2929
use DCarbone\PHPConsulAPI\QueryOptions;
3030
use DCarbone\PHPConsulAPI\Txn\KVTxnAPIResponse;
31-
use DCarbone\PHPConsulAPI\Txn\KVTxnOps;
3231
use DCarbone\PHPConsulAPI\Txn\KVTxnResponse;
3332
use DCarbone\PHPConsulAPI\Txn\TxnOp;
3433
use DCarbone\PHPConsulAPI\Txn\TxnResponse;

src/KV/KVPairs.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,20 @@ public function __construct(KVPair ...$KVPairs)
3636
$this->KVPairs = $KVPairs;
3737
}
3838

39+
/**
40+
* @return array<KVPair>
41+
*/
42+
public function getKVPairs(): array
43+
{
44+
return $this->KVPairs;
45+
}
46+
47+
public function setKVPairs(KVPair ...$KVPairs): self
48+
{
49+
$this->KVPairs = $KVPairs;
50+
return $this;
51+
}
52+
3953
public function getIterator(): \Traversable
4054
{
4155
return new \ArrayIterator($this->KVPairs);
Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
1+
<?php
2+
3+
namespace DCarbone\PHPConsulAPITests\Unit\KV;
4+
5+
use DCarbone\PHPConsulAPI\KV\KVPair;
6+
use DCarbone\PHPConsulAPI\KV\KVPairResponse;
7+
use DCarbone\PHPConsulAPI\PHPLib\Error;
8+
use DCarbone\PHPConsulAPI\QueryMeta;
9+
use PHPUnit\Framework\TestCase;
10+
11+
/**
12+
* @internal
13+
*/
14+
final class KVPairResponseTest extends TestCase
15+
{
16+
public function testDefaultState(): void
17+
{
18+
$resp = new KVPairResponse();
19+
self::assertNull($resp->KVPair);
20+
self::assertNull($resp->getValue());
21+
self::assertNull($resp->Err);
22+
}
23+
24+
public function testUnmarshalValueWithNull(): void
25+
{
26+
$resp = new KVPairResponse();
27+
$resp->unmarshalValue(null);
28+
self::assertNull($resp->KVPair);
29+
self::assertNull($resp->getValue());
30+
}
31+
32+
public function testUnmarshalValueWithValidData(): void
33+
{
34+
$decoded = new \stdClass();
35+
$decoded->Key = 'foo/bar';
36+
$decoded->Value = base64_encode('hello world');
37+
$decoded->CreateIndex = 10;
38+
$decoded->ModifyIndex = 20;
39+
$decoded->LockIndex = 0;
40+
$decoded->Flags = 0;
41+
$decoded->Session = '';
42+
43+
$resp = new KVPairResponse();
44+
$resp->unmarshalValue($decoded);
45+
46+
self::assertInstanceOf(KVPair::class, $resp->KVPair);
47+
self::assertSame('foo/bar', $resp->KVPair->getKey());
48+
self::assertSame('hello world', $resp->KVPair->getValue());
49+
self::assertSame(10, $resp->KVPair->getCreateIndex());
50+
self::assertSame(20, $resp->KVPair->getModifyIndex());
51+
}
52+
53+
public function testGetValueReturnsSameAsKVPairField(): void
54+
{
55+
$decoded = new \stdClass();
56+
$decoded->Key = 'test';
57+
$decoded->Value = base64_encode('val');
58+
$decoded->CreateIndex = 0;
59+
$decoded->ModifyIndex = 0;
60+
$decoded->LockIndex = 0;
61+
$decoded->Flags = 0;
62+
$decoded->Session = '';
63+
64+
$resp = new KVPairResponse();
65+
$resp->unmarshalValue($decoded);
66+
67+
self::assertSame($resp->KVPair, $resp->getValue());
68+
}
69+
70+
public function testArrayAccessOffset0ReturnsValue(): void
71+
{
72+
$decoded = new \stdClass();
73+
$decoded->Key = 'k';
74+
$decoded->Value = base64_encode('v');
75+
$decoded->CreateIndex = 0;
76+
$decoded->ModifyIndex = 0;
77+
$decoded->LockIndex = 0;
78+
$decoded->Flags = 0;
79+
$decoded->Session = '';
80+
81+
$resp = new KVPairResponse();
82+
$resp->unmarshalValue($decoded);
83+
84+
self::assertSame($resp->KVPair, $resp[0]);
85+
}
86+
87+
public function testArrayAccessOffset1ReturnsQueryMeta(): void
88+
{
89+
$resp = new KVPairResponse();
90+
$qm = new QueryMeta(RequestUrl: 'http://localhost', RequestTime: 0);
91+
$resp->setQueryMeta($qm);
92+
self::assertSame($qm, $resp[1]);
93+
}
94+
95+
public function testArrayAccessOffset2ReturnsErr(): void
96+
{
97+
$resp = new KVPairResponse();
98+
self::assertNull($resp[2]);
99+
100+
$err = new Error('test error');
101+
$resp->Err = $err;
102+
self::assertSame($err, $resp[2]);
103+
}
104+
105+
public function testArrayAccessOffsetExists(): void
106+
{
107+
$resp = new KVPairResponse();
108+
self::assertTrue(isset($resp[0]));
109+
self::assertTrue(isset($resp[1]));
110+
self::assertTrue(isset($resp[2]));
111+
self::assertFalse(isset($resp[3]));
112+
self::assertFalse(isset($resp[-1]));
113+
}
114+
115+
public function testArrayAccessOffsetGetThrowsOutOfRange(): void
116+
{
117+
$this->expectException(\OutOfRangeException::class);
118+
$resp = new KVPairResponse();
119+
$resp[3];
120+
}
121+
122+
public function testArrayAccessOffsetSetThrows(): void
123+
{
124+
$this->expectException(\BadMethodCallException::class);
125+
$resp = new KVPairResponse();
126+
$resp[0] = null;
127+
}
128+
129+
public function testArrayAccessOffsetUnsetThrows(): void
130+
{
131+
$this->expectException(\BadMethodCallException::class);
132+
$resp = new KVPairResponse();
133+
unset($resp[0]);
134+
}
135+
136+
public function testListDestructuring(): void
137+
{
138+
$decoded = new \stdClass();
139+
$decoded->Key = 'test';
140+
$decoded->Value = base64_encode('value');
141+
$decoded->CreateIndex = 5;
142+
$decoded->ModifyIndex = 10;
143+
$decoded->LockIndex = 0;
144+
$decoded->Flags = 0;
145+
$decoded->Session = '';
146+
147+
$resp = new KVPairResponse();
148+
$resp->unmarshalValue($decoded);
149+
$qm = new QueryMeta(RequestUrl: 'http://localhost', RequestTime: 0);
150+
$resp->setQueryMeta($qm);
151+
152+
[$kv, $queryMeta, $err] = $resp;
153+
self::assertInstanceOf(KVPair::class, $kv);
154+
self::assertSame('test', $kv->getKey());
155+
self::assertSame($qm, $queryMeta);
156+
self::assertNull($err);
157+
}
158+
159+
public function testListDestructuringWithError(): void
160+
{
161+
$resp = new KVPairResponse();
162+
$resp->Err = new Error('something went wrong');
163+
164+
[$kv, $queryMeta, $err] = $resp;
165+
self::assertNull($kv);
166+
self::assertNull($queryMeta);
167+
self::assertInstanceOf(Error::class, $err);
168+
self::assertSame('something went wrong', (string)$err);
169+
}
170+
171+
public function testUnmarshalOverwritesPreviousValue(): void
172+
{
173+
$decoded1 = new \stdClass();
174+
$decoded1->Key = 'first';
175+
$decoded1->Value = base64_encode('v1');
176+
$decoded1->CreateIndex = 0;
177+
$decoded1->ModifyIndex = 0;
178+
$decoded1->LockIndex = 0;
179+
$decoded1->Flags = 0;
180+
$decoded1->Session = '';
181+
182+
$decoded2 = new \stdClass();
183+
$decoded2->Key = 'second';
184+
$decoded2->Value = base64_encode('v2');
185+
$decoded2->CreateIndex = 0;
186+
$decoded2->ModifyIndex = 0;
187+
$decoded2->LockIndex = 0;
188+
$decoded2->Flags = 0;
189+
$decoded2->Session = '';
190+
191+
$resp = new KVPairResponse();
192+
$resp->unmarshalValue($decoded1);
193+
self::assertSame('first', $resp->KVPair->getKey());
194+
195+
$resp->unmarshalValue($decoded2);
196+
self::assertSame('second', $resp->KVPair->getKey());
197+
}
198+
199+
public function testUnmarshalNullAfterValueClearsIt(): void
200+
{
201+
$decoded = new \stdClass();
202+
$decoded->Key = 'k';
203+
$decoded->Value = base64_encode('v');
204+
$decoded->CreateIndex = 0;
205+
$decoded->ModifyIndex = 0;
206+
$decoded->LockIndex = 0;
207+
$decoded->Flags = 0;
208+
$decoded->Session = '';
209+
210+
$resp = new KVPairResponse();
211+
$resp->unmarshalValue($decoded);
212+
self::assertNotNull($resp->KVPair);
213+
214+
$resp->unmarshalValue(null);
215+
self::assertNull($resp->KVPair);
216+
}
217+
}
218+

tests/Unit/KV/KVPairTest.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
<?php
22

3-
declare(strict_types=1);
43

54
namespace DCarbone\PHPConsulAPITests\Unit\KV;
65

0 commit comments

Comments
 (0)