mirror of
https://github.com/FOSSBilling/FOSSBilling.git
synced 2026-11-09 13:36:07 +09:00
1186 lines
38 KiB
PHP
1186 lines
38 KiB
PHP
<?php
|
|
|
|
namespace Box\Tests\Mod\Client;
|
|
|
|
class ServiceTest extends \BBTestCase
|
|
{
|
|
public function testgetDi()
|
|
{
|
|
$di = new \Pimple\Container();
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
$getDi = $service->getDi();
|
|
$this->assertEquals($di, $getDi);
|
|
}
|
|
|
|
public function testapproveClientEmailByHash()
|
|
{
|
|
$database = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$database->expects($this->atLeastOnce())
|
|
->method('getRow')->willReturn(['client_id' => 2, 'id' => 1]);
|
|
|
|
$database->expects($this->atLeastOnce())->method('exec');
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $database;
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$clientService->setDi($di);
|
|
$result = $clientService->approveClientEmailByHash('');
|
|
|
|
$this->assertTrue($result);
|
|
}
|
|
|
|
public function testapproveClientEmailByHashException()
|
|
{
|
|
$database = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$database->expects($this->atLeastOnce())
|
|
->method('getRow')->willReturn([]);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $database;
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$clientService->setDi($di);
|
|
|
|
$this->expectException(\FOSSBilling\Exception::class);
|
|
$this->expectExceptionMessage('Invalid email confirmation link');
|
|
$clientService->approveClientEmailByHash('');
|
|
}
|
|
|
|
public function testgenerateEmailConfirmationLink()
|
|
{
|
|
$model = new \Model_ExtensionMeta();
|
|
$model->loadBean(new \DummyBean());
|
|
|
|
$database = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$database->expects($this->atLeastOnce())
|
|
->method('dispense')->willReturn($model);
|
|
|
|
$database->expects($this->atLeastOnce())->method('store')
|
|
->willReturn(1);
|
|
|
|
$toolsMock = $this->getMockBuilder('\\' . \FOSSBilling\Tools::class)->getMock();
|
|
$toolsMock->expects($this->atLeastOnce())->method('url')
|
|
->willReturn('fossbilling.org/index.php/client/confirm-email/');
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $database;
|
|
$di['tools'] = $toolsMock;
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$clientService->setDi($di);
|
|
|
|
$client_id = 1;
|
|
$result = $clientService->generateEmailConfirmationLink($client_id);
|
|
|
|
$this->assertIsString($result);
|
|
$this->assertTrue(str_contains($result, '/client/confirm-email/'));
|
|
}
|
|
|
|
public function testonAfterClientSignUp()
|
|
{
|
|
$eventParams = [
|
|
'password' => 'testPassword',
|
|
'id' => 1,
|
|
];
|
|
|
|
$eventMock = $this->getMockBuilder('\Box_Event')->disableOriginalConstructor()->getMock();
|
|
$eventMock->expects($this->atLeastOnce())->
|
|
method('getParameters')->willReturn($eventParams);
|
|
|
|
$service = $this->getMockBuilder('\\' . \Box\Mod\Email\Service::class)->getMock();
|
|
$service->expects($this->atLeastOnce())
|
|
->method('sendTemplate')
|
|
->willReturn(true);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['mod_service'] = $di->protect(fn () => $service);
|
|
$di['mod_config'] = $di->protect(fn ($name) => ['require_email_confirmation' => false]);
|
|
|
|
$eventMock->expects($this->atLeastOnce())
|
|
->method('getDi')
|
|
->willReturn($di);
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$clientService->setDi($di);
|
|
$result = $clientService->onAfterClientSignUp($eventMock);
|
|
|
|
$this->assertTrue($result);
|
|
}
|
|
|
|
public function testRequireEmailConfirmonAfterClientSignUp()
|
|
{
|
|
$eventMock = $this->getMockBuilder('\Box_Event')->disableOriginalConstructor()->getMock();
|
|
$eventParams = [
|
|
'password' => 'testPassword',
|
|
'id' => 1,
|
|
'require_email_confirmation' => true,
|
|
];
|
|
|
|
$eventMock->expects($this->atLeastOnce())->
|
|
method('getParameters')->willReturn($eventParams);
|
|
|
|
$service = $this->getMockBuilder('\\' . \Box\Mod\Email\Service::class)->getMock();
|
|
$service->expects($this->atLeastOnce())
|
|
->method('sendTemplate')
|
|
->willReturn(true);
|
|
|
|
$clientServiceMock = $this->getMockBuilder('\\' . \Box\Mod\Client\Service::class)->onlyMethods(['generateEmailConfirmationLink'])->getMock();
|
|
$clientServiceMock->expects($this->atLeastOnce())->
|
|
method('generateEmailConfirmationLink')->willReturn('Link_string');
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['mod_service'] = $di->protect(function ($serviceName) use ($service, $clientServiceMock) {
|
|
if ($serviceName == 'email') {
|
|
return $service;
|
|
}
|
|
if ($serviceName == 'client') {
|
|
return $clientServiceMock;
|
|
}
|
|
});
|
|
$di['mod_config'] = $di->protect(fn ($name) => ['require_email_confirmation' => true]);
|
|
$eventMock->expects($this->atLeastOnce())
|
|
->method('getDi')
|
|
->willReturn($di);
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$result = $clientService->onAfterClientSignUp($eventMock);
|
|
|
|
$this->assertTrue($result);
|
|
}
|
|
|
|
public function testExceptiononAfterClientSignUp()
|
|
{
|
|
$eventParams = [
|
|
'password' => 'testPassword',
|
|
'id' => 1,
|
|
];
|
|
|
|
$eventMock = $this->getMockBuilder('\Box_Event')->disableOriginalConstructor()->getMock();
|
|
$eventMock->expects($this->atLeastOnce())->
|
|
method('getParameters')->willReturn($eventParams);
|
|
|
|
$service = $this->getMockBuilder('\\' . \Box\Mod\Email\Service::class)->getMock();
|
|
$service->expects($this->atLeastOnce())->
|
|
method('sendTemplate')->will($this->throwException(new \Exception('exception created in unit test')));
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['mod_service'] = $di->protect(fn () => $service);
|
|
$di['mod_config'] = $di->protect(function ($name) {
|
|
['require_email_confirmation' => false];
|
|
});
|
|
$eventMock->expects($this->atLeastOnce())
|
|
->method('getDi')
|
|
->willReturn($di);
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$clientService->setDi($di);
|
|
$result = $clientService->onAfterClientSignUp($eventMock);
|
|
|
|
$this->assertTrue($result);
|
|
}
|
|
|
|
public static function searchQueryData()
|
|
{
|
|
return [
|
|
[[], 'SELECT c.*', []],
|
|
[
|
|
['id' => 1],
|
|
'c.id = :client_id or c.aid = :alt_client_id',
|
|
[':client_id' => '', ':alt_client_id' => ''],
|
|
],
|
|
[
|
|
['name' => 'test'],
|
|
'(c.first_name LIKE :first_name or c.last_name LIKE :last_name )',
|
|
[':first_name' => '', ':last_name' => ''],
|
|
],
|
|
[
|
|
['email' => 'test@example.com'],
|
|
'c.email LIKE :email',
|
|
[':email' => 'test@example.com'],
|
|
],
|
|
[
|
|
['company' => 'LTD company'],
|
|
'c.company LIKE :company',
|
|
[':company' => 'LTD company'],
|
|
],
|
|
[
|
|
['status' => 'TEST status'],
|
|
'c.status = :status',
|
|
[':status' => 'TEST status'],
|
|
],
|
|
[
|
|
['group_id' => '1'],
|
|
'c.client_group_id = :group_id',
|
|
[':group_id' => '1'],
|
|
],
|
|
[
|
|
['created_at' => '2012-12-12'],
|
|
"DATE_FORMAT(c.created_at, '%Y-%m-%d') = :created_at",
|
|
[':created_at' => '2012-12-12'],
|
|
],
|
|
[
|
|
['date_from' => '2012-12-10'],
|
|
'UNIX_TIMESTAMP(c.created_at) >= :date_from',
|
|
[':date_from' => '2012-12-10'],
|
|
],
|
|
[
|
|
['date_to' => '2012-12-11'],
|
|
'UNIX_TIMESTAMP(c.created_at) <= :date_from',
|
|
[':date_to' => '2012-12-11'],
|
|
],
|
|
[
|
|
['search' => '2'],
|
|
'c.id = :cid or c.aid = :caid',
|
|
[':cid' => '2', ':caid' => '2'],
|
|
],
|
|
[
|
|
['search' => 'Keyword'],
|
|
"c.company LIKE :s_company OR c.first_name LIKE :s_first_time OR c.last_name LIKE :s_last_name OR c.email LIKE :s_email OR CONCAT(c.first_name, ' ', c.last_name ) LIKE :full_name",
|
|
[':s_company' => 'Keyword',
|
|
':s_first_time' => 'Keyword',
|
|
':s_last_name' => 'Keyword',
|
|
':s_email' => 'Keyword',
|
|
':full_name' => 'Keyword',
|
|
],
|
|
],
|
|
];
|
|
}
|
|
|
|
#[\PHPUnit\Framework\Attributes\DataProvider('searchQueryData')]
|
|
public function testgetSearchQuery($data, $expectedStr, $expectedParams)
|
|
{
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$result = $clientService->getSearchQuery($data);
|
|
$this->assertIsString($result[0]);
|
|
$this->assertIsArray($result[1]);
|
|
|
|
$this->assertTrue(str_contains($result[0], $expectedStr), $result[0]);
|
|
$this->assertTrue(array_diff_key($result[1], $expectedParams) == []);
|
|
}
|
|
|
|
public function testgetSearchQueryChangeSelect()
|
|
{
|
|
$data = [];
|
|
$selectStmt = 'c.id, CONCAT(c.first_name, c.last_name) as full_name';
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$result = $clientService->getSearchQuery($data, $selectStmt);
|
|
$this->assertIsString($result[0]);
|
|
$this->assertIsArray($result[1]);
|
|
|
|
$this->assertTrue(str_contains($result[0], $selectStmt), $result[0]);
|
|
}
|
|
|
|
public function testgetPairs()
|
|
{
|
|
$data = [];
|
|
|
|
$database = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$database->expects($this->atLeastOnce())->method('getAssoc')
|
|
->willReturn([]);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $database;
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$clientService->setDi($di);
|
|
$result = $clientService->getPairs($data);
|
|
$this->assertIsArray($result);
|
|
}
|
|
|
|
public function testtoSessionArray()
|
|
{
|
|
$expectedArrayKeys = [
|
|
'id' => 1,
|
|
'email' => 'email@example.com',
|
|
'name' => 'John Smith',
|
|
'role' => 'admin',
|
|
];
|
|
|
|
$model = new \Model_Client();
|
|
$model->loadBean(new \DummyBean());
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$result = $clientService->toSessionArray($model);
|
|
|
|
$this->assertIsArray($result);
|
|
$this->assertTrue(array_diff_key($result, $expectedArrayKeys) == []);
|
|
}
|
|
|
|
public function testemailAlreadyRegistered()
|
|
{
|
|
$email = 'test@example.com';
|
|
$model = new \Model_Client();
|
|
$model->loadBean(new \DummyBean());
|
|
$database = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$database->expects($this->atLeastOnce())->method('findOne')
|
|
->willReturn($model);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $database;
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$clientService->setDi($di);
|
|
|
|
$result = $clientService->emailAlreadyRegistered($email);
|
|
$this->assertIsBool($result);
|
|
}
|
|
|
|
public function testEmailAlreadyRegWithModel()
|
|
{
|
|
$email = 'test@example.com';
|
|
$model = new \Model_Client();
|
|
$model->loadBean(new \DummyBean());
|
|
$model->email = $email;
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
|
|
$result = $clientService->emailAlreadyRegistered($email, $model);
|
|
$this->assertIsBool($result);
|
|
$this->assertFalse($result);
|
|
}
|
|
|
|
public function testcanChangeCurrency()
|
|
{
|
|
$currency = 'EUR';
|
|
$model = new \Model_Client();
|
|
$model->loadBean(new \DummyBean());
|
|
$model->currency = 'USD';
|
|
|
|
$database = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$database->expects($this->atLeastOnce())->method('findOne')
|
|
->willReturn(null);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $database;
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$clientService->setDi($di);
|
|
$result = $clientService->canChangeCurrency($model, $currency);
|
|
$this->assertIsBool($result);
|
|
$this->assertTrue($result);
|
|
}
|
|
|
|
public function testcanChangeCurrencyModelCurrencyNotSet()
|
|
{
|
|
$currency = 'EUR';
|
|
$model = new \Model_Client();
|
|
$model->loadBean(new \DummyBean());
|
|
|
|
$database = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$database->expects($this->never())->method('findOne');
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
|
|
$result = $clientService->canChangeCurrency($model, $currency);
|
|
$this->assertIsBool($result);
|
|
$this->assertTrue($result);
|
|
}
|
|
|
|
public function testcanChangeCurrencyIdenticalCurrencies()
|
|
{
|
|
$currency = 'EUR';
|
|
$model = new \Model_Client();
|
|
$model->loadBean(new \DummyBean());
|
|
$model->currency = $currency;
|
|
|
|
$database = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$database->expects($this->never())->method('findOne');
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
|
|
$result = $clientService->canChangeCurrency($model, $currency);
|
|
$this->assertIsBool($result);
|
|
$this->assertFalse($result);
|
|
}
|
|
|
|
public function testcanChangeCurrencyHasInvoice()
|
|
{
|
|
$currency = 'EUR';
|
|
$model = new \Model_Client();
|
|
$model->loadBean(new \DummyBean());
|
|
$model->id = random_int(1, 100);
|
|
$model->currency = 'USD';
|
|
|
|
$invoiceModel = new \Model_Invoice();
|
|
$invoiceModel->loadBean(new \DummyBean());
|
|
|
|
$database = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$database->expects($this->once())
|
|
->method('findOne')
|
|
->willReturn($invoiceModel);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $database;
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$clientService->setDi($di);
|
|
|
|
$this->expectException(\FOSSBilling\Exception::class);
|
|
$this->expectExceptionMessage('Currency cannot be changed. Client already has invoices issued.');
|
|
$clientService->canChangeCurrency($model, $currency);
|
|
}
|
|
|
|
public function testcanChangeCurrencyHasOrder()
|
|
{
|
|
$currency = 'EUR';
|
|
$model = new \Model_Client();
|
|
$model->loadBean(new \DummyBean());
|
|
$model->id = random_int(1, 100);
|
|
$model->currency = 'USD';
|
|
|
|
$clientOrderModel = new \Model_ClientOrder();
|
|
$clientOrderModel->loadBean(new \DummyBean());
|
|
|
|
$database = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$database->expects($this->exactly(2))->method('findOne')
|
|
->will($this->onConsecutiveCalls($this->returnValue(null)));
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $database;
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$clientService->setDi($di);
|
|
|
|
$clientService->canChangeCurrency($model, $currency);
|
|
}
|
|
|
|
public static function searchBalanceQueryData()
|
|
{
|
|
return [
|
|
[[], 'FROM client_balance as m', []],
|
|
[
|
|
['id' => 1],
|
|
'm.id = :id',
|
|
[':id' => '1'],
|
|
],
|
|
[
|
|
['client_id' => 1],
|
|
'm.client_id = :client_id',
|
|
[':client_id' => '1'],
|
|
],
|
|
[
|
|
['date_from' => '2012-12-10'],
|
|
'm.created_at >= :date_from',
|
|
[':date_from' => '2012-12-10'],
|
|
],
|
|
[
|
|
['date_to' => '2012-12-11'],
|
|
'm.created_at <= :date_to',
|
|
[':date_to' => '2012-12-11'],
|
|
],
|
|
];
|
|
}
|
|
|
|
#[\PHPUnit\Framework\Attributes\DataProvider('searchBalanceQueryData')]
|
|
public function testgetBalanceSearchQuery($data, $expectedStr, $expectedParams)
|
|
{
|
|
$di = new \Pimple\Container();
|
|
|
|
$clientBalanceService = new \Box\Mod\Client\ServiceBalance();
|
|
$clientBalanceService->setDi($di);
|
|
[$sql, $params] = $clientBalanceService->getSearchQuery($data);
|
|
$this->assertNotEmpty($sql);
|
|
$this->assertIsString($sql);
|
|
$this->assertIsArray($params);
|
|
|
|
$this->assertTrue(str_contains($sql, $expectedStr), $sql);
|
|
$this->assertTrue(array_diff_key($params, $expectedParams) == []);
|
|
}
|
|
|
|
public function testaddFunds()
|
|
{
|
|
$modelClient = new \Model_Client();
|
|
$modelClient->loadBean(new \DummyBean());
|
|
$modelClient->currency = 'USD';
|
|
|
|
$model = new \Model_ClientBalance();
|
|
$model->loadBean(new \DummyBean());
|
|
|
|
$amount = '2.22';
|
|
$description = 'test description';
|
|
|
|
$database = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$database->expects($this->atLeastOnce())->method('dispense')
|
|
->willReturn($model);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $database;
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$clientService->setDi($di);
|
|
|
|
$result = $clientService->addFunds($modelClient, $amount, $description);
|
|
$this->assertTrue($result);
|
|
}
|
|
|
|
public function testaddFundsCurrencyNotDefined()
|
|
{
|
|
$modelClient = new \Model_Client();
|
|
$modelClient->loadBean(new \DummyBean());
|
|
|
|
$amount = '2.22';
|
|
$description = 'test description';
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
|
|
$this->expectException(\FOSSBilling\Exception::class);
|
|
$this->expectExceptionMessage('You must define the client\'s currency before adding funds.');
|
|
$clientService->addFunds($modelClient, $amount, $description);
|
|
}
|
|
|
|
public function testaddFundsAmountMissing()
|
|
{
|
|
$modelClient = new \Model_Client();
|
|
$modelClient->loadBean(new \DummyBean());
|
|
$modelClient->currency = 'USD';
|
|
|
|
$amount = null;
|
|
$description = '';
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
|
|
$this->expectException(\FOSSBilling\Exception::class);
|
|
$this->expectExceptionMessage('Funds amount is invalid');
|
|
$clientService->addFunds($modelClient, $amount, $description);
|
|
}
|
|
|
|
public function testaddFundsInvalidDescription()
|
|
{
|
|
$modelClient = new \Model_Client();
|
|
$modelClient->loadBean(new \DummyBean());
|
|
$modelClient->currency = 'USD';
|
|
|
|
$amount = '2.22';
|
|
$description = null;
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
|
|
$this->expectException(\FOSSBilling\Exception::class);
|
|
$this->expectExceptionMessage('Funds description is invalid');
|
|
$result = $clientService->addFunds($modelClient, $amount, $description);
|
|
$this->assertTrue($result);
|
|
}
|
|
|
|
public function testgetExpiredPasswordReminders()
|
|
{
|
|
$database = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$database->expects($this->atLeastOnce())->method('find')
|
|
->willReturn([]);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $database;
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$clientService->setDi($di);
|
|
|
|
$result = $clientService->getExpiredPasswordReminders();
|
|
$this->assertIsArray($result);
|
|
}
|
|
|
|
public static function searchHistoryQueryData()
|
|
{
|
|
return [
|
|
[[], 'SELECT ach.*, c.first_name, c.last_name, c.email', []],
|
|
[
|
|
['search' => 'sameValue'],
|
|
'c.first_name LIKE :first_name OR c.last_name LIKE :last_name OR c.id LIKE :id',
|
|
[
|
|
':first_name' => '%sameValue%',
|
|
':last_name' => '%sameValue%',
|
|
':id' => 'sameValue'],
|
|
],
|
|
[
|
|
['client_id' => '1'],
|
|
'ach.client_id = :client_id',
|
|
[':client_id' => '1'],
|
|
],
|
|
];
|
|
}
|
|
|
|
#[\PHPUnit\Framework\Attributes\DataProvider('searchHistoryQueryData')]
|
|
public function testgetHistorySearchQuery($data, $expectedStr, $expectedParams)
|
|
{
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$di = new \Pimple\Container();
|
|
|
|
$clientService->setDi($di);
|
|
[$sql, $params] = $clientService->getHistorySearchQuery($data);
|
|
$this->assertNotEmpty($sql);
|
|
$this->assertIsString($sql);
|
|
$this->assertIsArray($params);
|
|
|
|
$this->assertTrue(str_contains($sql, $expectedStr), $sql);
|
|
$this->assertTrue(array_diff_key($params, $expectedParams) == []);
|
|
}
|
|
|
|
public function testcounter()
|
|
{
|
|
$database = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$database->expects($this->atLeastOnce())->method('getAssoc')
|
|
->willReturn([]);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $database;
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$clientService->setDi($di);
|
|
|
|
$result = $clientService->counter();
|
|
$this->assertIsArray($result);
|
|
|
|
$expected = [
|
|
'total' => 0,
|
|
\Model_Client::ACTIVE => 0,
|
|
\Model_Client::SUSPENDED => 0,
|
|
\Model_Client::CANCELED => 0,
|
|
];
|
|
}
|
|
|
|
public function testgetGroupPairs()
|
|
{
|
|
$database = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$database->expects($this->atLeastOnce())->method('getAssoc')
|
|
->willReturn([]);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $database;
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$clientService->setDi($di);
|
|
|
|
$result = $clientService->getGroupPairs();
|
|
$this->assertIsArray($result);
|
|
}
|
|
|
|
public function testclientAlreadyExists()
|
|
{
|
|
$model = new \Model_Client();
|
|
$model->loadBean(new \DummyBean());
|
|
$database = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$database->expects($this->atLeastOnce())->method('findOne')
|
|
->willReturn($model);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $database;
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$clientService->setDi($di);
|
|
|
|
$result = $clientService->clientAlreadyExists('email@example.com');
|
|
$this->assertTrue($result);
|
|
}
|
|
|
|
public function testgetByLoginDetails()
|
|
{
|
|
$model = new \Model_Client();
|
|
$model->loadBean(new \DummyBean());
|
|
$database = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$database->expects($this->atLeastOnce())->method('findOne')
|
|
->willReturn($model);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $database;
|
|
|
|
$clientService = new \Box\Mod\Client\Service();
|
|
$clientService->setDi($di);
|
|
|
|
$result = $clientService->getByLoginDetails('email@example.com', 'password');
|
|
$this->assertInstanceOf('\Model_Client', $result);
|
|
}
|
|
|
|
public static function getProvider()
|
|
{
|
|
return [
|
|
['id', 1],
|
|
['email', 'test@email.com'],
|
|
];
|
|
}
|
|
|
|
#[\PHPUnit\Framework\Attributes\DataProvider('getProvider')]
|
|
public function testget($fieldName, $fieldValue)
|
|
{
|
|
$model = new \Model_Client();
|
|
$model->loadBean(new \DummyBean());
|
|
|
|
$dbMock = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$dbMock->expects($this->atLeastOnce())
|
|
->method('findOne')->willReturn($model);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $dbMock;
|
|
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
|
|
$data = [$fieldName => $fieldValue];
|
|
$result = $service->get($data);
|
|
$this->assertInstanceOf('\Model_Client', $result);
|
|
}
|
|
|
|
public function testgetClientNotFound()
|
|
{
|
|
$dbMock = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$dbMock->expects($this->atLeastOnce())
|
|
->method('findOne')->willReturn([]);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $dbMock;
|
|
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
|
|
$data = ['id' => 0];
|
|
$this->expectException(\FOSSBilling\Exception::class);
|
|
$this->expectExceptionMessage('Client not found');
|
|
$service->get($data);
|
|
}
|
|
|
|
public function testgetClientBalance()
|
|
{
|
|
$model = new \Model_Client();
|
|
$model->loadBean(new \DummyBean());
|
|
|
|
$dbMock = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$dbMock->expects($this->atLeastOnce())
|
|
->method('getCell')->willReturn(1.0);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $dbMock;
|
|
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
|
|
$result = $service->getClientBalance($model);
|
|
$this->assertIsNumeric($result);
|
|
}
|
|
|
|
public function testtoApiArray()
|
|
{
|
|
$model = new \Model_Client();
|
|
$model->loadBean(new \DummyBean());
|
|
$model->custom_1 = 'custom field';
|
|
|
|
$clientGroup = new \Model_ClientGroup();
|
|
$clientGroup->loadBean(new \DummyBean());
|
|
$clientGroup->title = 'Group Title';
|
|
|
|
$dbMock = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$dbMock->expects($this->atLeastOnce())
|
|
->method('toArray')->willReturn([]);
|
|
$dbMock->expects($this->atLeastOnce())
|
|
->method('load')->willReturn($clientGroup);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $dbMock;
|
|
|
|
$serviceMock = $this->getMockBuilder('\\' . \Box\Mod\Client\Service::class)
|
|
->onlyMethods(['getClientBalance'])
|
|
->getMock();
|
|
$serviceMock->expects($this->atLeastOnce())
|
|
->method('getClientBalance');
|
|
|
|
$serviceMock->setDi($di);
|
|
|
|
$result = $serviceMock->toApiArray($model, true, new \Model_Admin());
|
|
$this->assertIsArray($result);
|
|
}
|
|
|
|
public static function testIsClientTaxableProvider()
|
|
{
|
|
$self = new ServiceTest('ServiceTest');
|
|
$self->assertTrue(true);
|
|
|
|
return [
|
|
[
|
|
false,
|
|
false,
|
|
false,
|
|
],
|
|
[
|
|
true,
|
|
true,
|
|
false,
|
|
],
|
|
[
|
|
true,
|
|
false,
|
|
true,
|
|
],
|
|
];
|
|
}
|
|
|
|
#[\PHPUnit\Framework\Attributes\DataProvider('testIsClientTaxableProvider')]
|
|
public function testIsClientTaxable($getParamValueReturn, $tax_exempt, $expected)
|
|
{
|
|
$service = $this->getMockBuilder('\\' . \Box\Mod\System\Service::class)->getMock();
|
|
$service->expects($this->atLeastOnce())
|
|
->method('getParamValue')
|
|
->willReturn($getParamValueReturn);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['mod_service'] = $di->protect(fn () => $service);
|
|
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
|
|
$client = new \Model_Client();
|
|
$client->loadBean(new \DummyBean());
|
|
$client->tax_exempt = $tax_exempt;
|
|
|
|
$result = $service->isClientTaxable($client);
|
|
$this->assertEquals($expected, $result);
|
|
}
|
|
|
|
public function testadminCreateClient()
|
|
{
|
|
$clientModel = new \Model_Client();
|
|
$clientModel->loadBean(new \DummyBean());
|
|
$clientModel->id = 1;
|
|
|
|
$data = [
|
|
'password' => uniqid(),
|
|
'email' => 'test@unit.vm',
|
|
'first_name' => 'test',
|
|
];
|
|
|
|
$dbMock = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$dbMock->expects($this->atLeastOnce())
|
|
->method('dispense')
|
|
->willReturn($clientModel);
|
|
$dbMock->expects($this->atLeastOnce())
|
|
->method('store');
|
|
|
|
$eventManagerMock = $this->getMockBuilder('\Box_EventManager')->getMock();
|
|
$eventManagerMock->expects($this->exactly(2))
|
|
->method('fire');
|
|
|
|
$passwordMock = $this->getMockBuilder('\Box_Password')->getMock();
|
|
$passwordMock->expects($this->atLeastOnce())
|
|
->method('hashIt')
|
|
->with($data['password']);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $dbMock;
|
|
$di['events_manager'] = $eventManagerMock;
|
|
$di['logger'] = new \Box_Log();
|
|
$di['password'] = $passwordMock;
|
|
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
|
|
$result = $service->adminCreateClient($data);
|
|
$this->assertIsInt($result);
|
|
}
|
|
|
|
public function testguestCreateClient()
|
|
{
|
|
$clientModel = new \Model_Client();
|
|
$clientModel->loadBean(new \DummyBean());
|
|
$clientModel->id = 1;
|
|
|
|
$data = [
|
|
'password' => uniqid(),
|
|
'email' => 'test@unit.vm',
|
|
'first_name' => 'test',
|
|
];
|
|
|
|
$dbMock = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$dbMock->expects($this->atLeastOnce())
|
|
->method('dispense')
|
|
->willReturn($clientModel);
|
|
$dbMock->expects($this->atLeastOnce())
|
|
->method('store');
|
|
|
|
$eventManagerMock = $this->getMockBuilder('\Box_EventManager')->getMock();
|
|
$eventManagerMock->expects($this->exactly(2))
|
|
->method('fire');
|
|
|
|
$requestMock = $this->getMockBuilder('\\' . \FOSSBilling\Request::class)->getMock();
|
|
$ip = '10.10.10.2';
|
|
$requestMock->expects($this->atLeastOnce())
|
|
->method('getClientAddress')
|
|
->willReturn($ip);
|
|
|
|
$passwordMock = $this->getMockBuilder('\Box_Password')->getMock();
|
|
$passwordMock->expects($this->atLeastOnce())
|
|
->method('hashIt')
|
|
->with($data['password']);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $dbMock;
|
|
$di['events_manager'] = $eventManagerMock;
|
|
$di['logger'] = new \Box_Log();
|
|
$di['request'] = $requestMock;
|
|
$di['password'] = $passwordMock;
|
|
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
|
|
$result = $service->guestCreateClient($data);
|
|
$this->assertInstanceOf('\Model_Client', $result);
|
|
$this->assertNotEquals($data['password'], $result->pass, 'Password is not hashed');
|
|
$this->assertEquals($ip, $result->ip, 'IP address is not saved while creating client');
|
|
}
|
|
|
|
public function testdeleteGroup()
|
|
{
|
|
$dbMock = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$dbMock->expects($this->atLeastOnce())
|
|
->method('findOne');
|
|
$dbMock->expects($this->once())
|
|
->method('trash');
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $dbMock;
|
|
$di['logger'] = new \Box_Log();
|
|
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
|
|
$model = new \Model_ClientGroup();
|
|
$model->loadBean(new \DummyBean());
|
|
$result = $service->deleteGroup($model);
|
|
$this->assertTrue($result);
|
|
}
|
|
|
|
public function testdeleteGroupGroupHasClients()
|
|
{
|
|
$clientModel = new \Model_Client();
|
|
$dbMock = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$dbMock->expects($this->atLeastOnce())
|
|
->method('findOne')
|
|
->willReturn($clientModel);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $dbMock;
|
|
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
|
|
$model = new \Model_ClientGroup();
|
|
$model->loadBean(new \DummyBean());
|
|
$this->expectException(\FOSSBilling\Exception::class);
|
|
$this->expectExceptionMessage('Cannot remove groups with clients');
|
|
$service->deleteGroup($model);
|
|
}
|
|
|
|
public function testauthorizeClientDidntFoundEmail()
|
|
{
|
|
$email = 'example@fossbilling.vm';
|
|
$password = '123456';
|
|
|
|
$dbMock = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$dbMock->expects($this->atLeastOnce())
|
|
->method('findOne')
|
|
->with('Client')
|
|
->willReturn(null);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $dbMock;
|
|
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
|
|
$result = $service->authorizeClient($email, $password);
|
|
$this->assertNull($result);
|
|
}
|
|
|
|
public function testauthorizeClient()
|
|
{
|
|
$email = 'example@fossbilling.vm';
|
|
$password = '123456';
|
|
|
|
$clientModel = new \Model_Client();
|
|
$clientModel->loadBean(new \DummyBean());
|
|
|
|
$dbMock = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$dbMock->expects($this->atLeastOnce())
|
|
->method('findOne')
|
|
->with('Client')
|
|
->willReturn($clientModel);
|
|
|
|
$authMock = $this->getMockBuilder('\Box_Authorization')->disableOriginalConstructor()->getMock();
|
|
$authMock->expects($this->atLeastOnce())
|
|
->method('authorizeUser')
|
|
->with($clientModel, $password)
|
|
->willReturn($clientModel);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $dbMock;
|
|
$di['auth'] = $authMock;
|
|
$di['mod_config'] = $di->protect(fn ($name) => ['require_email_confirmation' => false]);
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
|
|
$result = $service->authorizeClient($email, $password);
|
|
$this->assertInstanceOf('\Model_Client', $result);
|
|
}
|
|
|
|
public function testauthorizeClientEmailRequiredConfirmed()
|
|
{
|
|
$email = 'example@fossbilling.vm';
|
|
$password = '123456';
|
|
|
|
$clientModel = new \Model_Client();
|
|
$clientModel->loadBean(new \DummyBean());
|
|
$clientModel->email_approved = 1;
|
|
|
|
$dbMock = $this->getMockBuilder('\Box_Database')->getMock();
|
|
$dbMock->expects($this->atLeastOnce())
|
|
->method('findOne')
|
|
->with('Client')
|
|
->willReturn($clientModel);
|
|
|
|
$authMock = $this->getMockBuilder('\Box_Authorization')->disableOriginalConstructor()->getMock();
|
|
$authMock->expects($this->any())
|
|
->method('authorizeUser')
|
|
->with($clientModel, $password)
|
|
->willReturn($clientModel);
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['db'] = $dbMock;
|
|
$di['auth'] = $authMock;
|
|
$di['mod_config'] = $di->protect(fn ($name) => ['require_email_confirmation' => true]);
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
|
|
$result = $service->authorizeClient($email, $password);
|
|
$this->assertInstanceOf('\Model_Client', $result);
|
|
}
|
|
|
|
public function testcanChangeEmail()
|
|
{
|
|
$clientModel = new \Model_Client();
|
|
$clientModel->loadBean(new \DummyBean());
|
|
$email = 'client@fossbilling.org';
|
|
|
|
$config = [
|
|
'disable_change_email' => false,
|
|
];
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['mod_config'] = $di->protect(fn ($modName) => $config);
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
|
|
$result = $service->canChangeEmail($clientModel, $email);
|
|
$this->assertTrue($result);
|
|
}
|
|
|
|
public function testcanChangeEmailEmailAreTheSame()
|
|
{
|
|
$clientModel = new \Model_Client();
|
|
$clientModel->loadBean(new \DummyBean());
|
|
$email = 'client@fossbilling.org';
|
|
|
|
$clientModel->email = $email;
|
|
|
|
$config = [
|
|
'disable_change_email' => false,
|
|
];
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['mod_config'] = $di->protect(fn ($modName) => $config);
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
|
|
$result = $service->canChangeEmail($clientModel, $email);
|
|
$this->assertTrue($result);
|
|
}
|
|
|
|
public function testcanChangeEmailEmptyConfig()
|
|
{
|
|
$clientModel = new \Model_Client();
|
|
$clientModel->loadBean(new \DummyBean());
|
|
$email = 'client@fossbilling.org';
|
|
|
|
$config = [];
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['mod_config'] = $di->protect(fn ($modName) => $config);
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
|
|
$result = $service->canChangeEmail($clientModel, $email);
|
|
$this->assertTrue($result);
|
|
}
|
|
|
|
public function testcanChangeEmailCanntChangeEmail()
|
|
{
|
|
$clientModel = new \Model_Client();
|
|
$clientModel->loadBean(new \DummyBean());
|
|
$email = 'client@fossbilling.org';
|
|
|
|
$config = [
|
|
'disable_change_email' => true,
|
|
];
|
|
|
|
$di = new \Pimple\Container();
|
|
$di['mod_config'] = $di->protect(fn ($modName) => $config);
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
|
|
$this->expectException(\FOSSBilling\Exception::class);
|
|
$this->expectExceptionMessage('Email address cannot be changed');
|
|
$service->canChangeEmail($clientModel, $email);
|
|
}
|
|
|
|
public function testcheckExtraRequiredFields()
|
|
{
|
|
$required = ['id'];
|
|
$data = [];
|
|
|
|
$config['required'] = $required;
|
|
$di = new \Pimple\Container();
|
|
$di['mod_config'] = $di->protect(fn ($modName) => $config);
|
|
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
$this->expectException(\FOSSBilling\Exception::class);
|
|
$this->expectExceptionMessage('Field Id cannot be empty');
|
|
$service->checkExtraRequiredFields($data);
|
|
}
|
|
|
|
public function testcheckCustomFields()
|
|
{
|
|
$custom_field = [
|
|
'custom_field_name' => [
|
|
'active' => true,
|
|
'required' => true,
|
|
'title' => 'custom_field_title',
|
|
],
|
|
];
|
|
$config['custom_fields'] = $custom_field;
|
|
$di = new \Pimple\Container();
|
|
$di['mod_config'] = $di->protect(fn ($modName) => $config);
|
|
|
|
$data = [];
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
$this->expectException(\FOSSBilling\Exception::class);
|
|
$this->expectExceptionMessage('Field custom_field_title cannot be empty');
|
|
$service->checkCustomFields($data);
|
|
}
|
|
|
|
public function testcheckCustomFieldsNotRequired()
|
|
{
|
|
$custom_field = [
|
|
'custom_field_name' => [
|
|
'active' => true,
|
|
'required' => false,
|
|
'title' => 'custom_field_title',
|
|
],
|
|
];
|
|
$config['custom_fields'] = $custom_field;
|
|
$di = new \Pimple\Container();
|
|
$di['mod_config'] = $di->protect(fn ($modName) => $config);
|
|
|
|
$data = [];
|
|
$service = new \Box\Mod\Client\Service();
|
|
$service->setDi($di);
|
|
$result = $service->checkCustomFields($data);
|
|
$this->assertNull($result);
|
|
}
|
|
}
|