Fix Mini Pay sheet: same-origin pay URL and visible chrome.
Deploy Ladill Mini / deploy (push) Successful in 57s

Cross-origin fetch to ladl.link had no CORS, so showSheet never ran. Open the sheet immediately and keep Paystack behind the Continue CTA.
This commit is contained in:
isaacclad
2026-07-21 18:46:26 +00:00
parent 50e1b68b5f
commit 42257ab444
6 changed files with 146 additions and 134 deletions
+48
View File
@@ -43,11 +43,59 @@ class MiniPaymentCheckoutTest extends TestCase
->assertSee('Your payment is processed securely', false)
->assertSee('md:items-center', false)
->assertSee('Complete your payment', false)
->assertSee('data-ladill-pay-sheet', false)
->assertSee('/q/'.$qr->short_code.'/pay', false)
->assertDontSee('https://ladl.link/'.$qr->short_code.'/pay', false)
->assertDontSee('MTN MoMo number', false)
->assertDontSee('Pay with MTN MoMo', false)
->assertDontSee('Paystack checkout', false);
}
public function test_json_pay_post_is_not_redirected_to_ladill_link(): void
{
$user = User::create([
'public_id' => (string) Str::uuid(),
'name' => 'Vendor',
'email' => 'vendor-ajax@example.com',
]);
$qr = QrCode::query()->create([
'user_id' => $user->id,
'short_code' => 'payajax01',
'type' => QrCode::TYPE_PAYMENT,
'label' => 'Till',
'payload' => [
'content' => [
'business_name' => 'Accra Kiosk',
'currency' => 'GHS',
],
'style' => [],
],
'is_active' => true,
]);
$pay = Mockery::mock(PayClient::class);
$pay->shouldReceive('createCheckout')
->once()
->andReturn([
'id' => 100,
'reference' => 'LP-TESTMINIAjax01',
'checkout_url' => 'https://checkout.paystack.com/mini-ajax',
'provider' => 'paystack',
'platform_fee_minor' => 15,
'merchant_amount_minor' => 985,
]);
$this->app->instance(PayClient::class, $pay);
// No INTERNAL header — XHR/JSON must still hit Mini, not 307 to ladl.link.
$this->postJson('/q/'.$qr->short_code.'/pay', [
'amount' => 10,
])
->assertOk()
->assertJsonPath('checkout_url', 'https://checkout.paystack.com/mini-ajax')
->assertJsonPath('provider', 'paystack');
}
public function test_pay_initiation_does_not_require_phone_and_returns_paystack_checkout(): void
{
$user = User::create([
+14 -3
View File
@@ -14,21 +14,32 @@ class ResponsivePaystackSheetTest extends TestCase
$this->assertStringContainsString('role="dialog"', $html);
$this->assertStringContainsString('aria-modal="true"', $html);
$this->assertStringContainsString('data-ladill-pay-sheet', $html);
$this->assertStringContainsString('data-ladill-pay-panel', $html);
$this->assertStringContainsString('data-ladill-pay-backdrop', $html);
$this->assertStringContainsString('data-ladill-pay-handle', $html);
$this->assertStringContainsString('data-ladill-pay-continue', $html);
$this->assertStringContainsString('md:items-center', $html);
$this->assertStringContainsString('rounded-t-2xl', $html);
$this->assertStringContainsString('md:h-[min(720px,85vh)]', $html);
$this->assertStringContainsString('md:rounded-2xl', $html);
$this->assertStringContainsString('md:max-w-lg', $html);
$this->assertStringContainsString('Complete your payment', $html);
$this->assertStringContainsString('safe-area-inset-bottom', $html);
$this->assertStringContainsString('LadillPayCheckout', $html);
$this->assertStringContainsString('Continue to Paystack', $html);
$this->assertStringContainsString('ladill_pay_checkout', $html);
$this->assertStringContainsString('Starting secure checkout', $html);
$this->assertStringContainsString('prepare:', $html);
$this->assertStringNotContainsString('hidden w-full max-w-lg', $html);
$this->assertStringNotContainsString('Paystack checkout', $html);
}
public function test_payment_return_escapes_popup_and_iframe_to_opener_or_top(): void
{
$html = view('public.payment-return', [
$view = view()->exists('partials.payment-return')
? 'partials.payment-return'
: 'public.payment-return';
$html = view($view, [
'redirect' => 'https://example.test/paid',
])->render();