Skip to content

Commit ca125bf

Browse files
PratikshaPratiksha
authored andcommitted
implemented unit test
1 parent fda7a1b commit ca125bf

File tree

8 files changed

+680
-3
lines changed

8 files changed

+680
-3
lines changed

src/Configuration.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use Neo4j\QueryAPI\Objects\Bookmarks;
77
use Neo4j\QueryAPI\Enums\AccessMode;
88

9-
final class Configuration
9+
class Configuration
1010
{
1111
/**
1212
* Constructor for Configuration class.

src/ResponseParser.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
use Neo4j\QueryAPI\Objects\ProfiledQueryPlan;
1515
use Neo4j\QueryAPI\Objects\Point;
1616

17-
final class ResponseParser
17+
class ResponseParser
1818
{
1919
public function __construct(private readonly OGM $ogm)
2020
{

tests/Unit/objects/NodeUnitTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use Neo4j\QueryAPI\Objects\Node;
66
use PHPUnit\Framework\TestCase;
77

8-
class NodeUnitTest extends TestCase
8+
final class NodeUnitTest extends TestCase
99
{
1010
private Node $node;
1111
#[\Override]
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
<?php
2+
3+
namespace Neo4j\QueryAPI\Tests\Unit\srcfiles;
4+
5+
use Neo4j\QueryAPI\Exception\Neo4jException;
6+
use Neo4j\QueryAPI\Neo4jQueryAPI;
7+
use Neo4j\QueryAPI\Configuration;
8+
use Neo4j\QueryAPI\ResponseParser;
9+
use Neo4j\QueryAPI\Neo4jRequestFactory;
10+
use Neo4j\QueryAPI\Results\ResultSet;
11+
use Neo4j\QueryAPI\Authentication\AuthenticateInterface;
12+
use PHPUnit\Framework\TestCase;
13+
use Psr\Http\Client\ClientInterface;
14+
use Psr\Http\Message\RequestInterface;
15+
use Psr\Http\Message\ResponseInterface;
16+
use Psr\Http\Client\RequestExceptionInterface;
17+
18+
final class Neo4jQueryAPI_UnitTest extends TestCase
19+
{
20+
private Neo4jQueryAPI $api;
21+
private ClientInterface $clientMock;
22+
private ResponseParser $responseParserMock;
23+
private Neo4jRequestFactory $requestFactoryMock;
24+
private Configuration $configMock;
25+
26+
#[\Override]
27+
protected function setUp(): void
28+
{
29+
$this->clientMock = $this->createMock(ClientInterface::class);
30+
$this->responseParserMock = $this->createMock(ResponseParser::class);
31+
$this->requestFactoryMock = $this->createMock(Neo4jRequestFactory::class);
32+
$this->configMock = $this->createMock(Configuration::class);
33+
34+
$this->api = new Neo4jQueryAPI(
35+
client: $this->clientMock,
36+
responseParser: $this->responseParserMock,
37+
requestFactory: $this->requestFactoryMock,
38+
config: $this->configMock
39+
);
40+
}
41+
42+
public function testLoginCreatesInstance(): void
43+
{
44+
$apiInstance = Neo4jQueryAPI::login('http://localhost:7474');
45+
$this->assertInstanceOf(Neo4jQueryAPI::class, $apiInstance);
46+
}
47+
48+
public function testGetConfigReturnsCorrectConfig(): void
49+
{
50+
$this->assertSame($this->configMock, $this->api->getConfig());
51+
}
52+
53+
public function testRunExecutesQueryAndReturnsResultSet(): void
54+
{
55+
$cypher = "MATCH (n) RETURN n";
56+
$parameters = [];
57+
58+
$mockRequest = $this->createMock(RequestInterface::class);
59+
$mockResponse = $this->createMock(ResponseInterface::class);
60+
$mockResultSet = $this->createMock(ResultSet::class);
61+
62+
$this->requestFactoryMock
63+
->method('buildRunQueryRequest')
64+
->willReturn($mockRequest);
65+
66+
$this->clientMock
67+
->method('sendRequest')
68+
->willReturn($mockResponse);
69+
$this->responseParserMock
70+
->method('parseRunQueryResponse')
71+
->willReturn($mockResultSet);
72+
73+
$result = $this->api->run($cypher, $parameters);
74+
75+
// Ensure the returned result is the expected ResultSet
76+
$this->assertSame($mockResultSet, $result);
77+
}
78+
79+
public function testHandleRequestExceptionThrowsNeo4jException(): void
80+
{
81+
$this->expectException(Neo4jException::class);
82+
83+
$mockException = $this->createMock(RequestExceptionInterface::class);
84+
$this->invokeMethod($this->api, 'handleRequestException', [$mockException]);
85+
}
86+
87+
private function invokeMethod($object, string $methodName, array $parameters = [])
88+
{
89+
$reflection = new \ReflectionClass(get_class($object));
90+
$method = $reflection->getMethod($methodName);
91+
92+
return $method->invokeArgs($object, $parameters);
93+
}
94+
}
Lines changed: 265 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,265 @@
1+
<?php
2+
3+
namespace Neo4j\QueryAPI\Tests\Unit\srcfiles;
4+
5+
use Exception;
6+
use Neo4j\QueryAPI\Configuration;
7+
use Nyholm\Psr7\Factory\Psr17Factory;
8+
use PHPUnit\Framework\TestCase;
9+
use Psr\Http\Message\RequestInterface;
10+
use Psr\Http\Message\RequestFactoryInterface;
11+
use Psr\Http\Message\StreamFactoryInterface;
12+
use GuzzleHttp\Psr7\Request;
13+
use GuzzleHttp\Psr7\Utils;
14+
use Neo4j\QueryAPI\Neo4jRequestFactory;
15+
use Neo4j\QueryAPI\Objects\Authentication;
16+
use RuntimeException;
17+
18+
/**
19+
* @api
20+
*/
21+
class Neo4jRequestFactoryUnitTest extends TestCase
22+
{
23+
/** @psalm-suppress PropertyNotSetInConstructor */
24+
private RequestFactoryInterface&\PHPUnit\Framework\MockObject\MockObject $psr17Factory;
25+
26+
/** @psalm-suppress PropertyNotSetInConstructor */
27+
private StreamFactoryInterface&\PHPUnit\Framework\MockObject\MockObject $streamFactory;
28+
29+
30+
31+
private string $address = '';
32+
private string $authHeader = '';
33+
34+
/**
35+
* @throws Exception
36+
*/
37+
#[\Override]
38+
protected function setUp(): void
39+
{
40+
parent::setUp();
41+
$this->psr17Factory = $this->createMock(RequestFactoryInterface::class);
42+
$this->streamFactory = $this->createMock(StreamFactoryInterface::class);
43+
44+
$address = getenv('NEO4J_ADDRESS');
45+
$this->address = is_string($address) ? $address : '';
46+
47+
$auth = Authentication::fromEnvironment();
48+
$this->authHeader = $auth->getHeader();
49+
}
50+
51+
/**
52+
* Test for buildRunQueryRequest
53+
*/
54+
public function testBuildRunQueryRequest(): void
55+
{
56+
$cypher = 'MATCH (n) RETURN n';
57+
$parameters = ['param1' => 'value1'];
58+
$database = 'neo4j';
59+
60+
$payload = json_encode([
61+
'statement' => $cypher,
62+
'parameters' => $parameters,
63+
'includeCounters' => true,
64+
]);
65+
$uri = "{$this->address}/db/{$database}/query/v2";
66+
67+
$mockRequest = new Request('POST', $uri);
68+
$mockStream = Utils::streamFor($payload);
69+
70+
$this->streamFactory->method('createStream')
71+
->willReturn($mockStream);
72+
73+
$this->psr17Factory->method('createRequest')
74+
->willReturn($mockRequest);
75+
76+
$factory = new Neo4jRequestFactory(
77+
$this->psr17Factory,
78+
$this->streamFactory,
79+
new Configuration($this->address),
80+
Authentication::fromEnvironment(),
81+
);
82+
$request = $factory->buildRunQueryRequest($cypher, $parameters);
83+
84+
$this->assertEquals('POST', $request->getMethod());
85+
$this->assertEquals($uri, (string) $request->getUri());
86+
$payload = json_encode([]);
87+
if ($payload === false) {
88+
throw new RuntimeException('JSON encoding failed: ' . json_last_error_msg());
89+
}
90+
91+
}
92+
93+
/**
94+
* Test for buildBeginTransactionRequest
95+
*/
96+
public function testBuildBeginTransactionRequest(): void
97+
{
98+
$database = 'neo4j';
99+
$uri = "{$this->address}/db/{$database}/query/v2/tx";
100+
101+
$mockRequest = new Request('POST', $uri);
102+
$mockStream = Utils::streamFor('');
103+
104+
$this->streamFactory->method('createStream')
105+
->willReturn($mockStream);
106+
107+
$this->psr17Factory->method('createRequest')
108+
->willReturn($mockRequest);
109+
110+
$factory = new Neo4jRequestFactory(
111+
$this->psr17Factory,
112+
$this->streamFactory,
113+
new Configuration($this->address),
114+
Authentication::fromEnvironment(),
115+
);
116+
$request = $factory->buildBeginTransactionRequest();
117+
118+
$this->assertEquals('POST', $request->getMethod());
119+
$this->assertEquals($uri, (string) $request->getUri());
120+
}
121+
122+
/**
123+
* Test for buildCommitRequest
124+
*/
125+
public function testBuildCommitRequest(): void
126+
{
127+
$database = 'neo4j';
128+
$transactionId = '12345';
129+
$uri = "{$this->address}/db/{$database}/query/v2/tx/{$transactionId}/commit";
130+
131+
$mockRequest = new Request('POST', $uri);
132+
$mockStream = Utils::streamFor('');
133+
134+
$this->streamFactory->method('createStream')
135+
->willReturn($mockStream);
136+
137+
$this->psr17Factory->method('createRequest')
138+
->willReturn($mockRequest);
139+
140+
$factory = new Neo4jRequestFactory(
141+
$this->psr17Factory,
142+
$this->streamFactory,
143+
new Configuration($this->address),
144+
Authentication::fromEnvironment(),
145+
);
146+
$request = $factory->buildCommitRequest($database, $transactionId);
147+
148+
$this->assertEquals('POST', $request->getMethod());
149+
$this->assertEquals($uri, (string) $request->getUri());
150+
}
151+
152+
/**
153+
* Test for buildRollbackRequest
154+
*/
155+
public function testBuildRollbackRequest(): void
156+
{
157+
$database = 'neo4j';
158+
$transactionId = '12345';
159+
$uri = "{$this->address}/db/{$database}/query/v2/tx/{$transactionId}/rollback";
160+
161+
$mockRequest = new Request('POST', $uri);
162+
$mockStream = Utils::streamFor('');
163+
164+
$this->streamFactory->method('createStream')
165+
->willReturn($mockStream);
166+
167+
$this->psr17Factory->method('createRequest')
168+
->willReturn($mockRequest);
169+
170+
$factory = new Neo4jRequestFactory(
171+
$this->psr17Factory,
172+
$this->streamFactory,
173+
new Configuration($this->address),
174+
Authentication::fromEnvironment(),
175+
);
176+
$request = $factory->buildRollbackRequest($database, $transactionId);
177+
178+
$this->assertEquals('DELETE', $request->getMethod());
179+
$this->assertEquals($uri, (string) $request->getUri());
180+
}
181+
182+
/**
183+
* Test for createRequest method with headers and body
184+
*/
185+
public function testCreateRequestWithHeadersAndBody(): void
186+
{
187+
$cypher = 'MATCH (n) RETURN n';
188+
$parameters = ['param1' => 'value1'];
189+
$database = 'neo4j';
190+
$uri = "{$this->address}/db/{$database}/query/v2";
191+
192+
$payload = json_encode([
193+
'statement' => $cypher,
194+
'parameters' => $parameters,
195+
'includeCounters' => true,
196+
]);
197+
198+
$mockStream = Utils::streamFor($payload);
199+
$this->streamFactory->method('createStream')
200+
->willReturn($mockStream);
201+
202+
$mockRequest = new Request('POST', $uri);
203+
$this->psr17Factory->method('createRequest')
204+
->willReturn($mockRequest);
205+
206+
$factory = new Neo4jRequestFactory(
207+
$this->psr17Factory,
208+
$this->streamFactory,
209+
new Configuration($this->address),
210+
Authentication::fromEnvironment(),
211+
);
212+
213+
$request = $factory->buildRunQueryRequest($cypher, $parameters);
214+
215+
$this->assertEquals('application/json', $request->getHeaderLine('Content-Type'));
216+
$this->assertEquals('application/vnd.neo4j.query', $request->getHeaderLine('Accept'));
217+
$this->assertEquals($this->authHeader, $request->getHeaderLine('Authorization'));
218+
$payload = json_encode([]);
219+
if ($payload === false) {
220+
throw new RuntimeException('JSON encoding failed: ' . json_last_error_msg());
221+
}
222+
223+
}
224+
225+
/**
226+
* Test createRequest without Authorization header
227+
*/
228+
public function testCreateRequestWithoutAuthorizationHeader(): void
229+
{
230+
$cypher = 'MATCH (n) RETURN n';
231+
$parameters = ['param1' => 'value1'];
232+
$database = 'neo4j';
233+
$uri = "{$this->address}/db/{$database}/query/v2";
234+
235+
$payload = json_encode([
236+
'statement' => $cypher,
237+
'parameters' => $parameters,
238+
'includeCounters' => true,
239+
]);
240+
241+
$mockStream = Utils::streamFor($payload);
242+
$this->streamFactory->method('createStream')
243+
->willReturn($mockStream);
244+
245+
$mockRequest = new Request('POST', $uri);
246+
$this->psr17Factory->method('createRequest')
247+
->willReturn($mockRequest);
248+
249+
$factory = new Neo4jRequestFactory(
250+
$this->psr17Factory,
251+
$this->streamFactory,
252+
new Configuration($this->address),
253+
Authentication::noAuth(),
254+
);
255+
256+
$request = $factory->buildRunQueryRequest($cypher, $parameters);
257+
$this->assertEquals('application/json', $request->getHeaderLine('Content-Type'));
258+
$this->assertEquals('application/vnd.neo4j.query', $request->getHeaderLine('Accept'));
259+
$this->assertEmpty($request->getHeaderLine('Authorization'));
260+
$payload = json_encode([]);
261+
if ($payload === false) {
262+
throw new RuntimeException('JSON encoding failed: ' . json_last_error_msg());
263+
}
264+
}
265+
}

0 commit comments

Comments
 (0)