Improve: subscription index filter links keep context without nesting back

This commit is contained in:
萝卜
2026-03-13 18:38:10 +00:00
parent f9db5ecf46
commit a928700f1e
2 changed files with 140 additions and 2 deletions

View File

@@ -0,0 +1,119 @@
<?php
namespace Tests\Feature;
use App\Models\Merchant;
use App\Models\Plan;
use App\Models\SiteSubscription;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class AdminSiteSubscriptionIndexFilterLinksDoNotCarryBackOrPageTest extends TestCase
{
use RefreshDatabase;
protected function loginAsPlatformAdmin(): void
{
$this->seed();
$this->post('/admin/login', [
'email' => 'platform.admin@demo.local',
'password' => 'Platform@123456',
])->assertRedirect('/admin');
}
public function test_merchant_and_plan_filter_links_should_not_carry_back_or_page(): void
{
$this->loginAsPlatformAdmin();
$merchant = Merchant::query()->firstOrFail();
$plan = Plan::query()->create([
'code' => 'sub_index_filter_links_no_back_page_plan',
'name' => '订阅列表筛选链接不带 back/page 测试套餐',
'billing_cycle' => 'monthly',
'price' => 10,
'list_price' => 10,
'status' => 'active',
'sort' => 10,
'published_at' => now(),
]);
// 需要让 page=2 上仍有数据行(否则页面会显示“暂无订阅数据”,无法断言站点/套餐筛选链接)
// 列表按 id 倒序分页page=1 是最新 10 条page=2 是更早的记录。
// 因此这里先创建“目标订阅”(让它落到 page=2再补 10 条占满 page=1。
$targetSub = SiteSubscription::query()->create([
'merchant_id' => $merchant->id,
'plan_id' => $plan->id,
'status' => 'activated',
'source' => 'manual',
'subscription_no' => 'SUB_INDEX_FILTER_LINKS_NO_BACK_PAGE_TARGET',
'plan_name' => $plan->name,
'billing_cycle' => $plan->billing_cycle,
'period_months' => 1,
'amount' => 10,
'starts_at' => now()->subDay(),
'ends_at' => now()->addMonth(),
'activated_at' => now()->subDay(),
]);
for ($i = 1; $i <= 10; $i++) {
SiteSubscription::query()->create([
'merchant_id' => $merchant->id,
'plan_id' => $plan->id,
'status' => 'activated',
'source' => 'manual',
'subscription_no' => 'SUB_INDEX_FILTER_LINKS_NO_BACK_PAGE_FILL_' . str_pad((string) $i, 4, '0', STR_PAD_LEFT),
'plan_name' => $plan->name,
'billing_cycle' => $plan->billing_cycle,
'period_months' => 1,
'amount' => 10,
'starts_at' => now()->subDay(),
'ends_at' => now()->addMonth(),
'activated_at' => now()->subDay(),
]);
}
$res = $this->get('/admin/site-subscriptions?status=activated&page=2&back=' . urlencode('/admin/platform-orders?status=pending'));
$res->assertOk();
$content = (string) $res->getContent();
preg_match_all('/href=["\']([^"\']+)["\']/', $content, $m);
$hrefs = $m[1] ?? [];
// 若断言失败,方便快速排障(仅在测试失败时才会在输出中看到)
$this->assertTrue(count($hrefs) > 0, '页面中应存在 href');
$pickHref = function (callable $predicate) use ($hrefs): ?string {
foreach ($hrefs as $href) {
if ($predicate($href)) {
return $href;
}
}
return null;
};
$merchantHref = $pickHref(function (string $href) use ($merchant) {
return str_starts_with($href, '/admin/site-subscriptions?')
&& str_contains($href, 'merchant_id=' . $merchant->id);
});
$planHref = $pickHref(function (string $href) use ($plan) {
return str_starts_with($href, '/admin/site-subscriptions?')
&& str_contains($href, 'plan_id=' . $plan->id);
});
$this->assertNotNull($merchantHref, '站点筛选链接应存在');
$this->assertNotNull($planHref, '套餐筛选链接应存在');
// 要求:保留 status但不携带 back/page避免筛选跳转污染与空页
$this->assertStringContainsString('status=activated', $merchantHref);
$this->assertStringNotContainsString('back=', $merchantHref);
$this->assertStringNotContainsString('page=2', $merchantHref);
$this->assertStringContainsString('status=activated', $planHref);
$this->assertStringNotContainsString('back=', $planHref);
$this->assertStringNotContainsString('page=2', $planHref);
}
}