Created
March 25, 2024 21:02
-
-
Save inxilpro/75cb720414e0e5a1fbf03492ac16d16d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class DemoTest extends DatabaseTestCase | |
{ | |
use TestsMoney; | |
use TestsStripeWebhooks; | |
use MocksAuthorizeNet; | |
protected User $owner; | |
protected Company $owner_company; | |
protected Plan $destination_plan; | |
protected Plan $owner_plan; | |
protected User $user1; | |
protected Company $user1_company; | |
protected Subscription $owner_subscription; | |
protected Subscription $user1_subscription; | |
protected MockStripeClient $stripe_mock; | |
protected function setUp(): void | |
{ | |
parent::setUp(); | |
// Test was manually run on 2024-03-21 14:19:23 | |
Date::setTestNow(Date::createFromTimestamp(1711045163)); | |
$this->stripe_mock = MockStripeClient::fake()->preventStrayRequests(); | |
$this->setUpPlans(); | |
$this->setUpCompany(); | |
$this->setUpUsers(); | |
$this->setUpSubscriptions(); | |
} | |
public function test_demo(): void | |
{ | |
$this->assertStripeApiVersionMatchesReplay(); | |
// Advance time to 2024-03-21 14:22:11 | |
Date::setTestNow(Date::createFromTimestamp(1711045331)); | |
$this->runInitialConversionToStripeReplays(); | |
// FIXME: Implement assertions | |
// Advance time to 2024-03-21 14:22:11 | |
Date::setTestNow(Date::createFromTimestamp(1711045331)); | |
$this->runFirstRecurringPaymentReplays(); | |
// FIXME: Implement assertions | |
} | |
protected function setUpPlans(): void | |
{ | |
$this->destination_plan = Plan::factory()->createQuietly([ | |
'id' => 123, | |
'interval_unit' => 'months', | |
'interval_length' => 1, | |
'cents' => 4900, | |
]); | |
PaymentGatewayPlan::factory()->createQuietly([ | |
'id' => 123, | |
'plan_id' => 123, | |
'payment_gateway' => 'stripe', | |
'payment_gateway_id' => 'price_abc123', | |
]); | |
$this->owner_plan = Plan::factory()->createQuietly([ | |
'id' => 1234, | |
'interval_unit' => 'months', | |
'interval_length' => 12, | |
'cents' => 49900, | |
]); | |
PaymentGatewayPlan::factory()->createQuietly([ | |
'id' => 123, | |
'plan_id' => 123, | |
'payment_gateway' => 'stripe', | |
'payment_gateway_id' => 'price_abc123', | |
]); | |
Plan::factory()->createQuietly([ | |
'id' => 1234, | |
'interval_unit' => 'months', | |
'interval_length' => 12, | |
'cents' => 10000, | |
]); | |
} | |
protected function setUpCompany(): void | |
{ | |
// Create the company that will be moving to Stripe | |
$this->owner_company = Company::factory()->createQuietly([ | |
'id' => 1234, | |
'company_name' => 'Demo Company', | |
'payment_gateway' => 'authorize_net', | |
'payment_gateway_id' => '1234', | |
'next_payment_at' => '2024-05-14 23:59:59', | |
'owner_id' => null, | |
]); | |
$this->owner_company->setMetadata('stripe_customer_id', 'cus_abc123'); | |
} | |
protected function setUpUsers(): void | |
{ | |
// Create the main company owner | |
$this->owner = User::factory()->createQuietly([ | |
'id' => 1234, | |
'account_id' => 1234, | |
'confirmed' => true, | |
]); | |
CompanyMembership::factory()->createQuietly([ | |
'account_id' => 1234, | |
'user_id' => 1234, | |
'role' => 'manager', | |
]); | |
// Add company member 1 | |
$this->user1 = User::factory()->createQuietly([ | |
'id' => 1234, | |
'account_id' => 1234, | |
'confirmed' => true, | |
]); | |
CompanyMembership::factory()->createQuietly([ | |
'account_id' => 1234, | |
'user_id' => 1234, | |
'role' => 'user', | |
]); | |
} | |
protected function setUpSubscriptions(): void | |
{ | |
$this->owner_subscription = Subscription::factory()->createQuietly([ | |
'account_id' => 1234, | |
'plan_id' => 1234, | |
'starts_at' => '2023-05-14 00:00:00', | |
'trial_ends_at' => null, | |
'ends_at' => '2024-05-14 23:59:59', | |
'created_at' => '2023-05-05 14:46:32', | |
]); | |
$this->user1_subscription = Subscription::factory()->createQuietly([ | |
'account_id' => 1234, | |
'plan_id' => 1234, | |
'starts_at' => '2023-05-14 00:00:00', | |
'trial_ends_at' => null, | |
'ends_at' => '2024-05-14 23:59:59', | |
'created_at' => '2023-05-05 14:46:58', | |
]); | |
} | |
protected function assertStripeApiVersionMatchesReplay(): void | |
{ | |
$this->assertEquals('2022-11-15', Stripe::getApiVersion()); | |
} | |
protected function runInitialConversionToStripeReplays(): void | |
{ | |
$this->postStripeWebhookReplay('demo/00000_checkout.session.expired')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_customer.created')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_coupon.created')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_payment_method.attached')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_setup_intent.succeeded')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_setup_intent.created')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_checkout.session.completed')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_customer.updated')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_coupon.updated')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_customer.discount.created')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_customer.discount.deleted')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_invoice.created')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_invoice.finalized')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_invoice.paid')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_invoice.payment_succeeded')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_customer.subscription.created')->assertOk(); | |
} | |
protected function runFirstRecurringPaymentReplays(): void | |
{ | |
$this->postStripeWebhookReplay('demo/00000_invoice.upcoming')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_invoice.created')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_customer.subscription.updated')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_payment_intent.succeeded')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_charge.succeeded')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_customer.updated')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_payment_intent.created')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_invoice.updated')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_invoice.paid')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_invoice.payment_succeeded')->assertOk(); | |
$this->postStripeWebhookReplay('demo/00000_invoice.finalized')->assertOk(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment