refactor(pay): 重构账户余额查询接口并添加单元测试

- 创建 RequestHeaderBuilder Trait 以简化请求头构建逻辑
- 在 AccountBalanceRepo 中使用 RequestHeaderBuilder Trait
- 添加 QueryPointBalanceTest 单元测试用例
This commit is contained in:
李东云
2025-08-18 14:23:14 +08:00
parent 336cb3a9b9
commit 4f0d402538
3 changed files with 66 additions and 31 deletions

View File

@@ -13,21 +13,20 @@ namespace Singularity\HDK\Pay\Infratracture\Repository;
use GuzzleHttp\RequestOptions;
use Hyperf\Codec\Json;
use Lmc\HttpConstants\Header;
use Singularity\HDK\Core\Http\RequestService;
use Singularity\HDK\Core\Http\RequestServiceFactory;
use Singularity\HDK\Core\I18n\Enum\Languages;
use Singularity\HDK\Pay\Domain\Account\Aggregate\AccountBalance;
use Singularity\HDK\Pay\Domain\Account\Aggregate\ValueObject\PointsBalance;
use Singularity\HDK\Pay\Domain\Account\Enum\PointType;
use Singularity\HDK\Pay\Domain\Account\Repository\AccountRepoInterface;
use Singularity\HDK\Pay\Enum\Environment;
use Singularity\HDK\Pay\Enum\Site;
use Singularity\HDK\Pay\Trait\RequestHeaderBuilder;
use function Hyperf\Config\config;
final class AccountBalanceRepo implements AccountRepoInterface
{
use RequestHeaderBuilder;
private RequestService $requestService;
public function __construct(?string $baseUrl = null)
@@ -43,22 +42,10 @@ final class AccountBalanceRepo implements AccountRepoInterface
$response = $this->requestService->requestGet(
url: "/rpc/v2/account/$uid/balance",
params: [
'type' => join(',', PointType::values())
'type' => join(',', PointType::values()),
],
options: [
'headers' => [
Header::CONTENT_TYPE => 'application/json',
Header::ACCEPT_LANGUAGE => $locale?->value ?? config('translation.locale', Languages::EN->value),
'X-SP-ID' => config('app_name'),
'X-SITE' => (match (strtoupper(config('site', Site::NorthAmerica->value))) {
'CN' => Site::ChinaMainland,
default => Site::NorthAmerica,
})->value,
'X-ENV' => (match (strtolower(config('app_env', Environment::Dev->value))) {
'prod', 'production' => Environment::Prod,
default => Environment::Dev,
})->value,
],
'headers' => $this->headerBuilder(),
],
);
@@ -87,19 +74,7 @@ final class AccountBalanceRepo implements AccountRepoInterface
$response = $this->requestService->requestGet(
url: "/rpc/v2/account/$uid/balance/$pointType->value",
options: [
'headers' => [
Header::CONTENT_TYPE => 'application/json',
Header::ACCEPT_LANGUAGE => $locale?->value ?? config('translation.locale', Languages::EN),
'X-SP-ID' => config('app_name'),
'X-SITE' => match (strtoupper(config('site', Site::NorthAmerica))) {
'CN' => Site::ChinaMainland,
default => Site::NorthAmerica,
},
'X-ENV' => match (strtolower(config('app_env', Environment::Dev))) {
'prod', 'production' => Environment::Prod,
default => Environment::Dev,
},
],
'headers' => $this->headerBuilder(),
],
);

View File

@@ -0,0 +1,36 @@
<?php
/**
* RequestHeaderBuilder.php@Pay
*
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
* Powered by PhpStorm
* Created on 2025/8/18
*/
namespace Singularity\HDK\Pay\Trait;
use Lmc\HttpConstants\Header;
use Singularity\HDK\Core\I18n\Enum\Languages;
use Singularity\HDK\Pay\Enum\Environment;
use Singularity\HDK\Pay\Enum\Site;
use function Hyperf\Config\config;
trait RequestHeaderBuilder {
public function headerBuilder(): array
{
return [
Header::CONTENT_TYPE => 'application/json',
Header::ACCEPT_LANGUAGE => $locale?->value ?? config('translation.locale', Languages::EN->value),
'X-SP-ID' => config('app_name'),
'X-SITE' => (match (strtoupper(config('site', Site::NorthAmerica->value))) {
'CN' => Site::ChinaMainland,
default => Site::NorthAmerica,
})->value,
'X-ENV' => (match (strtolower(config('app_env', Environment::Dev->value))) {
'prod', 'production' => Environment::Prod,
default => Environment::Dev,
})->value,
];
}
}

View File

@@ -0,0 +1,24 @@
<?php
/**
* QueryPointBalanceTest.php@Pay
*
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
* Powered by PhpStorm
* Created on 2025/8/18
*/
use Singularity\HDK\Pay\Domain\Account\Aggregate\ValueObject\PointsBalance;
use Singularity\HDK\Pay\Domain\Account\Enum\PointType;
use Singularity\HDK\Pay\Infratracture\Repository\AccountBalanceRepo;
use function Hyperf\Support\make;
it('should query point balance', function () {
$uid = 'cn3221';
$repo = make(AccountBalanceRepo::class);
$point_balance = $repo->getPointBalance($uid, PointType::EMA);
expect($point_balance)
->toBeInstanceOf(PointsBalance::class)
->and($point_balance->getType())->toBe(PointType::EMA);
})->only();