You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
2.8 KiB

<?php
namespace Tests\Feature;
use App\Services\AdminSmsChallengeService;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Mockery;
use Tests\TestCase;
class AdminSmsSendFailureTest extends TestCase
{
protected function setUp(): void
{
parent::setUp();
config()->set('database.default', 'sqlite');
config()->set('database.connections.sqlite.database', ':memory:');
DB::purge('sqlite');
Schema::create('admins', function (Blueprint $table) {
$table->increments('id');
$table->string('mobile');
$table->softDeletes();
});
Schema::create('configs', function (Blueprint $table) {
$table->increments('id');
$table->string('key');
$table->string('value');
$table->softDeletes();
});
DB::table('admins')->insert(['mobile' => '13800138000']);
DB::table('configs')->insert(['key' => 'sms_sign', 'value' => '测试']);
}
public function test_provider_failure_and_unknown_mobile_have_the_same_response(): void
{
$challengeId = '4d2fd7fc-2630-4432-8df5-34f3edc029d0';
$service = Mockery::mock(AdminSmsChallengeService::class);
$service->shouldReceive('canSend')->twice()->andReturn(true);
$service->shouldReceive('issueChallenge')->once()->andReturn(null);
$service->shouldReceive('issueDecoyChallenge')->twice()->andReturn($challengeId);
$this->app->instance(AdminSmsChallengeService::class, $service);
$registered = $this->postJson('/api/admin/auth/send-sms', ['mobile' => '13800138000']);
$unknown = $this->postJson('/api/admin/auth/send-sms', ['mobile' => '13900139000']);
$registered->assertOk()->assertExactJson([
'message' => '如果手机号已登记,验证码将发送',
'challenge_id' => $challengeId,
]);
$unknown->assertOk()->assertExactJson($registered->json());
}
public function test_challenge_store_failure_returns_a_controlled_error(): void
{
$service = Mockery::mock(AdminSmsChallengeService::class);
$service->shouldReceive('canSend')->once()->andReturn(true);
$service->shouldReceive('issueChallenge')->once()->andReturn(null);
$service->shouldReceive('issueDecoyChallenge')->once()->andThrow(new \RuntimeException('cache unavailable'));
$this->app->instance(AdminSmsChallengeService::class, $service);
$this->postJson('/api/admin/auth/send-sms', ['mobile' => '13800138000'])
->assertOk()
->assertExactJson([
'errcode' => 10003,
'errmsg' => '验证码服务暂不可用,请稍后重试',
]);
}
}