Skip to content

Commit d4969f5

Browse files
committed
add test for pool
Signed-off-by: Lukas Schaefer <[email protected]>
1 parent e62c72d commit d4969f5

File tree

3 files changed

+136
-2
lines changed

3 files changed

+136
-2
lines changed

lib/Service/QuotaRuleService.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ public function getRule(int $quotaType, string $userId) {
4848
'pool' => false,
4949
'id' => null,
5050
];
51-
$cache->set($cacheKey, $rule);
52-
return $rule;
5351
}
5452
$cache->set($cacheKey, $rule);
5553
}

tests/unit/Providers/OpenAiProviderTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use OCA\OpenAi\Service\ChunkService;
1818
use OCA\OpenAi\Service\OpenAiAPIService;
1919
use OCA\OpenAi\Service\OpenAiSettingsService;
20+
use OCA\OpenAi\Service\QuotaRuleService;
2021
use OCA\OpenAi\TaskProcessing\ChangeToneProvider;
2122
use OCA\OpenAi\TaskProcessing\EmojiProvider;
2223
use OCA\OpenAi\TaskProcessing\HeadlineProvider;
@@ -82,6 +83,7 @@ protected function setUp(): void {
8283
\OC::$server->get(ICacheFactory::class),
8384
\OC::$server->get(QuotaUsageMapper::class),
8485
$this->openAiSettingsService,
86+
\OC::$server->get(QuotaRuleService::class),
8587
$clientService,
8688
);
8789

tests/unit/Quota/QuotaTest.php

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
<?php
2+
3+
/**
4+
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
5+
* SPDX-License-Identifier: AGPL-3.0-or-later
6+
*
7+
*
8+
* This unit test is designed to test the pool quota functionality
9+
*/
10+
11+
namespace OCA\OpenAi\Tests\Unit\Quota;
12+
13+
use Exception;
14+
use OC;
15+
use OCA\OpenAi\AppInfo\Application;
16+
use OCA\OpenAi\Db\QuotaUsageMapper;
17+
use OCA\OpenAi\Service\OpenAiAPIService;
18+
use OCA\OpenAi\Service\OpenAiSettingsService;
19+
use OCA\OpenAi\Service\QuotaRuleService;
20+
use OCP\Http\Client\IClientService;
21+
use OCP\IAppConfig;
22+
use OCP\ICacheFactory;
23+
use OCP\IL10N;
24+
use OCP\IUserManager;
25+
use PHPUnit\Framework\MockObject\MockObject;
26+
use Psr\Log\LoggerInterface;
27+
use RuntimeException;
28+
use Test\TestCase;
29+
use Test\Util\User\Dummy;
30+
use Throwable;
31+
32+
/**
33+
* @group DB
34+
*/
35+
class QuotaTest extends TestCase {
36+
public const APP_NAME = 'integration_openai';
37+
public const TEST_USER1 = 'testuser1';
38+
public const TEST_USER2 = 'testuser2';
39+
40+
private OpenAiAPIService $openAiApiService;
41+
private OpenAiSettingsService $openAiSettingsService;
42+
/**
43+
* @var MockObject|ICacheFactory
44+
*/
45+
private $cacheFactory;
46+
private QuotaUsageMapper $quotaUsageMapper;
47+
private QuotaRuleService $quotaRuleService;
48+
49+
public static function setUpBeforeClass(): void {
50+
parent::setUpBeforeClass();
51+
$backend = new Dummy();
52+
$backend->createUser(self::TEST_USER1, self::TEST_USER1);
53+
$backend->createUser(self::TEST_USER2, self::TEST_USER2);
54+
OC::$server->get(IUserManager::class)->registerBackend($backend);
55+
}
56+
57+
protected function setUp(): void {
58+
parent::setUp();
59+
60+
$this->loginAsUser(self::TEST_USER1);
61+
62+
$this->openAiSettingsService = OC::$server->get(OpenAiSettingsService::class);
63+
64+
$this->quotaUsageMapper = OC::$server->get(QuotaUsageMapper::class);
65+
66+
$this->cacheFactory = $this->createMock(ICacheFactory::class);
67+
68+
$this->quotaRuleService = OC::$server->get(QuotaRuleService::class);
69+
70+
71+
$this->openAiApiService = new OpenAiAPIService(
72+
OC::$server->get(LoggerInterface::class),
73+
$this->createMock(IL10N::class),
74+
OC::$server->get(IAppConfig::class),
75+
$this->cacheFactory,
76+
OC::$server->get(QuotaUsageMapper::class),
77+
$this->openAiSettingsService,
78+
\OC::$server->get(QuotaRuleService::class),
79+
OC::$server->get(IClientService::class),
80+
);
81+
}
82+
83+
public static function tearDownAfterClass(): void {
84+
// Delete quota usage for test user
85+
$quotaUsageMapper = OC::$server->get(QuotaUsageMapper::class);
86+
try {
87+
$quotaUsageMapper->deleteUserQuotaUsages(self::TEST_USER1);
88+
} catch (\OCP\Db\Exception|RuntimeException|Exception|Throwable $e) {
89+
// Ignore
90+
}
91+
$rules = OC::$server->get(QuotaRuleService::class)->getRules();
92+
foreach ($rules as $rule) {
93+
OC::$server->get(QuotaRuleService::class)->deleteRule($rule['id']);
94+
}
95+
96+
$backend = new Dummy();
97+
$backend->deleteUser(self::TEST_USER1);
98+
$backend->deleteUser(self::TEST_USER2);
99+
OC::$server->get(IUserManager::class)->removeBackend($backend);
100+
101+
parent::tearDownAfterClass();
102+
}
103+
104+
public function testQuotaPool(): void {
105+
// Create a quota rule for both test users as a pool
106+
$this->openAiSettingsService->setQuotas([1000, 1, 1, 1]);
107+
$rule = $this->quotaRuleService->addRule();
108+
$rule['type'] = Application::QUOTA_TYPE_TEXT;
109+
$rule['amount'] = 10;
110+
$rule['pool'] = true;
111+
$rule['entities'] = [
112+
[
113+
'entity_id' => self::TEST_USER1,
114+
'entity_type' => 'user',
115+
],
116+
[
117+
'entity_id' => self::TEST_USER2,
118+
'entity_type' => 'user',
119+
]
120+
];
121+
$this->quotaRuleService->updateRule($rule['id'], $rule);
122+
123+
$this->assertFalse($this->openAiApiService->isQuotaExceeded(self::TEST_USER1, Application::QUOTA_TYPE_TEXT));
124+
$this->quotaUsageMapper->createQuotaUsage(self::TEST_USER1, Application::QUOTA_TYPE_TEXT, 100, $rule['id']);
125+
126+
$this->assertTrue($this->openAiApiService->isQuotaExceeded(self::TEST_USER1, Application::QUOTA_TYPE_TEXT));
127+
// Check other user
128+
$this->assertTrue($this->openAiApiService->isQuotaExceeded(self::TEST_USER2, Application::QUOTA_TYPE_TEXT));
129+
// Clear quota usage
130+
$this->quotaUsageMapper->deleteUserQuotaUsages(self::TEST_USER1);
131+
$this->quotaUsageMapper->deleteUserQuotaUsages(self::TEST_USER2);
132+
}
133+
134+
}

0 commit comments

Comments
 (0)