Skip to content

Commit c468f3a

Browse files
committed
test: add unit tests for signature flow feature
Add comprehensive unit tests for the signature flow implementation. - SequentialSigningServiceTest: Test flow detection and order assignment - FileTest: Test enum conversion methods in File entity - RequestSignatureServiceTest: Fix constructor to include IAppConfig mock Tests validate the core logic without focusing on coverage metrics. Signed-off-by: Vitor Mattos <[email protected]>
1 parent d38d3c0 commit c468f3a

5 files changed

Lines changed: 170 additions & 3 deletions

File tree

src/types/openapi/openapi-full.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1757,6 +1757,8 @@ export type components = {
17571757
/** Format: int64 */
17581758
nodeId: number;
17591759
/** Format: int64 */
1760+
signatureFlow: number;
1761+
/** Format: int64 */
17601762
totalPages: number;
17611763
/** Format: int64 */
17621764
size: number;

src/types/openapi/openapi.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,6 +1279,8 @@ export type components = {
12791279
/** Format: int64 */
12801280
nodeId: number;
12811281
/** Format: int64 */
1282+
signatureFlow: number;
1283+
/** Format: int64 */
12821284
totalPages: number;
12831285
/** Format: int64 */
12841286
size: number;

tests/php/Unit/Db/FileTest.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
/**
5+
* SPDX-FileCopyrightText: 2025 LibreCode coop and contributors
6+
* SPDX-License-Identifier: AGPL-3.0-or-later
7+
*/
8+
9+
namespace OCA\Libresign\Tests\Unit\Db;
10+
11+
use OCA\Libresign\Db\File;
12+
use OCA\Libresign\Enum\SignatureFlow;
13+
use OCA\Libresign\Tests\Unit\TestCase;
14+
15+
final class FileTest extends TestCase {
16+
private File $file;
17+
18+
public function setUp(): void {
19+
parent::setUp();
20+
$this->file = new File();
21+
}
22+
23+
public function testGetSignatureFlowEnumConvertsFromInt(): void {
24+
$this->file->setSignatureFlow(1);
25+
$this->assertEquals(SignatureFlow::PARALLEL, $this->file->getSignatureFlowEnum());
26+
27+
$this->file->setSignatureFlow(2);
28+
$this->assertEquals(SignatureFlow::ORDERED_NUMERIC, $this->file->getSignatureFlowEnum());
29+
}
30+
31+
public function testSetSignatureFlowEnumConvertsToInt(): void {
32+
$this->file->setSignatureFlowEnum(SignatureFlow::PARALLEL);
33+
$this->assertEquals(1, $this->file->getSignatureFlow());
34+
35+
$this->file->setSignatureFlowEnum(SignatureFlow::ORDERED_NUMERIC);
36+
$this->assertEquals(2, $this->file->getSignatureFlow());
37+
}
38+
}

tests/php/Unit/Service/RequestSignatureServiceTest.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@
1818
use OCA\Libresign\Service\IdentifyMethodService;
1919
use OCA\Libresign\Service\PdfParserService;
2020
use OCA\Libresign\Service\RequestSignatureService;
21+
use OCA\Libresign\Service\SequentialSigningService;
2122
use OCP\Files\IMimeTypeDetector;
2223
use OCP\Http\Client\IClient;
2324
use OCP\Http\Client\IClientService;
2425
use OCP\Http\Client\IResponse;
26+
use OCP\IAppConfig;
2527
use OCP\IL10N;
2628
use OCP\IUser;
2729
use OCP\IUserManager;
@@ -46,7 +48,8 @@ final class RequestSignatureServiceTest extends \OCA\Libresign\Tests\Unit\TestCa
4648
private IClientService&MockObject $client;
4749
private DocMdpHandler&MockObject $docMdpHandler;
4850
private LoggerInterface&MockObject $loggerInterface;
49-
private \OCA\Libresign\Service\SequentialSigningService&MockObject $sequentialSigningService;
51+
private SequentialSigningService&MockObject $sequentialSigningService;
52+
private IAppConfig&MockObject $appConfig;
5053

5154
public function setUp(): void {
5255
parent::setUp();
@@ -71,7 +74,8 @@ public function setUp(): void {
7174
$this->client = $this->createMock(IClientService::class);
7275
$this->docMdpHandler = $this->createMock(DocMdpHandler::class);
7376
$this->loggerInterface = $this->createMock(LoggerInterface::class);
74-
$this->sequentialSigningService = $this->createMock(\OCA\Libresign\Service\SequentialSigningService::class);
77+
$this->sequentialSigningService = $this->createMock(SequentialSigningService::class);
78+
$this->appConfig = $this->createMock(IAppConfig::class);
7579
}
7680

7781
private function getService(): RequestSignatureService {
@@ -91,7 +95,8 @@ private function getService(): RequestSignatureService {
9195
$this->client,
9296
$this->docMdpHandler,
9397
$this->loggerInterface,
94-
$this->sequentialSigningService
98+
$this->sequentialSigningService,
99+
$this->appConfig,
95100
);
96101
}
97102

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
/**
5+
* SPDX-FileCopyrightText: 2025 LibreCode coop and contributors
6+
* SPDX-License-Identifier: AGPL-3.0-or-later
7+
*/
8+
9+
namespace OCA\Libresign\Tests\Unit\Service;
10+
11+
use OCA\Libresign\Db\File as FileEntity;
12+
use OCA\Libresign\Db\SignRequestMapper;
13+
use OCA\Libresign\Enum\SignatureFlow;
14+
use OCA\Libresign\Service\IdentifyMethodService;
15+
use OCA\Libresign\Service\SequentialSigningService;
16+
use OCA\Libresign\Tests\Unit\TestCase;
17+
use OCP\IAppConfig;
18+
use PHPUnit\Framework\Attributes\DataProvider;
19+
use PHPUnit\Framework\MockObject\MockObject;
20+
21+
final class SequentialSigningServiceTest extends TestCase {
22+
private IAppConfig&MockObject $appConfig;
23+
private SignRequestMapper&MockObject $signRequestMapper;
24+
private IdentifyMethodService&MockObject $identifyMethodService;
25+
private SequentialSigningService $service;
26+
27+
public function setUp(): void {
28+
parent::setUp();
29+
$this->appConfig = $this->createMock(IAppConfig::class);
30+
$this->signRequestMapper = $this->createMock(SignRequestMapper::class);
31+
$this->identifyMethodService = $this->createMock(IdentifyMethodService::class);
32+
33+
$this->service = new SequentialSigningService(
34+
$this->appConfig,
35+
$this->signRequestMapper,
36+
$this->identifyMethodService
37+
);
38+
}
39+
40+
public function testIsOrderedNumericFlowThrowsExceptionWhenFileNotSet(): void {
41+
$this->expectException(\LogicException::class);
42+
$this->expectExceptionMessage('File must be set before calling getSignatureFlow(). Call setFile() first.');
43+
44+
$this->service->isOrderedNumericFlow();
45+
}
46+
47+
public static function signatureFlowProvider(): array {
48+
return [
49+
'parallel flow' => [SignatureFlow::PARALLEL, false],
50+
'ordered numeric flow' => [SignatureFlow::ORDERED_NUMERIC, true],
51+
];
52+
}
53+
54+
#[DataProvider('signatureFlowProvider')]
55+
public function testIsOrderedNumericFlow(SignatureFlow $flow, bool $expected): void {
56+
$file = $this->createMock(FileEntity::class);
57+
$file->method('getSignatureFlowEnum')
58+
->willReturn($flow);
59+
60+
$this->service->setFile($file);
61+
62+
$this->assertSame($expected, $this->service->isOrderedNumericFlow());
63+
}
64+
65+
public static function parallelOrderProvider(): array {
66+
return [
67+
'always returns 1' => [[null, null, 5], [1, 1, 1]],
68+
];
69+
}
70+
71+
public static function orderedNumericOrderProvider(): array {
72+
return [
73+
'auto-increment' => [[null, null, null], [1, 2, 3]],
74+
'user-provided order jumps' => [[null, 5, null], [1, 5, 6]],
75+
];
76+
}
77+
78+
#[DataProvider('parallelOrderProvider')]
79+
public function testDetermineSigningOrderParallel(array $inputs, array $expected): void {
80+
$file = $this->createMock(FileEntity::class);
81+
$file->method('getSignatureFlowEnum')
82+
->willReturn(SignatureFlow::PARALLEL);
83+
84+
$this->service->setFile($file);
85+
$this->service->resetOrderCounter();
86+
87+
foreach ($inputs as $index => $input) {
88+
$this->assertEquals($expected[$index], $this->service->determineSigningOrder($input));
89+
}
90+
}
91+
92+
#[DataProvider('orderedNumericOrderProvider')]
93+
public function testDetermineSigningOrderOrderedNumeric(array $inputs, array $expected): void {
94+
$file = $this->createMock(FileEntity::class);
95+
$file->method('getSignatureFlowEnum')
96+
->willReturn(SignatureFlow::ORDERED_NUMERIC);
97+
98+
$this->service->setFile($file);
99+
$this->service->resetOrderCounter();
100+
101+
foreach ($inputs as $index => $input) {
102+
$this->assertEquals($expected[$index], $this->service->determineSigningOrder($input));
103+
}
104+
}
105+
106+
public function testResetOrderCounter(): void {
107+
$file = $this->createMock(FileEntity::class);
108+
$file->method('getSignatureFlowEnum')
109+
->willReturn(SignatureFlow::ORDERED_NUMERIC);
110+
111+
$this->service->setFile($file);
112+
113+
$this->assertEquals(1, $this->service->determineSigningOrder(null));
114+
$this->assertEquals(2, $this->service->determineSigningOrder(null));
115+
116+
$this->service->resetOrderCounter();
117+
118+
$this->assertEquals(1, $this->service->determineSigningOrder(null));
119+
}
120+
}

0 commit comments

Comments
 (0)