|
|
@@ -2,15 +2,19 @@
|
|
|
|
|
|
namespace Tests\Integration;
|
|
|
|
|
|
+use App\Constants\StepStatus;
|
|
|
use App\Http\Controllers\api\TelegramWebHook;
|
|
|
use App\Services\ApiCryptoService;
|
|
|
+use App\Services\QianBaoWithdrawService;
|
|
|
use App\Services\UserService;
|
|
|
+use App\Services\WithdrawService;
|
|
|
use Illuminate\Contracts\Http\Kernel;
|
|
|
use Illuminate\Database\Schema\Blueprint;
|
|
|
use Illuminate\Foundation\Application;
|
|
|
use Illuminate\Http\JsonResponse;
|
|
|
use Illuminate\Http\Request;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
+use Illuminate\Support\Facades\Cache;
|
|
|
use Illuminate\Support\Facades\Facade;
|
|
|
use Illuminate\Support\Facades\Route;
|
|
|
use Illuminate\Support\Facades\Schema;
|
|
|
@@ -316,6 +320,63 @@ class ApiCryptoTest extends TestCase
|
|
|
self::assertSame('{"code":0}', $this->send('/api/wallet/probe')->getContent());
|
|
|
}
|
|
|
|
|
|
+ public function test_withdrawal_account_and_address_apis_ignore_and_hide_aliases(): void
|
|
|
+ {
|
|
|
+ $this->createWalletFixture();
|
|
|
+ $bank = $this->unwrap($this->sendEncrypted('/api/wallet/addBank', 'POST', [
|
|
|
+ 'channel' => 'DF001', 'bank_name' => 'Fixture Bank', 'card_no' => '12345', 'account' => 'Fixture Name',
|
|
|
+ 'alias' => 'ignored bank alias',
|
|
|
+ ], true));
|
|
|
+ self::assertSame(0, $bank['code']);
|
|
|
+ self::assertSame('', DB::table('banks')->value('alias'));
|
|
|
+ DB::table('banks')->update(['alias' => 'old bank alias']);
|
|
|
+ $bankList = $this->unwrap($this->sendEncrypted('/api/wallet/bankList', 'GET', (object) [], true));
|
|
|
+ self::assertSame('12345', $bankList['data']['list'][0]['card_no']);
|
|
|
+ self::assertArrayNotHasKey('alias', $bankList['data']['list'][0]);
|
|
|
+
|
|
|
+ $address = 'T' . str_repeat('A', 33);
|
|
|
+ $saved = $this->unwrap($this->sendEncrypted('/api/wallet/addAddress', 'POST', [
|
|
|
+ 'address' => $address, 'alias' => 'ignored address alias',
|
|
|
+ ], true));
|
|
|
+ self::assertSame(0, $saved['code']);
|
|
|
+ self::assertNull(DB::table('address')->value('alias'));
|
|
|
+ DB::table('address')->update(['alias' => 'old address alias']);
|
|
|
+ $addresses = $this->unwrap($this->sendEncrypted('/api/wallet/address', 'GET', (object) [], true));
|
|
|
+ self::assertSame($address, $addresses['data']['list'][0]['address']);
|
|
|
+ self::assertArrayNotHasKey('alias', $addresses['data']['list'][0]);
|
|
|
+ }
|
|
|
+
|
|
|
+ public function test_telegram_saves_withdrawal_destinations_without_prompting_for_aliases(): void
|
|
|
+ {
|
|
|
+ $this->createWalletFixture();
|
|
|
+ Cache::put('42_QB_WITHDRAW_CHANNEL', 'DF001');
|
|
|
+ Cache::put('42_QB_WITHDRAW_BANK_NAME', 'Fixture Bank');
|
|
|
+ QianBaoWithdrawService::onMessage(42, '12345', 1, StepStatus::QB_INPUT_CARD_NO);
|
|
|
+ self::assertSame(StepStatus::QB_INPUT_ACCOUNT, Cache::get(get_step_key(42)));
|
|
|
+ $saved = QianBaoWithdrawService::onMessage(42, 'Fixture Name', 2, StepStatus::QB_INPUT_ACCOUNT);
|
|
|
+ $keyboard = json_decode($saved['reply_markup'], true)['inline_keyboard'];
|
|
|
+ self::assertSame('12345', $keyboard[0][0]['text']);
|
|
|
+ self::assertSame('', DB::table('banks')->where('card_no', '12345')->value('alias'));
|
|
|
+ self::assertNull(Cache::get(get_step_key(42)));
|
|
|
+
|
|
|
+ Cache::put('42_QB_WITHDRAW_CARD_NO', '67890');
|
|
|
+ Cache::put('42_QB_ACCOUNT', 'Fixture Name');
|
|
|
+ QianBaoWithdrawService::onMessage(42, 'ignored', 3, StepStatus::LEGACY_QB_INPUT_ALIAS);
|
|
|
+ self::assertSame('', DB::table('banks')->where('card_no', '67890')->value('alias'));
|
|
|
+
|
|
|
+ $address = 'T' . str_repeat('A', 33);
|
|
|
+ $saved = WithdrawService::onMessage(42, $address, 4, StepStatus::INPUT_ADDRESS_TRC20);
|
|
|
+ $keyboard = json_decode($saved['reply_markup'], true)['inline_keyboard'];
|
|
|
+ self::assertSame($address, $keyboard[0][0]['text']);
|
|
|
+ self::assertNull(Cache::get(get_step_key(42)));
|
|
|
+
|
|
|
+ $oldAddress = 'T' . str_repeat('B', 33);
|
|
|
+ Cache::put('42_address', $oldAddress);
|
|
|
+ WithdrawService::onMessage(42, 'ignored', 5, StepStatus::LEGACY_INPUT_ADDRESS_ALIAS);
|
|
|
+ self::assertTrue(DB::table('address')->where('address', $oldAddress)->exists());
|
|
|
+ self::assertSame(0, DB::table('address')->whereNotNull('alias')->count());
|
|
|
+ }
|
|
|
+
|
|
|
public function test_cors_preflight_and_head(): void
|
|
|
{
|
|
|
Route::get('api/wallet/probe', fn () => response()->json(['code' => 0]));
|
|
|
@@ -509,9 +570,17 @@ class ApiCryptoTest extends TestCase
|
|
|
});
|
|
|
Schema::create('banks', function (Blueprint $table) {
|
|
|
$table->id();
|
|
|
- foreach (['member_id', 'channel', 'bank_name', 'account', 'card_no', 'alias'] as $field) {
|
|
|
+ foreach (['member_id', 'channel', 'bank_name', 'account', 'card_no'] as $field) {
|
|
|
$table->string($field);
|
|
|
}
|
|
|
+ $table->string('alias')->default('');
|
|
|
+ $table->timestamps();
|
|
|
+ });
|
|
|
+ Schema::create('address', function (Blueprint $table) {
|
|
|
+ $table->id();
|
|
|
+ $table->string('member_id');
|
|
|
+ $table->string('address');
|
|
|
+ $table->string('alias')->nullable();
|
|
|
$table->timestamps();
|
|
|
});
|
|
|
(require dirname(__DIR__, 2) . '/database/migrations/2026_11_06_140000_add_qr_image_to_withdrawal_destinations.php')->up();
|