diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 72f48451..f9421e78 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -13,17 +13,24 @@ jobs: strategy: fail-fast: true matrix: - php: [7.4, 8.0, 8.1] - laravel: [^8.0, ^9.0] + os: [ ubuntu-latest ] + php: [ 8.2, 8.1, 8.0] + laravel: [ 10.*, 9.* ] + dependency-version: [ prefer-stable ] + include: + - laravel: 9.* + testbench: 7.* + - laravel: 10.* + testbench: 8.* exclude: - - php: 7.4 - laravel: 9 + - laravel: 10.* + php: 8.0 - name: P${{ matrix.php }} - L${{ matrix.laravel }} + name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.dependency-version }} - ${{ matrix.os }} steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -35,7 +42,7 @@ jobs: - name: Install dependencies run: | - composer update --prefer-dist --no-interaction --no-progress + composer update --${{ matrix.dependency-version }} --prefer-dist --no-interaction --no-progress - name: Execute tests run: vendor/bin/phpunit --coverage-text diff --git a/.gitignore b/.gitignore index 3669f638..662444fa 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ vendor coverage phpunit.xml .phpunit.result.cache +.phpunit.cache .idea .phpstorm.meta.php .php-cs-fixer.cache diff --git a/composer.json b/composer.json index 2e0ec60f..c2fe549e 100644 --- a/composer.json +++ b/composer.json @@ -1,81 +1,78 @@ { - "name": "mollie/laravel-cashier-mollie", - "description": "Laravel Cashier provides an expressive, fluent interface to Mollie's subscription billing services.", - "keywords": [ - "mollie", - "laravel", - "subscriptions", - "recurring", - "billing", - "SEPA", - "Apple Pay", - "credit card", - "debit card", - "Europe" - ], - "homepage": "https://github.com/mollie/laravel-cashier-mollie", - "license": "MIT", - "authors": [ - { - "name": "Mollie.com", - "email": "support@mollie.com", - "homepage": "https://www.mollie.com", - "role": "Owner" - }, - { - "name": "Sander van Hooft", - "email": "sander@sandorian.com", - "homepage": "https://www.sandorian.com", - "role": "Developer" - } - ], - "require": { - "php": "^7.4|^8.0", - "ext-json": "*", - "ext-intl": "*", - "dompdf/dompdf": "^2.0", - "illuminate/database": "^8.0|^9.0", - "illuminate/support": "^8.0|^9.0", - "mollie/laravel-mollie": "^2.9", - "mollie/mollie-api-php": "^2.27", - "moneyphp/money": "^3.2|^4.0.3", - "nesbot/carbon": "^2.31" - }, - "require-dev": { - "guzzle/http": "^3.9", - "guzzlehttp/guzzle": "^7.0", - "laravel/legacy-factories": "^1.0", - "mockery/mockery": "^1.4", - "orchestra/testbench": "^6.0|^7.0", - "phpunit/phpunit": "^8.5|^9.3", - "vlucas/phpdotenv": "^5.2" - }, - "autoload": { - "files": [ - "src/Helpers/helpers.php" - ], - "psr-4": { - "Laravel\\Cashier\\": "src" - } - }, - "autoload-dev": { - "psr-4": { - "Laravel\\Cashier\\Tests\\": "tests" - } - }, - "extra": { - "laravel": { - "providers": [ - "Laravel\\Cashier\\CashierServiceProvider" - ] - } + "name": "mollie/laravel-cashier-mollie", + "description": "Laravel Cashier provides an expressive, fluent interface to Mollie's subscription billing services.", + "keywords": [ + "mollie", + "laravel", + "subscriptions", + "recurring", + "billing", + "SEPA", + "Apple Pay", + "credit card", + "debit card", + "Europe" + ], + "homepage": "https://github.com/mollie/laravel-cashier-mollie", + "license": "MIT", + "authors": [ + { + "name": "Mollie.com", + "email": "support@mollie.com", + "homepage": "https://www.mollie.com", + "role": "Owner" }, - "config": { - "sort-packages": true - }, - "minimum-stability": "dev", - "prefer-stable": true, - "scripts": { - "test": "./vendor/bin/phpunit tests" + { + "name": "Sander van Hooft", + "email": "sander@sandorian.com", + "homepage": "https://www.sandorian.com", + "role": "Developer" + } + ], + "require": { + "php": "^8.0", + "ext-json": "*", + "ext-intl": "*", + "dompdf/dompdf": "^2.0", + "illuminate/database": "^9.0|^10", + "illuminate/support": "^9.0|^10", + "mollie/laravel-mollie": "^2.22", + "mollie/mollie-api-php": "^2.27", + "moneyphp/money": "^4.1", + "nesbot/carbon": "^2.31" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.0", + "mockery/mockery": "^1.4", + "orchestra/testbench": "^7.0|^8.0", + "phpunit/phpunit": "^9.5" + }, + "autoload": { + "files": [ + "src/Helpers/helpers.php" + ], + "psr-4": { + "Laravel\\Cashier\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "Laravel\\Cashier\\Tests\\": "tests" + } + }, + "extra": { + "laravel": { + "providers": [ + "Laravel\\Cashier\\CashierServiceProvider" + ] } + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "stable", + "prefer-stable": true, + "scripts": { + "test": "./vendor/bin/phpunit tests" + } } diff --git a/routes/webhooks.php b/routes/webhooks.php index 41b31ffc..60ce8c5e 100644 --- a/routes/webhooks.php +++ b/routes/webhooks.php @@ -1,20 +1,24 @@ group(function () { Route::name('webhooks.mollie.default')->post( Cashier::webhookUrl(), - 'WebhookController@handleWebhook' + [WebhookController::class, 'handleWebhook'] ); Route::name('webhooks.mollie.aftercare')->post( Cashier::aftercareWebhookUrl(), - 'AftercareWebhookController@handleWebhook' + [AftercareWebhookController::class, 'handleWebhook'] ); Route::name('webhooks.mollie.first_payment')->post( Cashier::firstPaymentWebhookUrl(), - 'FirstPaymentWebhookController@handleWebhook' + [FirstPaymentWebhookController::class, 'handleWebhook'] ); }); diff --git a/src/Order/Order.php b/src/Order/Order.php index be0cf162..b03d0d61 100644 --- a/src/Order/Order.php +++ b/src/Order/Order.php @@ -71,17 +71,9 @@ class Order extends Model 'balance_before' => 'int', 'credit_used' => 'int', 'total_due' => 'int', - ]; - - /** - * The attributes that should be mutated to dates. - * - * @var array - */ - protected $dates = [ - 'processed_at', - 'created_at', - 'updated_at', + 'processed_at' => 'datetime', + 'created_at' => 'datetime', + 'updated_at' => 'datetime', ]; protected $guarded = []; diff --git a/src/Order/OrderItem.php b/src/Order/OrderItem.php index cb3664fa..c5e0e1fc 100644 --- a/src/Order/OrderItem.php +++ b/src/Order/OrderItem.php @@ -46,15 +46,7 @@ class OrderItem extends Model implements InvoicableItem 'unit_price' => 'int', 'tax_percentage' => 'float', 'orderable_id' => 'int', - ]; - - /** - * The attributes that should be mutated to dates. - * - * @var array - */ - protected $dates = [ - 'process_at', + 'process_at' => 'datetime', ]; protected $guarded = []; @@ -124,7 +116,7 @@ public function getTotalAttribute() */ public function scopeProcessed($query, $processed = true) { - if (! $processed) { + if (!$processed) { return $query->whereNull('order_id'); } @@ -140,7 +132,7 @@ public function scopeProcessed($query, $processed = true) */ public function scopeUnprocessed($query, $unprocessed = true) { - return $query->processed(! $unprocessed); + return $query->processed(!$unprocessed); } /** diff --git a/src/Subscription.php b/src/Subscription.php index a05a3c9c..04f7959d 100644 --- a/src/Subscription.php +++ b/src/Subscription.php @@ -61,11 +61,11 @@ class Subscription extends Model implements InteractsWithOrderItems, Preprocesse * * @var array */ - protected $dates = [ - 'trial_ends_at', - 'cycle_started_at', - 'cycle_ends_at', - 'ends_at', + protected $casts = [ + 'trial_ends_at' => 'datetime', + 'cycle_started_at' => 'datetime', + 'cycle_ends_at' => 'datetime', + 'ends_at' => 'datetime', ]; /** @@ -104,7 +104,7 @@ public function active() */ public function ended() { - return $this->cancelled() && ! $this->onGracePeriod(); + return $this->cancelled() && !$this->onGracePeriod(); } /** @@ -134,7 +134,7 @@ public function onGracePeriod() */ public function recurring() { - return ! $this->onTrial() && ! $this->cancelled(); + return !$this->onTrial() && !$this->cancelled(); } /** @@ -144,7 +144,7 @@ public function recurring() */ public function cancelled() { - return ! is_null($this->ends_at); + return !is_null($this->ends_at); } /** @@ -346,11 +346,11 @@ protected function removeScheduledOrderItem($save = false) */ public function resume() { - if (! $this->cancelled()) { + if (!$this->cancelled()) { throw new LogicException('Unable to resume a subscription that is not cancelled.'); } - if (! $this->onGracePeriod()) { + if (!$this->onGracePeriod()) { throw new LogicException('Unable to resume a subscription that is not within grace period.'); } @@ -468,7 +468,7 @@ public static function processOrderItem(OrderItem $item) $plan_swapped = false; $previousPlan = null; - if (! empty($subscription->next_plan)) { + if (!empty($subscription->next_plan)) { $plan_swapped = true; $previousPlan = $subscription->plan; $subscription->plan = $subscription->next_plan; @@ -704,7 +704,7 @@ protected function reimbursableAmount() // Determine base amount eligible to reimburse $latestProcessedOrderItem = $this->latestProcessedOrderItem(); - if (! $latestProcessedOrderItem) { + if (!$latestProcessedOrderItem) { return $zeroAmount; } diff --git a/tests/BaseTestCase.php b/tests/BaseTestCase.php index 6af64f5a..a451669f 100644 --- a/tests/BaseTestCase.php +++ b/tests/BaseTestCase.php @@ -30,13 +30,12 @@ protected function setUp(): void parent::setUp(); $this->withFixtureModels(); - $this->withFactories(__DIR__.'/database/factories'); config(['cashier.webhook_url' => 'https://www.example.com/webhook']); config(['cashier.aftercare_webhook_url' => 'https://www.example.com/aftercare-webhook']); config(['cashier.first_payment.webhook_url' => 'https://www.example.com/mandate-webhook']); - if (! $this->interactWithMollieAPI) { + if (!$this->interactWithMollieAPI) { // Disable the Mollie API $this->mock(MollieApiWrapper::class, null); } @@ -58,50 +57,50 @@ protected function getPackageProviders($app) */ protected function withPackageMigrations() { - $migrations_dir = __DIR__.'/../database/migrations'; + $migrations_dir = __DIR__ . '/../database/migrations'; $this->runMigrations( collect( [ [ 'class' => CreateUsersTable::class, - 'file_path' => __DIR__.'/database/migrations/create_users_table.php', + 'file_path' => __DIR__ . '/Database/Migrations/create_users_table.php', ], [ 'class' => '\CreateSubscriptionsTable', - 'file_path' => $migrations_dir.'/create_subscriptions_table.php.stub', + 'file_path' => $migrations_dir . '/create_subscriptions_table.php.stub', ], [ 'class' => '\CreateOrderItemsTable', - 'file_path' => $migrations_dir.'/create_order_items_table.php.stub', + 'file_path' => $migrations_dir . '/create_order_items_table.php.stub', ], [ 'class' => '\CreateOrdersTable', - 'file_path' => $migrations_dir.'/create_orders_table.php.stub', + 'file_path' => $migrations_dir . '/create_orders_table.php.stub', ], [ 'class' => '\CreateCreditsTable', - 'file_path' => $migrations_dir.'/create_credits_table.php.stub', + 'file_path' => $migrations_dir . '/create_credits_table.php.stub', ], [ 'class' => '\CreateRedeemedCouponsTable', - 'file_path' => $migrations_dir.'/create_redeemed_coupons_table.php.stub', + 'file_path' => $migrations_dir . '/create_redeemed_coupons_table.php.stub', ], [ 'class' => '\CreateAppliedCouponsTable', - 'file_path' => $migrations_dir.'/create_applied_coupons_table.php.stub', + 'file_path' => $migrations_dir . '/create_applied_coupons_table.php.stub', ], [ 'class' => '\CreatePaymentsTable', - 'file_path' => $migrations_dir.'/create_payments_table.php.stub', + 'file_path' => $migrations_dir . '/create_payments_table.php.stub', ], [ 'class' => '\CreateRefundItemsTable', - 'file_path' => $migrations_dir.'/create_refund_items_table.php.stub', + 'file_path' => $migrations_dir . '/create_refund_items_table.php.stub', ], [ 'class' => '\CreateRefundsTable', - 'file_path' => $migrations_dir.'/create_refunds_table.php.stub', + 'file_path' => $migrations_dir . '/create_refunds_table.php.stub', ], ] ) @@ -326,7 +325,7 @@ protected function getCustomerUser($persist = true, $overrides = []) */ protected function getUser($persist = true, $overrides = []) { - $user = factory(User::class)->make($overrides); + $user = User::factory()->make($overrides); if ($persist) { $user->save(); diff --git a/tests/BillableTest.php b/tests/BillableTest.php index 94e74508..ed86adc1 100644 --- a/tests/BillableTest.php +++ b/tests/BillableTest.php @@ -3,8 +3,9 @@ namespace Laravel\Cashier\Tests; use Illuminate\Support\Facades\Event; -use Laravel\Cashier\Cashier; use Laravel\Cashier\Coupon\RedeemedCouponCollection; +use Laravel\Cashier\Tests\Database\Factories\OrderFactory; +use Laravel\Cashier\Tests\Database\Factories\RedeemedCouponFactory; use Laravel\Cashier\Events\MandateClearedFromBillable; use Laravel\Cashier\Exceptions\MandateIsNotYetFinalizedException; use Laravel\Cashier\Mollie\Contracts\GetMollieCustomer; @@ -25,7 +26,7 @@ class BillableTest extends BaseTestCase public function testTaxPercentage() { $this->withPackageMigrations(); - $user = factory(User::class)->create([ + $user = User::factory()->create([ 'tax_percentage' => 21.5, ]); @@ -95,7 +96,7 @@ public function canRetrieveRedeemedCoupons() { $this->withPackageMigrations(); - $user = factory(User::class)->create(); + $user = User::factory()->create(); $redeemedCoupons = $user->redeemedCoupons; $this->assertInstanceOf(RedeemedCouponCollection::class, $redeemedCoupons); @@ -141,7 +142,7 @@ public function canRedeemCouponAndRevokeOtherCoupons() ]); $subscription = $user->newSubscription('default', 'monthly-10-1')->create(); - $subscription->redeemedCoupons()->saveMany(factory(Cashier::$redeemedCouponModel, 2)->make()); + $subscription->redeemedCoupons()->saveMany(RedeemedCouponFactory::times(2)->make()); $this->assertEquals(2, $subscription->redeemedCoupons()->active()->count()); $this->assertEquals(0, $subscription->appliedCoupons()->count()); @@ -177,7 +178,7 @@ public function canFindInvoice() { $this->withPackageMigrations(); $user = $this->getUser(); - factory(Cashier::$orderModel, 2)->create([ + OrderFactory::times(2)->create([ 'owner_id' => $user->id, 'owner_type' => $user->getMorphClass(), ])->first()->update(['number' => 'find_invoice_test_1']); @@ -204,7 +205,7 @@ public function findInvoiceThrowsExceptionIfInvoiceExistButIsAssociatedWithOther { $this->withPackageMigrations(); $userA = $this->getUser(); - factory(Cashier::$orderModel)->create([ + OrderFactory::new()->create([ 'number' => 'foo-bar', 'owner_id' => $userA->id, ]); @@ -221,7 +222,7 @@ public function canFindInvoiceUsingFindInvoiceOrFail() { $this->withPackageMigrations(); $user = $this->getUser(); - factory(Cashier::$orderModel, 2)->create([ + OrderFactory::times(2)->create([ 'owner_id' => $user->id, 'owner_type' => $user->getMorphClass(), ])->first()->update(['number' => 'find_invoice_test_1']); @@ -248,7 +249,7 @@ public function findInvoiceOrFailThrowsExceptionIfInvoiceExistButIsAssociatedWit { $this->withPackageMigrations(); $userA = $this->getUser(); - factory(Cashier::$orderModel)->create([ + OrderFactory::new()->create([ 'number' => 'foo-bar', 'owner_id' => $userA->id, ]); @@ -267,11 +268,11 @@ public function canFindInvoiceByOrderId() $user = $this->getUser(); $user->orders()->saveMany([ - factory(Cashier::$orderModel)->make([ + OrderFactory::new()->make([ 'id' => 1, 'number' => '2018-0000-0001', ]), - factory(Cashier::$orderModel)->make([ + OrderFactory::new()->make([ 'id' => 2, 'number' => '2018-0000-0002', ]), @@ -290,11 +291,11 @@ public function canFindInvoiceByOrderIdUsingFindInvoiceByOrderIdOrFail() $user = $this->getUser(); $user->orders()->saveMany([ - factory(Cashier::$orderModel)->make([ + OrderFactory::new()->make([ 'id' => 1, 'number' => '2018-0000-0001', ]), - factory(Cashier::$orderModel)->make([ + OrderFactory::new()->make([ 'id' => 2, 'number' => '2018-0000-0002', ]), diff --git a/tests/CashierTest.php b/tests/CashierTest.php index 67c0b880..f273ad5a 100644 --- a/tests/CashierTest.php +++ b/tests/CashierTest.php @@ -18,6 +18,8 @@ use Laravel\Cashier\Refunds\Refund as CashierRefund; use Laravel\Cashier\Refunds\RefundItem as CashierRefundItem; use Laravel\Cashier\Subscription as CashierSubscription; +use Laravel\Cashier\Tests\Database\Factories\OrderItemFactory; +use Laravel\Cashier\Tests\Database\Factories\SubscriptionFactory; use Laravel\Cashier\Tests\Fixtures\AppliedCoupon as FixtureAppliedCoupon; use Laravel\Cashier\Tests\Fixtures\Credit as FixtureCredit; use Laravel\Cashier\Tests\Fixtures\Order as FixtureOrder; @@ -111,8 +113,8 @@ public function testRunningCashierProcessesOpenOrderItems() 'mollie_mandate_id' => 'mdt_unique_mandate_id', ]); - $user->orderItems()->save(factory(Cashier::$orderItemModel)->states('unlinked', 'processed')->make()); - $user->orderItems()->save(factory(Cashier::$orderItemModel)->states('unlinked', 'unprocessed')->make()); + $user->orderItems()->save(OrderItemFactory::new()->unlinked()->processed()->make()); + $user->orderItems()->save(OrderItemFactory::new()->unlinked()->unprocessed()->make()); $this->assertEquals(0, $user->orders()->count()); $this->assertOrderItemCounts($user, 1, 1); @@ -156,11 +158,11 @@ public function testRunningCashierProcessesUnprocessedOrderItemsAndSchedulesNext 'mollie_mandate_id' => 'mdt_unique_mandate_id_2', ]); - $subscription1 = $user1->subscriptions()->save(factory(Cashier::$subscriptionModel)->make()); - $subscription2 = $user2->subscriptions()->save(factory(Cashier::$subscriptionModel)->make()); + $subscription1 = $user1->subscriptions()->save(SubscriptionFactory::new()->make()); + $subscription2 = $user2->subscriptions()->save(SubscriptionFactory::new()->make()); $subscription1->orderItems()->save( - factory(Cashier::$orderItemModel)->states(['unprocessed', 'EUR'])->make([ + OrderItemFactory::new()->unprocessed()->EUR()->make([ 'owner_id' => 1, 'owner_type' => User::class, 'process_at' => now()->addHour(), @@ -168,7 +170,7 @@ public function testRunningCashierProcessesUnprocessedOrderItemsAndSchedulesNext ); $subscription1->orderItems()->saveMany( - factory(Cashier::$orderItemModel, 2)->states(['unprocessed', 'EUR'])->make([ + OrderItemFactory::new()->times(2)->unprocessed()->EUR()->make([ 'owner_id' => 1, 'owner_type' => User::class, 'process_at' => now()->subHour(), @@ -176,11 +178,11 @@ public function testRunningCashierProcessesUnprocessedOrderItemsAndSchedulesNext ); // should process these two $subscription1->orderItems()->save( - factory(Cashier::$orderItemModel)->states('processed')->make() + OrderItemFactory::new()->processed()->make() ); // should NOT process this (already processed) $subscription2->orderItems()->save( - factory(Cashier::$orderItemModel)->states('unprocessed')->make([ + OrderItemFactory::new()->unprocessed()->make([ 'owner_id' => 2, 'owner_type' => User::class, 'process_at' => now()->subHours(2), diff --git a/tests/Charge/FirstPaymentChargeBuilderTest.php b/tests/Charge/FirstPaymentChargeBuilderTest.php index 834fe7ae..55992b6d 100644 --- a/tests/Charge/FirstPaymentChargeBuilderTest.php +++ b/tests/Charge/FirstPaymentChargeBuilderTest.php @@ -32,7 +32,7 @@ protected function setUp(): void public function redirectToCheckoutResponse() { $this->withMockedCreateMolliePayment(); - $owner = factory(User::class)->create(); + $owner = User::factory()->create(); $this->assertEquals(0, $owner->orderItems()->count()); $this->assertEquals(0, $owner->orders()->count()); diff --git a/tests/Charge/ManageChargesTest.php b/tests/Charge/ManageChargesTest.php index 1a4d2013..ed62e2f1 100644 --- a/tests/Charge/ManageChargesTest.php +++ b/tests/Charge/ManageChargesTest.php @@ -23,7 +23,7 @@ protected function setUp(): void /** @test */ public function usingMandatedChargeBuilderWhenValidMandate() { - $owner = factory(User::class)->create(); + $owner = User::factory()->create(); $this->assertInstanceOf(FirstPaymentChargeBuilder::class, $owner->newCharge()); } diff --git a/tests/Coupon/CouponOrderItemPreprocessorTest.php b/tests/Coupon/CouponOrderItemPreprocessorTest.php index 8a32f785..9812fbd4 100644 --- a/tests/Coupon/CouponOrderItemPreprocessorTest.php +++ b/tests/Coupon/CouponOrderItemPreprocessorTest.php @@ -8,6 +8,8 @@ use Laravel\Cashier\Order\OrderItemCollection; use Laravel\Cashier\Subscription; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\OrderItemFactory; +use Laravel\Cashier\Tests\Database\Factories\SubscriptionFactory; class CouponOrderItemPreprocessorTest extends BaseTestCase { @@ -23,8 +25,8 @@ public function appliesCoupon() $this->withMockedCouponRepository(); /** @var Subscription $subscription */ - $subscription = factory(Cashier::$subscriptionModel)->create(); - $item = factory(Cashier::$orderItemModel)->make(); + $subscription = SubscriptionFactory::new()->create(); + $item = OrderItemFactory::new()->make(); $subscription->orderItems()->save($item); /** @var \Laravel\Cashier\Coupon\Coupon $coupon */ @@ -46,7 +48,7 @@ public function appliesCoupon() public function passesThroughWhenNoRedeemedCoupon() { $preprocessor = new CouponOrderItemPreprocessor(); - $items = factory(Cashier::$orderItemModel, 1)->make(); + $items = OrderItemFactory::new()->times(1)->make(); $this->assertInstanceOf(OrderItemCollection::class, $items); $this->assertEquals(0, Cashier::$redeemedCouponModel::count()); diff --git a/tests/Coupon/MultiCurrencyCouponOrderItemPreprocessorTest.php b/tests/Coupon/MultiCurrencyCouponOrderItemPreprocessorTest.php index 0ef7af9d..2cabef23 100644 --- a/tests/Coupon/MultiCurrencyCouponOrderItemPreprocessorTest.php +++ b/tests/Coupon/MultiCurrencyCouponOrderItemPreprocessorTest.php @@ -9,6 +9,8 @@ use Laravel\Cashier\Order\OrderItemCollection; use Laravel\Cashier\Subscription; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\OrderItemFactory; +use Laravel\Cashier\Tests\Database\Factories\SubscriptionFactory; class MultiCurrencyCouponOrderItemPreprocessorTest extends BaseTestCase { @@ -24,13 +26,13 @@ public function appliesCoupon() $this->withMockedUsdCouponRepository(); /** @var Subscription $subscription */ - $subscription = factory(Cashier::$subscriptionModel)->create(); - $item = factory(Cashier::$orderItemModel)->make(); + $subscription = SubscriptionFactory::new()->create(); + $item = OrderItemFactory::new()->make(); $subscription->orderItems()->save($item); /** @var Subscription $subscriptionUsd */ - $subscriptionUsd = factory(Cashier::$subscriptionModel)->create(); - $itemUsd = factory(Cashier::$orderItemModel)->make(['currency' => 'USD']); + $subscriptionUsd = SubscriptionFactory::new()->create(); + $itemUsd = OrderItemFactory::new()->USD()->make(); $subscriptionUsd->orderItems()->save($itemUsd); /** @var \Laravel\Cashier\Coupon\Coupon $coupon */ diff --git a/tests/Coupon/PercentageCouponTest.php b/tests/Coupon/PercentageCouponTest.php index 81a9576e..f8c55fdb 100644 --- a/tests/Coupon/PercentageCouponTest.php +++ b/tests/Coupon/PercentageCouponTest.php @@ -9,6 +9,8 @@ use Laravel\Cashier\Coupon\PercentageDiscountHandler; use Laravel\Cashier\Subscription; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\OrderItemFactory; +use Laravel\Cashier\Tests\Database\Factories\SubscriptionFactory; class PercentageCouponTest extends BaseTestCase { @@ -37,8 +39,8 @@ public function couponCalculatesTheRightPrice() $this->withMockedCouponRepository($coupon, $couponHandler, $context); /** @var Subscription $subscription */ - $subscription = factory(Cashier::$subscriptionModel)->create(); - $item = factory(Cashier::$orderItemModel)->make(); + $subscription = SubscriptionFactory::new()->create(); + $item = OrderItemFactory::new()->make(); $subscription->orderItems()->save($item); /** @var \Laravel\Cashier\Coupon\Coupon $coupon */ diff --git a/tests/Coupon/RedeemedCouponTest.php b/tests/Coupon/RedeemedCouponTest.php index 0b4b3f9e..392b9a11 100644 --- a/tests/Coupon/RedeemedCouponTest.php +++ b/tests/Coupon/RedeemedCouponTest.php @@ -5,6 +5,7 @@ use Laravel\Cashier\Cashier; use Laravel\Cashier\Coupon\RedeemedCoupon; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\RedeemedCouponFactory; class RedeemedCouponTest extends BaseTestCase { @@ -14,7 +15,7 @@ public function canBeRevoked() $this->withPackageMigrations(); /** @var RedeemedCoupon $redeemedCoupon */ - $redeemedCoupon = factory(Cashier::$redeemedCouponModel)->create(['times_left' => 5]); + $redeemedCoupon = RedeemedCouponFactory::new()->create(['times_left' => 5]); $this->assertEquals(5, $redeemedCoupon->times_left); $this->assertTrue($redeemedCoupon->isActive()); diff --git a/tests/Credit/CreditTest.php b/tests/Credit/CreditTest.php index 7c8b4e78..2cd09f26 100644 --- a/tests/Credit/CreditTest.php +++ b/tests/Credit/CreditTest.php @@ -13,7 +13,7 @@ class CreditTest extends BaseTestCase public function testAddAmountForOwner() { $this->withPackageMigrations(); - $user = factory(User::class)->create(); + $user = User::factory()->create(); Cashier::$creditModel::addAmountForOwner($user, Money::EUR(12345)); Cashier::$creditModel::addAmountForOwner($user, Money::EUR(12346)); @@ -34,7 +34,7 @@ public function testAddAmountForOwner() public function testMaxOutForOwner() { $this->withPackageMigrations(); - $user = factory(User::class)->create(); + $user = User::factory()->create(); Cashier::$creditModel::addAmountForOwner($user, Money::USD(12348)); $usedUSD = Cashier::$creditModel::maxOutForOwner($user, Money::USD(20025)); diff --git a/tests/Database/Factories/OrderFactory.php b/tests/Database/Factories/OrderFactory.php new file mode 100644 index 00000000..5952748f --- /dev/null +++ b/tests/Database/Factories/OrderFactory.php @@ -0,0 +1,41 @@ + + */ + public function definition(): array + { + return [ + 'owner_id' => 1, + 'owner_type' => User::class, + 'currency' => 'EUR', + 'subtotal' => 123, + 'tax' => 0, + 'total' => 123, + 'total_due' => 123, + 'number' => '2018-0000-0001', + 'credit_used' => 0, + 'balance_before' => 0, + ]; + } +} diff --git a/tests/Database/Factories/OrderItemFactory.php b/tests/Database/Factories/OrderItemFactory.php new file mode 100644 index 00000000..08501e57 --- /dev/null +++ b/tests/Database/Factories/OrderItemFactory.php @@ -0,0 +1,77 @@ + + */ + public function definition(): array + { + return [ + 'owner_type' => User::class, + 'owner_id' => 1, + 'orderable_type' => Cashier::$subscriptionModel, + 'orderable_id' => 1, + 'description' => 'Some dummy description', + 'unit_price' => 12150, + 'quantity' => 1, + 'tax_percentage' => 21.5, + 'currency' => 'EUR', + 'process_at' => now()->subMinute(), + ]; + } + + public function unlinked() + { + return $this->state(fn () => [ + 'orderable_type' => null, + 'orderable_id' => null, + ]); + } + + public function unprocessed() + { + return $this->state(fn () => [ + 'order_id' => null, + ]); + } + + public function processed() + { + return $this->state(fn () => [ + 'order_id' => 1, + ]); + } + + public function EUR() + { + return $this->state(fn () => [ + 'currency' => 'EUR', + ]); + } + + public function USD() + { + return $this->state(fn () => [ + 'currency' => 'USD', + ]); + } +} diff --git a/tests/Database/Factories/RedeemedCouponFactory.php b/tests/Database/Factories/RedeemedCouponFactory.php new file mode 100644 index 00000000..7a27d833 --- /dev/null +++ b/tests/Database/Factories/RedeemedCouponFactory.php @@ -0,0 +1,37 @@ + + */ + public function definition(): array + { + return [ + 'name' => 'Test redemeed coupon', + 'model_type' => Cashier::$subscriptionModel, + 'model_id' => 1, + 'owner_type' => User::class, + 'owner_id' => 1, + 'times_left' => 1, + ]; + } +} diff --git a/tests/Database/Factories/RefundFactory.php b/tests/Database/Factories/RefundFactory.php new file mode 100644 index 00000000..a638d0b9 --- /dev/null +++ b/tests/Database/Factories/RefundFactory.php @@ -0,0 +1,37 @@ + + */ + public function definition(): array + { + return [ + 'owner_id' => 1, + 'owner_type' => User::class, + 'original_order_id' => 1, + 'mollie_refund_id' => 're_dummy_refund_id', + 'mollie_refund_status' => RefundStatus::STATUS_PENDING, + ]; + } +} diff --git a/tests/Database/Factories/SubscriptionFactory.php b/tests/Database/Factories/SubscriptionFactory.php new file mode 100644 index 00000000..e7f286d6 --- /dev/null +++ b/tests/Database/Factories/SubscriptionFactory.php @@ -0,0 +1,41 @@ + + */ + public function definition(): array + { + return [ + 'name' => 'dummy name', + 'plan' => 'monthly-10-1', + 'owner_id' => 1, + 'owner_type' => User::class, + 'cycle_started_at' => now(), + 'cycle_ends_at' => function (array $subscription) { + return Carbon::parse($subscription['cycle_started_at'])->addMonth(); + }, + 'tax_percentage' => 0, + ]; + } +} diff --git a/tests/Database/Factories/UserFactory.php b/tests/Database/Factories/UserFactory.php new file mode 100644 index 00000000..f64bffba --- /dev/null +++ b/tests/Database/Factories/UserFactory.php @@ -0,0 +1,29 @@ + + */ + public function definition(): array + { + return [ + 'name' => $this->faker->name, + 'email' => $this->faker->email, + ]; + } +} diff --git a/tests/database/migrations/create_users_table.php b/tests/Database/Migrations/create_users_table.php similarity index 100% rename from tests/database/migrations/create_users_table.php rename to tests/Database/Migrations/create_users_table.php diff --git a/tests/EventServiceProviderTest.php b/tests/EventServiceProviderTest.php index a23bbf93..0ca73d0f 100644 --- a/tests/EventServiceProviderTest.php +++ b/tests/EventServiceProviderTest.php @@ -6,6 +6,7 @@ use Laravel\Cashier\Cashier; use Laravel\Cashier\Events\OrderInvoiceAvailable; use Laravel\Cashier\Events\OrderPaymentPaid; +use Laravel\Cashier\Tests\Database\Factories\OrderFactory; class EventServiceProviderTest extends BaseTestCase { @@ -15,7 +16,7 @@ public function itIsWiredUpAndFiring() Event::fake(OrderInvoiceAvailable::class); $event = new OrderPaymentPaid( - factory(Cashier::$orderModel)->make(), + OrderFactory::new()->make(), $this->mock(Cashier::$paymentModel) ); diff --git a/tests/FirstPayment/Actions/AddBalanceTest.php b/tests/FirstPayment/Actions/AddBalanceTest.php index a443b6a4..3d6235ae 100644 --- a/tests/FirstPayment/Actions/AddBalanceTest.php +++ b/tests/FirstPayment/Actions/AddBalanceTest.php @@ -47,7 +47,7 @@ public function canCreateFromPayload() ], 'taxPercentage' => 0, 'description' => 'Adding some test balance', - ], factory(User::class)->make()); + ], User::factory()->make()); $this->assertInstanceOf(AddBalance::class, $action); @@ -61,7 +61,7 @@ public function canCreateFromPayload() public function canExecute() { $this->withPackageMigrations(); - $user = factory(User::class)->create(); + $user = User::factory()->create(); $this->assertFalse($user->hasCredit()); $action = new AddBalance( diff --git a/tests/FirstPayment/Actions/AddGenericOrderItemTest.php b/tests/FirstPayment/Actions/AddGenericOrderItemTest.php index b51f464f..d66531fa 100644 --- a/tests/FirstPayment/Actions/AddGenericOrderItemTest.php +++ b/tests/FirstPayment/Actions/AddGenericOrderItemTest.php @@ -48,7 +48,7 @@ public function canCreateFromPayload() ], 'taxPercentage' => 20, 'description' => 'Adding a test order item', - ], factory(User::class)->make()); + ], User::factory()->make()); $this->assertInstanceOf(AddGenericOrderItem::class, $action); $this->assertMoneyEURCents(5, $action->getSubtotal()); @@ -66,7 +66,7 @@ public function canCreateFromPayloadWithoutTaxPercentage() 'currency' => 'EUR', ], 'description' => 'Adding a test order item', - ], factory(User::class)->make(['taxPercentage' => 0])); + ], User::factory()->make(['taxPercentage' => 0])); $this->assertInstanceOf(AddGenericOrderItem::class, $action); $this->assertMoneyEURCents(5, $action->getSubtotal()); @@ -79,7 +79,7 @@ public function canCreateFromPayloadWithoutTaxPercentage() public function canExecute() { $this->withPackageMigrations(); - $user = factory(User::class)->create(['tax_percentage' => 20]); + $user = User::factory()->create(['tax_percentage' => 20]); $this->assertFalse($user->hasCredit()); $action = new AddGenericOrderItem( diff --git a/tests/FirstPayment/Actions/ApplySubscriptionCouponToPaymentTest.php b/tests/FirstPayment/Actions/ApplySubscriptionCouponToPaymentTest.php index 1f88c14c..6c934a54 100644 --- a/tests/FirstPayment/Actions/ApplySubscriptionCouponToPaymentTest.php +++ b/tests/FirstPayment/Actions/ApplySubscriptionCouponToPaymentTest.php @@ -7,6 +7,7 @@ use Laravel\Cashier\FirstPayment\Actions\ApplySubscriptionCouponToPayment as Action; use Laravel\Cashier\Order\OrderItemCollection; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\OrderItemFactory; use Laravel\Cashier\Tests\Fixtures\User; class ApplySubscriptionCouponToPaymentTest extends BaseTestCase @@ -25,8 +26,8 @@ protected function setUp(): void $this->withMockedCouponRepository(); $this->coupon = app()->make(CouponRepository::class)->findOrFail('test-coupon'); - $this->owner = factory(User::class)->make(); - $orderItems = factory(Cashier::$orderItemModel)->make([ + $this->owner = User::factory()->make(); + $orderItems = OrderItemFactory::new()->make([ 'unit_price' => 10000, 'currency' => 'EUR', ])->toCollection(); @@ -50,7 +51,7 @@ public function testTaxDefaultsToZero() /** @test */ public function testCreateFromPayloadReturnsNull() { - $this->assertNull(Action::createFromPayload(['foo' => 'bar'], factory(User::class)->make())); + $this->assertNull(Action::createFromPayload(['foo' => 'bar'], User::factory()->make())); } /** @test */ diff --git a/tests/FirstPayment/FirstPaymentBuilderTest.php b/tests/FirstPayment/FirstPaymentBuilderTest.php index b111fdee..c179810e 100644 --- a/tests/FirstPayment/FirstPaymentBuilderTest.php +++ b/tests/FirstPayment/FirstPaymentBuilderTest.php @@ -36,7 +36,7 @@ protected function setUp(): void /** @test */ public function canBuildPayload() { - $owner = factory(User::class)->create(); + $owner = User::factory()->create(); $this->assertEquals(0, $owner->orderItems()->count()); $this->assertEquals(0, $owner->orders()->count()); @@ -89,7 +89,7 @@ public function canBuildPayload() /** @test */ public function createsMolliePayment() { - $owner = factory(User::class)->create(); + $owner = User::factory()->create(); $this->assertEquals(0, $owner->orderItems()->count()); $this->assertEquals(0, $owner->orders()->count()); @@ -146,7 +146,7 @@ public function createsMolliePayment() /** @test */ public function parsesRedirectUrlPaymentIdUponPaymentCreation() { - $owner = factory(User::class)->create(); + $owner = User::factory()->create(); $builder = new FirstPaymentBuilder($owner, [ 'redirectUrl' => 'https://www.example.com/{payment_id}', @@ -198,7 +198,7 @@ public function parsesRedirectUrlPaymentIdUponPaymentCreation() /** @test */ public function storesLocalPaymentRecord() { - $owner = factory(User::class)->create(); + $owner = User::factory()->create(); $this->assertEquals(0, $owner->orderItems()->count()); $this->assertEquals(0, $owner->orders()->count()); diff --git a/tests/FirstPayment/FirstPaymentHandlerTest.php b/tests/FirstPayment/FirstPaymentHandlerTest.php index 222f4aab..8fbdcefa 100644 --- a/tests/FirstPayment/FirstPaymentHandlerTest.php +++ b/tests/FirstPayment/FirstPaymentHandlerTest.php @@ -23,7 +23,7 @@ public function handlesMolliePayments() $molliePayment = $this->getMandatePaymentStub(); - $owner = factory(User::class)->create([ + $owner = User::factory()->create([ 'id' => $molliePayment->metadata->owner->id, 'mollie_customer_id' => 'cst_unique_customer_id', ]); diff --git a/tests/Fixtures/User.php b/tests/Fixtures/User.php index 410f5104..874a832c 100644 --- a/tests/Fixtures/User.php +++ b/tests/Fixtures/User.php @@ -2,15 +2,20 @@ namespace Laravel\Cashier\Tests\Fixtures; +use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Laravel\Cashier\Billable; use Laravel\Cashier\Order\Contracts\ProvidesInvoiceInformation; +use Laravel\Cashier\Tests\Database\Factories\UserFactory; class User extends Model implements ProvidesInvoiceInformation { use Billable; + use HasFactory; - protected $dates = ['trial_ends_at']; + protected $casts = [ + 'trial_ends_at' => 'datetime', + ]; /** * The attributes that are not mass assignable. @@ -40,4 +45,14 @@ public function getExtraBillingInformation() { return $this->extra_billing_information; } + + /** + * Create a new factory instance for the model. + * + * @return \Illuminate\Database\Eloquent\Factories\Factory + */ + protected static function newFactory() + { + return UserFactory::new(); + } } diff --git a/tests/Http/Controllers/AftercareWebhookControllerTest.php b/tests/Http/Controllers/AftercareWebhookControllerTest.php index 7dc0eac7..7c9eaebc 100644 --- a/tests/Http/Controllers/AftercareWebhookControllerTest.php +++ b/tests/Http/Controllers/AftercareWebhookControllerTest.php @@ -14,6 +14,7 @@ use Laravel\Cashier\Order\OrderItemCollection; use Laravel\Cashier\Refunds\RefundItemCollection; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\SubscriptionFactory; use Laravel\Cashier\Tests\Fixtures\User; use Mollie\Api\MollieApiClient; use Mollie\Api\Resources\Payment as MolliePayment; @@ -81,9 +82,9 @@ public function itDetectsNewRefunds() $molliePaymentId = 'tr_123xyz'; $mollieRefundId = 're_456abc'; - $user = factory(User::class)->create(); + $user = User::factory()->create(); - $subscription = $user->subscriptions()->save(factory(Cashier::$subscriptionModel)->make([ + $subscription = $user->subscriptions()->save(SubscriptionFactory::new()->make([ 'plan' => 'monthly-10-1', ])); diff --git a/tests/Http/Controllers/WebhookControllerTest.php b/tests/Http/Controllers/WebhookControllerTest.php index 43f596fa..abb08c17 100644 --- a/tests/Http/Controllers/WebhookControllerTest.php +++ b/tests/Http/Controllers/WebhookControllerTest.php @@ -13,6 +13,8 @@ use Laravel\Cashier\Mollie\Contracts\UpdateMolliePayment; use Laravel\Cashier\Order\OrderItemCollection; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\OrderFactory; +use Laravel\Cashier\Tests\Database\Factories\SubscriptionFactory; use Laravel\Cashier\Tests\Fixtures\User; use Laravel\Cashier\Types\SubscriptionCancellationReason; use Mollie\Api\Exceptions\ApiException; @@ -94,8 +96,8 @@ public function handlesPaymentFailed() $this->withTestNow('2019-01-01'); Event::fake(); - $user = factory(User::class)->create(); - $subscription = $user->subscriptions()->save(factory(Cashier::$subscriptionModel)->make([ + $user = User::factory()->create(); + $subscription = $user->subscriptions()->save(SubscriptionFactory::new()->make([ 'plan' => 'monthly-10-1', ])); $item = $subscription->scheduleNewOrderItemAt(now()); @@ -172,8 +174,8 @@ public function handlesPaymentPaid() $this->withConfiguredPlans(); Event::fake(); - $user = factory(User::class)->create(); - $subscription = $user->subscriptions()->save(factory(Cashier::$subscriptionModel)->make([ + $user = User::factory()->create(); + $subscription = $user->subscriptions()->save(SubscriptionFactory::new()->make([ 'plan' => 'monthly-10-1', ])); $item = $subscription->scheduleNewOrderItemAt(now()); @@ -239,7 +241,7 @@ public function skipsIfPaymentStatusUnchanged() $paymentId = 'tr_payment_paid_id'; - factory(Cashier::$orderModel)->create([ + OrderFactory::new()->create([ 'mollie_payment_id' => $paymentId, 'mollie_payment_status' => 'paid', ]); diff --git a/tests/Order/InvoiceTest.php b/tests/Order/InvoiceTest.php index 98b0433b..29fc9275 100644 --- a/tests/Order/InvoiceTest.php +++ b/tests/Order/InvoiceTest.php @@ -7,6 +7,7 @@ use Laravel\Cashier\Cashier; use Laravel\Cashier\Order\Invoice; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\OrderItemFactory; use Money\Currency; use Money\Money; @@ -15,21 +16,21 @@ class InvoiceTest extends BaseTestCase /** @test */ public function canAddItemsToInvoice() { - $itemA = factory(Cashier::$orderItemModel)->make([ + $itemA = OrderItemFactory::new()->make([ 'unit_price' => 1000, 'quantity' => 2, 'tax_percentage' => 21.5, 'currency' => 'EUR', ]); - $itemB = factory(Cashier::$orderItemModel)->make([ + $itemB = OrderItemFactory::new()->make([ 'unit_price' => 1000, 'quantity' => 2, 'tax_percentage' => 21.5, 'currency' => 'EUR', ]); - $itemC = factory(Cashier::$orderItemModel)->make([ + $itemC = OrderItemFactory::new()->make([ 'unit_price' => 1000, 'quantity' => 2, 'tax_percentage' => 9.5, @@ -165,7 +166,7 @@ public function canSetUsedBalance() /** @test */ public function canGetAsView() { - $items = factory(Cashier::$orderItemModel, 2)->make(); + $items = OrderItemFactory::new()->times(2)->make(); $invoice = new Invoice('EUR'); $invoice = $invoice->addItems($items); @@ -184,7 +185,7 @@ public function canGetAsView() /** @test */ public function canGetAsPdf() { - $items = factory(Cashier::$orderItemModel, 2)->make(); + $items = OrderItemFactory::new()->times(2)->make(); $invoice = new Invoice('EUR'); $invoice = $invoice->addItems($items); @@ -198,7 +199,7 @@ public function canGetAsPdf() public function canGetAsDownloadResponse() { Carbon::setTestNow(Carbon::parse('2018-12-31')); - $items = factory(Cashier::$orderItemModel, 2)->make(); + $items = OrderItemFactory::new()->times(2)->make(); config(['app.name' => 'FooBar']); $invoice = new Invoice('EUR'); diff --git a/tests/Order/OrderCollectionTest.php b/tests/Order/OrderCollectionTest.php index 238eeb5e..72a8ef4d 100644 --- a/tests/Order/OrderCollectionTest.php +++ b/tests/Order/OrderCollectionTest.php @@ -2,9 +2,9 @@ namespace Laravel\Cashier\Tests\Order; -use Laravel\Cashier\Cashier; use Laravel\Cashier\Order\Invoice; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\OrderFactory; use Laravel\Cashier\Tests\Fixtures\User; class OrderCollectionTest extends BaseTestCase @@ -13,8 +13,8 @@ class OrderCollectionTest extends BaseTestCase public function canGetInvoices() { $this->withPackageMigrations(); - $user = factory(User::class)->create(); - $orders = $user->orders()->saveMany(factory(Cashier::$orderModel, 2)->make()); + $user = User::factory()->create(); + $orders = $user->orders()->saveMany(OrderFactory::new()->times(2)->make()); $invoices = $orders->invoices(); diff --git a/tests/Order/OrderInvoiceSubscriberTest.php b/tests/Order/OrderInvoiceSubscriberTest.php index 5ca5248a..23aeae56 100644 --- a/tests/Order/OrderInvoiceSubscriberTest.php +++ b/tests/Order/OrderInvoiceSubscriberTest.php @@ -10,6 +10,7 @@ use Laravel\Cashier\Order\OrderInvoiceSubscriber; use Laravel\Cashier\Payment as CashierPayment; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\OrderFactory; use Mollie\Api\Resources\Payment; class OrderInvoiceSubscriberTest extends BaseTestCase @@ -51,6 +52,6 @@ private function assertItHandlesEvent($event, $methodName) private function order() { - return factory(Cashier::$orderModel)->make(); + return OrderFactory::new()->make(); } } diff --git a/tests/Order/OrderItemCollectionTest.php b/tests/Order/OrderItemCollectionTest.php index 03940089..ea218284 100644 --- a/tests/Order/OrderItemCollectionTest.php +++ b/tests/Order/OrderItemCollectionTest.php @@ -6,6 +6,7 @@ use Laravel\Cashier\Cashier; use Laravel\Cashier\Order\OrderItemCollection; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\OrderItemFactory; use Laravel\Cashier\Tests\Fixtures\User; class OrderItemCollectionTest extends BaseTestCase @@ -14,9 +15,9 @@ class OrderItemCollectionTest extends BaseTestCase public function testCurrencies() { $collection = new OrderItemCollection([ - factory(Cashier::$orderItemModel)->states('USD')->make(), - factory(Cashier::$orderItemModel)->states('USD')->make(), - factory(Cashier::$orderItemModel)->states('EUR')->make(), + OrderItemFactory::new()->USD()->make(), + OrderItemFactory::new()->USD()->make(), + OrderItemFactory::new()->EUR()->make(), ]); $this->assertEquals(collect(['USD', 'EUR']), $collection->currencies()); @@ -26,8 +27,8 @@ public function testCurrencies() public function testCurrency() { $collection = new OrderItemCollection([ - factory(Cashier::$orderItemModel)->states('USD')->make(), - factory(Cashier::$orderItemModel)->states('USD')->make(), + OrderItemFactory::new()->USD()->make(), + OrderItemFactory::new()->USD()->make(), ]); $this->assertEquals('USD', $collection->currency()); @@ -37,8 +38,8 @@ public function testCurrency() public function testCurrencyThrowsExceptionWhenMultipleCurrenciesAreUsed() { $collection = new OrderItemCollection([ - factory(Cashier::$orderItemModel)->states('USD')->make(), - factory(Cashier::$orderItemModel)->states('EUR')->make(), + OrderItemFactory::new()->USD()->make(), + OrderItemFactory::new()->EUR()->make(), ]); $this->assertEquals(collect(['USD', 'EUR']), $collection->currencies()); @@ -51,12 +52,12 @@ public function testCurrencyThrowsExceptionWhenMultipleCurrenciesAreUsed() public function canGetTotal() { $collection = new OrderItemCollection([ - factory(Cashier::$orderItemModel)->states('EUR')->make([ + OrderItemFactory::new()->EUR()->make([ 'unit_price' => 12150, 'quantity' => 1, 'tax_percentage' => 10.0, ]), - factory(Cashier::$orderItemModel)->states('EUR')->make([ + OrderItemFactory::new()->EUR()->make([ 'unit_price' => 12150, 'quantity' => 2, 'tax_percentage' => 10.0, @@ -70,8 +71,8 @@ public function canGetTotal() public function cannotGetTotalForMultipleCurrencies() { $collection = new OrderItemCollection([ - factory(Cashier::$orderItemModel)->states('USD')->make(), - factory(Cashier::$orderItemModel)->states('EUR')->make(), + OrderItemFactory::new()->USD()->make(), + OrderItemFactory::new()->EUR()->make(), ]); $this->expectException(\LogicException::class); @@ -84,8 +85,8 @@ public function testOwners() { $this->withPackageMigrations(); - factory(User::class, 3)->create()->each(function ($owner) { - $owner->orderItems()->saveMany(factory(Cashier::$orderItemModel, 2)->make()); + User::factory(3)->create()->each(function ($owner) { + $owner->orderItems()->saveMany(OrderItemFactory::new()->times(2)->make()); }); $owners = Cashier::$orderItemModel::all()->owners(); @@ -99,15 +100,15 @@ public function testOwners() /** @test */ public function testWhereOwners() { - $item1 = factory(Cashier::$orderItemModel)->make([ + $item1 = OrderItemFactory::new()->make([ 'owner_id' => 1, 'owner_type' => User::class, ]); - $item2 = factory(Cashier::$orderItemModel)->make([ + $item2 = OrderItemFactory::new()->make([ 'owner_id' => 2, 'owner_type' => User::class, ]); - $item3 = factory(Cashier::$orderItemModel)->make([ + $item3 = OrderItemFactory::new()->make([ 'owner_id' => 2, 'owner_type' => User::class, ]); @@ -136,9 +137,9 @@ public function testWhereOwners() /** @test */ public function testWhereCurrency() { - $item1 = factory(Cashier::$orderItemModel)->states('EUR')->make(); - $item2 = factory(Cashier::$orderItemModel)->states('USD')->make(); - $item3 = factory(Cashier::$orderItemModel)->states('USD')->make(); + $item1 = OrderItemFactory::new()->EUR()->make(); + $item2 = OrderItemFactory::new()->USD()->make(); + $item3 = OrderItemFactory::new()->USD()->make(); $collection = new OrderItemCollection([$item1, $item2, $item3]); @@ -161,19 +162,19 @@ public function testChunkByOwner() { $this->withPackageMigrations(); - factory(User::class)->create(['id' => 1]); - factory(User::class)->create(['id' => 2]); + User::factory()->create(['id' => 1]); + User::factory()->create(['id' => 2]); $collection = new OrderItemCollection([ - factory(Cashier::$orderItemModel)->make([ + OrderItemFactory::new()->make([ 'owner_id' => 1, 'owner_type' => User::class, ]), - factory(Cashier::$orderItemModel)->make([ + OrderItemFactory::new()->make([ 'owner_id' => 2, 'owner_type' => User::class, ]), - factory(Cashier::$orderItemModel)->make([ + OrderItemFactory::new()->make([ 'owner_id' => 2, 'owner_type' => User::class, ]), @@ -198,9 +199,9 @@ public function testChunkByOwner() public function testChunkByCurrency() { $collection = new OrderItemCollection([ - factory(Cashier::$orderItemModel)->states('USD')->make(), - factory(Cashier::$orderItemModel)->states('USD')->make(), - factory(Cashier::$orderItemModel)->states('EUR')->make(), + OrderItemFactory::new()->USD()->make(), + OrderItemFactory::new()->USD()->make(), + OrderItemFactory::new()->EUR()->make(), ]); $result = $collection->chunkByCurrency(); @@ -216,19 +217,19 @@ public function testChunkByOwnerAndCurrency() { $this->withPackageMigrations(); - factory(User::class)->create(['id' => 1]); - factory(User::class)->create(['id' => 2]); + User::factory()->create(['id' => 1]); + User::factory()->create(['id' => 2]); $collection = new OrderItemCollection([ - factory(Cashier::$orderItemModel)->states('USD')->make([ + OrderItemFactory::new()->USD()->make([ 'owner_id' => 1, 'owner_type' => User::class, ]), - factory(Cashier::$orderItemModel)->states('USD')->make([ + OrderItemFactory::new()->USD()->make([ 'owner_id' => 2, 'owner_type' => User::class, ]), - factory(Cashier::$orderItemModel)->states('EUR')->make([ + OrderItemFactory::new()->EUR()->make([ 'owner_id' => 2, 'owner_type' => User::class, ]), @@ -250,9 +251,9 @@ public function testChunkByOwnerAndCurrency() public function testTaxPercentages() { $collection = new OrderItemCollection([ - factory(Cashier::$orderItemModel)->make(['tax_percentage' => 21.5]), - factory(Cashier::$orderItemModel)->make(['tax_percentage' => 21.5]), - factory(Cashier::$orderItemModel)->make(['tax_percentage' => 6]), + OrderItemFactory::new()->make(['tax_percentage' => 21.5]), + OrderItemFactory::new()->make(['tax_percentage' => 21.5]), + OrderItemFactory::new()->make(['tax_percentage' => 6]), ]); $this->assertEquals(['6', '21.5'], $collection->taxPercentages()->all()); diff --git a/tests/Order/OrderItemPreprocessorCollectionTest.php b/tests/Order/OrderItemPreprocessorCollectionTest.php index 6667542b..e395af53 100644 --- a/tests/Order/OrderItemPreprocessorCollectionTest.php +++ b/tests/Order/OrderItemPreprocessorCollectionTest.php @@ -6,15 +6,16 @@ use Laravel\Cashier\Order\OrderItemCollection; use Laravel\Cashier\Order\OrderItemPreprocessorCollection; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\OrderItemFactory; class OrderItemPreprocessorCollectionTest extends BaseTestCase { /** @test */ public function handlesOrderItem() { - $fakePreprocessor = $this->getFakePreprocessor(factory(Cashier::$orderItemModel, 2)->make()); + $fakePreprocessor = $this->getFakePreprocessor(OrderItemFactory::new()->times(2)->make()); $preprocessors = new OrderItemPreprocessorCollection([$fakePreprocessor]); - $item = factory(Cashier::$orderItemModel)->make(); + $item = OrderItemFactory::new()->make(); $result = $preprocessors->handle($item); @@ -26,10 +27,10 @@ public function handlesOrderItem() /** @test */ public function invokesPreprocessorsOneByOne() { - $preprocessor1 = $this->getFakePreprocessor(factory(Cashier::$orderItemModel, 1)->make()); - $preprocessor2 = $this->getFakePreprocessor(factory(Cashier::$orderItemModel, 2)->make()); + $preprocessor1 = $this->getFakePreprocessor(OrderItemFactory::new()->times(1)->make()); + $preprocessor2 = $this->getFakePreprocessor(OrderItemFactory::new()->times(2)->make()); $preprocessors = new OrderItemPreprocessorCollection([$preprocessor1, $preprocessor2]); - $item = factory(Cashier::$orderItemModel)->make(); + $item = OrderItemFactory::new()->make(); $result = $preprocessors->handle($item); @@ -41,7 +42,7 @@ public function invokesPreprocessorsOneByOne() public function handlesEmptyPreprocessorCollection() { $preprocessors = new OrderItemPreprocessorCollection; - $item = factory(Cashier::$orderItemModel)->make(); + $item = OrderItemFactory::new()->make(); $result = $preprocessors->handle($item); diff --git a/tests/Order/OrderItemTest.php b/tests/Order/OrderItemTest.php index 0a724f82..1deaa20c 100644 --- a/tests/Order/OrderItemTest.php +++ b/tests/Order/OrderItemTest.php @@ -5,6 +5,7 @@ use Laravel\Cashier\Cashier; use Laravel\Cashier\Order\OrderItemCollection; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\OrderItemFactory; class OrderItemTest extends BaseTestCase { @@ -67,10 +68,10 @@ public function testScopeProcessed() { $this->withPackageMigrations(); - factory(Cashier::$orderItemModel, 3)->create([ + OrderItemFactory::new()->times(3)->create([ 'order_id' => null, ]); - factory(Cashier::$orderItemModel, 2)->create([ + OrderItemFactory::new()->times(2)->create([ 'order_id' => 1, ]); @@ -83,10 +84,10 @@ public function testScopeUnprocessed() { $this->withPackageMigrations(); - factory(Cashier::$orderItemModel, 3)->create([ + OrderItemFactory::new()->times(3)->create([ 'order_id' => null, ]); - factory(Cashier::$orderItemModel, 2)->create([ + OrderItemFactory::new()->times(2)->create([ 'order_id' => 1, ]); @@ -99,15 +100,15 @@ public function testScopeShouldProcess() { $this->withPackageMigrations(); - factory(Cashier::$orderItemModel, 2)->create([ + OrderItemFactory::new()->times(2)->create([ 'order_id' => 1, 'process_at' => now()->subHour(), ]); - factory(Cashier::$orderItemModel, 2)->create([ + OrderItemFactory::new()->times(2)->create([ 'order_id' => null, 'process_at' => now()->addDay(), ]); - factory(Cashier::$orderItemModel, 3)->create([ + OrderItemFactory::new()->times(3)->create([ 'order_id' => null, 'process_at' => now()->subHour(), ]); @@ -119,10 +120,10 @@ public function testScopeDue() { $this->withPackageMigrations(); - factory(Cashier::$orderItemModel, 2)->create([ + OrderItemFactory::new()->times(2)->create([ 'process_at' => now()->subHour(), ]); - factory(Cashier::$orderItemModel, 3)->create([ + OrderItemFactory::new()->times(3)->create([ 'process_at' => now()->addMinutes(5), ]); @@ -131,14 +132,14 @@ public function testScopeDue() public function testNewCollection() { - $collection = factory(Cashier::$orderItemModel, 2)->make(); + $collection = OrderItemFactory::new()->times(2)->make(); $this->assertInstanceOf(OrderItemCollection::class, $collection); } public function testIsProcessed() { - $unprocessedItem = factory(Cashier::$orderItemModel)->make(['order_id' => null]); - $processedItem = factory(Cashier::$orderItemModel)->make(['order_id' => 1]); + $unprocessedItem = OrderItemFactory::new()->make(['order_id' => null]); + $processedItem = OrderItemFactory::new()->make(['order_id' => 1]); $this->assertFalse($unprocessedItem->isProcessed()); $this->assertTrue($unprocessedItem->isProcessed(false)); diff --git a/tests/Order/OrderNumberGeneratorTest.php b/tests/Order/OrderNumberGeneratorTest.php index 163530f8..caf5a8ac 100644 --- a/tests/Order/OrderNumberGeneratorTest.php +++ b/tests/Order/OrderNumberGeneratorTest.php @@ -7,6 +7,7 @@ use Laravel\Cashier\Cashier; use Laravel\Cashier\Order\OrderNumberGenerator; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\OrderFactory; class OrderNumberGeneratorTest extends BaseTestCase { @@ -41,7 +42,7 @@ public function usesConfiguredOffsetAndModelCount() $this->assertTrue(Str::endsWith($this->generator->generate(), '16')); - factory(Cashier::$orderModel, 3)->create(); + OrderFactory::new()->times(3)->create(); $this->assertTrue(Str::endsWith($this->generator->generate(), '19')); } diff --git a/tests/Order/OrderTest.php b/tests/Order/OrderTest.php index 1057b82e..64744cc1 100644 --- a/tests/Order/OrderTest.php +++ b/tests/Order/OrderTest.php @@ -21,6 +21,9 @@ use Laravel\Cashier\Order\OrderItemCollection; use Laravel\Cashier\Subscription; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\OrderFactory; +use Laravel\Cashier\Tests\Database\Factories\OrderItemFactory; +use Laravel\Cashier\Tests\Database\Factories\SubscriptionFactory; use Laravel\Cashier\Tests\Fixtures\User; use Mollie\Api\MollieApiClient; use Mollie\Api\Resources\Customer; @@ -103,7 +106,7 @@ public function canCreateFromOrderItemsAndProcess() $subscription = $this->createMonthlySubscription(); $subscription->orderItems()->saveMany( - factory(Cashier::$orderItemModel, 2)->make([ + OrderItemFactory::new()->times(2)->make([ 'process_at' => now()->subMinute(), // sub minute so we're sure it's ready to be processed 'owner_id' => $user->id, 'owner_type' => get_class($user), @@ -145,8 +148,8 @@ public function canCreateFromOrderItemsAndProcess() /** @test */ public function creatingANewOrderSchedulesNextOrderItems() { - $user = factory(User::class)->create(['id' => 2]); - $subscription = factory(Cashier::$subscriptionModel)->create([ + $user = User::factory()->create(['id' => 2]); + $subscription = SubscriptionFactory::new()->create([ 'owner_id' => $user->id, 'owner_type' => get_class($user), 'plan' => 'monthly-10-1', @@ -182,7 +185,7 @@ public function creatingANewOrderSchedulesNextOrderItems() /** @test */ public function yieldsOrderCollection() { - $collection = factory(Cashier::$orderModel, 2)->make(); + $collection = OrderFactory::new()->times(2)->make(); $this->assertInstanceOf(OrderCollection::class, $collection); } @@ -197,7 +200,7 @@ public function handlesOwnerBalance() $this->assertMoneyEURCents(1500, $user->credit('EUR')->money()); - $subscription = factory(Cashier::$subscriptionModel)->create([ + $subscription = SubscriptionFactory::new()->create([ 'owner_id' => $user->id, 'owner_type' => get_class($user), 'plan' => 'monthly-10-1', @@ -257,8 +260,8 @@ public function handlesOwnerBalance() /** @test */ public function canGetInvoice() { - $user = factory(User::class)->create(['extra_billing_information' => "Some dummy\nextra billing information"]); - $items = factory(Cashier::$orderItemModel, 2)->states(['unlinked', 'EUR'])->create([ + $user = User::factory()->create(['extra_billing_information' => "Some dummy\nextra billing information"]); + $items = OrderItemFactory::new()->times(2)->unlinked()->EUR()->create([ 'owner_id' => $user->id, 'owner_type' => User::class, 'unit_price' => 12150, @@ -292,7 +295,7 @@ public function doesNotProcessPaymentIfTotalDueIsZero() Event::fake(); $user = $this->getMandatedUser(true); - $order = $user->orders()->save(factory(Cashier::$orderModel)->make([ + $order = $user->orders()->save(OrderFactory::new()->make([ 'total' => 0, 'total_due' => 0, 'currency' => 'EUR', @@ -370,7 +373,7 @@ public function createsAMolliePaymentIfTotalDueIsLargerThanMolliesMinimum() 'mollie_customer_id' => 'cst_unique_customer_id', ]); - $order = $user->orders()->save(factory(Cashier::$orderModel)->make([ + $order = $user->orders()->save(OrderFactory::new()->make([ 'total' => 1025, 'total_due' => 1025, 'currency' => 'EUR', @@ -448,7 +451,7 @@ public function createsAMolliePaymentIfMolliesMaximumIsNull() 'mollie_customer_id' => 'cst_unique_customer_id', ]); - $order = $user->orders()->save(factory(Cashier::$orderModel)->make([ + $order = $user->orders()->save(OrderFactory::new()->make([ 'total' => 1025, 'total_due' => 1025, 'currency' => 'EUR', @@ -512,7 +515,7 @@ public function notCreatesAMolliePaymentIfTotalDueIsGreathenThanMolliesMaximum() 'mollie_customer_id' => 'cst_unique_customer_id', ]); - $order = $user->orders()->save(factory(Cashier::$orderModel)->make([ + $order = $user->orders()->save(OrderFactory::new()->make([ 'total' => 1025, 'total_due' => 1025, 'currency' => 'EUR', @@ -557,7 +560,7 @@ public function handlesAnInvalidMandateWhenProcessingThePayment() 'mollie_customer_id' => 'cst_unique_customer_id', ]); - $order = $user->orders()->save(factory(Cashier::$orderModel)->make([ + $order = $user->orders()->save(OrderFactory::new()->make([ 'total' => 1025, 'total_due' => 1025, 'currency' => 'EUR', @@ -635,7 +638,7 @@ public function canRetryAFailedOrderNow() 'mollie_customer_id' => 'cst_unique_customer_id', ]); - $order = $user->orders()->save(factory(Cashier::$orderModel)->make([ + $order = $user->orders()->save(OrderFactory::new()->make([ 'processed_at' => now()->subMinutes(5), 'total' => 10.25, 'total_due' => 10.25, @@ -708,11 +711,11 @@ public function storesOwnerCreditIfTotalIsPositiveAndSmallerThanMolliesMinimum() 'mollie_mandate_id' => 'mdt_unique_mandate_id', 'mollie_customer_id' => 'cst_unique_customer_id', ]); - $subscription = $user->subscriptions()->save(factory(Cashier::$subscriptionModel)->make([ + $subscription = $user->subscriptions()->save(SubscriptionFactory::new()->make([ 'plan' => 'monthly-10-1', ])); - $order = $user->orders()->save(factory(Cashier::$orderModel)->make([ + $order = $user->orders()->save(OrderFactory::new()->make([ 'total' => 25, 'total_due' => 25, // minimum for processing is 100 'currency' => 'EUR', @@ -739,11 +742,11 @@ public function storesOwnerCreditIfTotalDueIsNegativeAndOwnerHasActiveSubscripti Event::fake(); $user = $this->getMandatedUser(true); - $subscription = $user->subscriptions()->save(factory(Cashier::$subscriptionModel)->make([ + $subscription = $user->subscriptions()->save(SubscriptionFactory::new()->make([ 'plan' => 'monthly-10-1', ])); - $order = $user->orders()->save(factory(Cashier::$orderModel)->make([ + $order = $user->orders()->save(OrderFactory::new()->make([ 'total' => -1025, 'total_due' => -1025, 'currency' => 'EUR', @@ -774,7 +777,7 @@ public function handlesNegativeTotalDueAndOwnerHasNoActiveSubscription() $user = $this->getMandatedUser(true); - $order = $user->orders()->save(factory(Cashier::$orderModel)->make([ + $order = $user->orders()->save(OrderFactory::new()->make([ 'total' => -1, 'total_due' => -1, 'currency' => 'EUR', @@ -806,9 +809,9 @@ public function canCreateOrderFromOrderItemsWhenTotalValueIsNegativeAndOwnerHasN { Carbon::setTestNow(Carbon::parse('2018-01-01')); Event::fake(); - $user = factory(User::class)->create(); // user without subscription/mandate + $user = User::factory()->create(); // user without subscription/mandate - factory(Cashier::$orderItemModel, 2)->create([ + OrderItemFactory::new()->times(2)->create([ 'orderable_type' => null, 'orderable_id' => null, 'process_at' => now()->subMinute(), // sub minute so we're sure it's ready to be processed @@ -857,10 +860,10 @@ public function canCreateOrderFromOrderItemsWhenTotalIsPaidByCreditAndOwnerHasNo { Carbon::setTestNow(Carbon::parse('2018-01-01')); Event::fake(); - $user = factory(User::class)->create(); // user without subscription/mandate + $user = User::factory()->create(); // user without subscription/mandate $user->addCredit(new Money(29998, new Currency('EUR'))); - factory(Cashier::$orderItemModel, 2)->create([ + OrderItemFactory::new()->times(2)->create([ 'orderable_type' => null, 'orderable_id' => null, 'process_at' => now()->subMinute(), // sub minute so we're sure it's ready to be processed @@ -909,13 +912,13 @@ public function canCreateProcessedOrderFromItems() { Event::fake(); - $user = factory(User::class)->create([ + $user = User::factory()->create([ 'id' => 2, 'mollie_customer_id' => $this->getMandatedCustomerId(), ]); $items = $user->orderItems()->saveMany( - factory(Cashier::$orderItemModel, 3)->states(['unprocessed', 'unlinked'])->make() + OrderItemFactory::new()->times(3)->unprocessed()->unlinked()->make() ); $items->each(function ($item) { @@ -947,8 +950,8 @@ public function findByMolliePaymentIdWorks() { $this->assertNull(Cashier::$orderModel::findByMolliePaymentId('tr_xxxxx1234dummy')); - $order = factory(Cashier::$orderModel)->create(['mollie_payment_id' => 'tr_xxxxx1234dummy']); - $otherOrder = factory(Cashier::$orderModel)->create(['mollie_payment_id' => 'tr_wrong_order']); + $order = OrderFactory::new()->create(['mollie_payment_id' => 'tr_xxxxx1234dummy']); + $otherOrder = OrderFactory::new()->create(['mollie_payment_id' => 'tr_wrong_order']); $found = Cashier::$orderModel::findByMolliePaymentId('tr_xxxxx1234dummy'); @@ -966,8 +969,8 @@ public function findByMolliePaymentIdOrFailThrowsAnExceptionIfNotFound() /** @test */ public function findByMolliePaymentIdOrFailWorks() { - $order = factory(Cashier::$orderModel)->create(['mollie_payment_id' => 'tr_xxxxx1234dummy']); - $otherOrder = factory(Cashier::$orderModel)->create(['mollie_payment_id' => 'tr_wrong_order']); + $order = OrderFactory::new()->create(['mollie_payment_id' => 'tr_xxxxx1234dummy']); + $otherOrder = OrderFactory::new()->create(['mollie_payment_id' => 'tr_wrong_order']); $found = Cashier::$orderModel::findByMolliePaymentIdOrFail('tr_xxxxx1234dummy'); @@ -981,9 +984,9 @@ public function findByMolliePaymentIdOrFailWorks() */ public function generateNewExampleInvoice() { - $user = factory(User::class)->create(['extra_billing_information' => 'Some dummy extra billing information']); + $user = User::factory()->create(['extra_billing_information' => 'Some dummy extra billing information']); $user->addCredit(new Money(500, new Currency('EUR'))); - $items = factory(Cashier::$orderItemModel, 2)->states(['unlinked', 'EUR'])->create([ + $items = OrderItemFactory::new()->times(2)->unlinked()->EUR()->create([ 'owner_id' => $user->id, 'owner_type' => User::class, 'quantity' => 2, @@ -992,14 +995,14 @@ public function generateNewExampleInvoice() $invoice = $order->invoice('2019-0000-0001', Carbon::parse('2019-05-06')); - $filename = __DIR__.'/../../example_invoice_output.html'; + $filename = __DIR__ . '/../../example_invoice_output.html'; $some_content = 'Invoice dummy'; if (collect($this->getGroups())->contains('generate_new_invoice_template')) { $this->assertFileIsWritable($filename); if (is_writable($filename)) { - if (! $handle = fopen($filename, 'w')) { + if (!$handle = fopen($filename, 'w')) { echo "Cannot open file ($filename)"; exit; } @@ -1013,7 +1016,7 @@ public function generateNewExampleInvoice() fclose($handle); } else { - $this->fail('Cannot write example invoice to '.$filename); + $this->fail('Cannot write example invoice to ' . $filename); } } $this->assertTrue(true, 'Unable to generate dummy invoice.'); @@ -1026,7 +1029,7 @@ public function generateNewExampleInvoice() */ private function createMonthlySubscription() { - return factory(Cashier::$subscriptionModel)->create([ + return SubscriptionFactory::new()->create([ 'owner_id' => 2, 'owner_type' => User::class, 'plan' => 'monthly-10-1', diff --git a/tests/Refunds/RefundTest.php b/tests/Refunds/RefundTest.php index d6c66623..3d813c95 100644 --- a/tests/Refunds/RefundTest.php +++ b/tests/Refunds/RefundTest.php @@ -11,6 +11,8 @@ use Laravel\Cashier\Refunds\Refund; use Laravel\Cashier\Refunds\RefundItemCollection; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\OrderItemFactory; +use Laravel\Cashier\Tests\Database\Factories\RefundFactory; use Mollie\Api\Types\RefundStatus as MollieRefundStatus; class RefundTest extends BaseTestCase @@ -22,12 +24,12 @@ public function canHandleProcessedMollieRefund() $this->withPackageMigrations(); $user = $this->getCustomerUser(); - $originalOrderItems = factory(Cashier::$orderItemModel, 2)->create(); + $originalOrderItems = OrderItemFactory::new()->times(2)->create(); $originalOrder = Cashier::$orderModel::createProcessedFromItems($originalOrderItems); $this->assertMoneyEURCents(0, $originalOrder->getAmountRefunded()); /** @var Refund $refund */ - $refund = factory(Cashier::$refundModel)->create([ + $refund = RefundFactory::new()->create([ 'total' => 29524, 'currency' => 'EUR', ]); @@ -61,12 +63,12 @@ public function canHandleFailedMollieRefund() $this->withPackageMigrations(); $user = $this->getCustomerUser(); - $originalOrderItems = factory(Cashier::$orderItemModel, 2)->create(); + $originalOrderItems = OrderItemFactory::new()->times(2)->create(); $originalOrder = Cashier::$orderModel::createProcessedFromItems($originalOrderItems); $this->assertMoneyEURCents(0, $originalOrder->getAmountRefunded()); /** @var Refund $refund */ - $refund = factory(Cashier::$refundModel)->create([ + $refund = RefundFactory::new()->create([ 'total' => 29524, 'currency' => 'EUR', ]); diff --git a/tests/Refunds/RefundsBuilderTest.php b/tests/Refunds/RefundsBuilderTest.php index afe38b94..05be55c0 100644 --- a/tests/Refunds/RefundsBuilderTest.php +++ b/tests/Refunds/RefundsBuilderTest.php @@ -12,6 +12,7 @@ use Laravel\Cashier\Refunds\RefundBuilder; use Laravel\Cashier\Refunds\RefundItem; use Laravel\Cashier\Tests\BaseTestCase; +use Laravel\Cashier\Tests\Database\Factories\OrderItemFactory; use Mollie\Api\MollieApiClient; use Mollie\Api\Resources\Refund as MollieRefund; use Mollie\Api\Types\RefundStatus as MollieRefundStatus; @@ -44,12 +45,12 @@ public function can_create_a_refund_for_a_complete_order(): void $user = $this->getUser(); $orderItems = $user->orderItems()->createMany([ - factory(Cashier::$orderItemModel)->make([ + OrderItemFactory::new()->make([ 'unit_price' => 1000, 'tax_percentage' => 10, 'quantity' => 1, ])->toArray(), - factory(Cashier::$orderItemModel)->make([ + OrderItemFactory::new()->make([ 'unit_price' => 500, 'tax_percentage' => 10, 'quantity' => 2, diff --git a/tests/SubscriptionTest.php b/tests/SubscriptionTest.php index 7b52b301..d0f55da8 100644 --- a/tests/SubscriptionTest.php +++ b/tests/SubscriptionTest.php @@ -9,6 +9,8 @@ use Laravel\Cashier\Mollie\Contracts\GetMollieMandate; use Laravel\Cashier\Mollie\GetMollieCustomer; use Laravel\Cashier\Subscription; +use Laravel\Cashier\Tests\Database\Factories\OrderItemFactory; +use Laravel\Cashier\Tests\Database\Factories\SubscriptionFactory; use Laravel\Cashier\Tests\Fixtures\User; use LogicException; use Mollie\Api\MollieApiClient; @@ -26,10 +28,10 @@ protected function setUp(): void /** @test */ public function canAccessOwner() { - $user = factory(User::class)->create(); + $user = User::factory()->create(); $subscription = $user->subscriptions()->save( - factory(Cashier::$subscriptionModel)->make() + SubscriptionFactory::new()->make() ); $this->assertTrue($user->is($subscription->owner)); @@ -38,10 +40,10 @@ public function canAccessOwner() /** @test */ public function canAccessOrderItems() { - $subscription = factory(Cashier::$subscriptionModel)->create(); + $subscription = SubscriptionFactory::new()->create(); $items = $subscription->orderItems()->save( - factory(Cashier::$orderItemModel)->make() + OrderItemFactory::new()->make() ); $this->assertNotNull($items); @@ -64,7 +66,7 @@ public function cannotScheduleNewOrderItemIfIdIsSet() ], ]]); - $subscription = factory(Cashier::$subscriptionModel)->create([ + $subscription = SubscriptionFactory::new()->create([ 'scheduled_order_item_id' => 'should_be_empty', ]); @@ -76,7 +78,7 @@ public function cannotResumeIfNotCancelled() { $this->expectException(LogicException::class); - $subscription = factory(Cashier::$subscriptionModel)->create(); + $subscription = SubscriptionFactory::new()->create(); $this->assertFalse($subscription->cancelled()); @@ -92,7 +94,7 @@ public function cannotResumeIfNotOnGracePeriod() { $this->expectException(LogicException::class); - $subscription = factory(Cashier::$subscriptionModel)->create([ + $subscription = SubscriptionFactory::new()->create([ 'ends_at' => now()->subMonth(), ]); @@ -110,17 +112,17 @@ public function cannotResumeIfNotOnGracePeriod() public function getCycleProgressTest() { $now = now(); - $completed_subscription = factory(Cashier::$subscriptionModel)->make([ + $completed_subscription = SubscriptionFactory::new()->make([ 'cycle_started_at' => $now->copy()->subMonth(), 'cycle_ends_at' => $now->copy()->subDay(), ]); - $progressing_subscription = factory(Cashier::$subscriptionModel)->make([ + $progressing_subscription = SubscriptionFactory::new()->make([ 'cycle_started_at' => $now->copy()->subDays(3), 'cycle_ends_at' => $now->copy()->addDays(3), ]); - $unstarted_subscription = factory(Cashier::$subscriptionModel)->make([ + $unstarted_subscription = SubscriptionFactory::new()->make([ 'cycle_started_at' => $now->copy()->addDays(3), 'cycle_ends_at' => $now->copy()->addMonth(), ]); @@ -133,10 +135,10 @@ public function getCycleProgressTest() /** @test */ public function testSyncTaxPercentage() { - $user = factory(User::class)->create(); + $user = User::factory()->create(); $this->assertEquals(0, $user->taxPercentage()); - $subscription = factory(Cashier::$subscriptionModel)->create([ + $subscription = SubscriptionFactory::new()->create([ 'tax_percentage' => 21.5, ]); @@ -153,7 +155,7 @@ public function yieldsOrderItemsAtSetIntervals() $this->withMockedGetMollieCustomer('cst_unique_customer_id', 2); $this->withMockedGetMollieMandate(); - $user = factory(User::class)->create([ + $user = User::factory()->create([ 'mollie_mandate_id' => 'mdt_unique_mandate_id', 'mollie_customer_id' => 'cst_unique_customer_id', ]); @@ -236,7 +238,7 @@ public function yieldsOrderItemsAtSetIntervalsWithIntervalGenerator() $this->withMockedGetMollieCustomer('cst_unique_customer_id', 2); $this->withMockedGetMollieMandate(); - $user = factory(User::class)->create([ + $user = User::factory()->create([ 'mollie_mandate_id' => 'mdt_unique_mandate_id', 'mollie_customer_id' => 'cst_unique_customer_id', ]); @@ -319,7 +321,7 @@ public function yieldsOrderItemsAtSetIntervalsWithIntervalGeneratorLastDayOfTheM $this->withMockedGetMollieCustomer('cst_unique_customer_id', 2); $this->withMockedGetMollieMandate(); - $user = factory(User::class)->create([ + $user = User::factory()->create([ 'mollie_mandate_id' => 'mdt_unique_mandate_id', 'mollie_customer_id' => 'cst_unique_customer_id', ]); @@ -423,8 +425,8 @@ public function yieldsOrderItemsAtSetIntervalsWithIntervalGeneratorLastDayOfTheM public function cancelWorks() { $cycle_ends_at = now()->addWeek(); - $user = factory(User::class)->create(); - $subscription = $user->subscriptions()->save(factory(Cashier::$subscriptionModel)->make([ + $user = User::factory()->create(); + $subscription = $user->subscriptions()->save(SubscriptionFactory::new()->make([ 'cycle_ends_at' => $cycle_ends_at, ])); @@ -446,10 +448,11 @@ public function cancelWorks() /** @test */ public function cancelAtWorks() { - $user = factory(User::class)->create(); + $user = User::factory()->create(); $subscription = $user->subscriptions()->save( - factory(Cashier::$subscriptionModel)->make([ - 'cycle_ends_at' => now()->addWeek(), ]) + SubscriptionFactory::new()->make([ + 'cycle_ends_at' => now()->addWeek(), + ]) ); $this->assertFalse($subscription->onTrial()); @@ -470,10 +473,11 @@ public function cancelAtWorks() /** @test */ public function cancelNowWorks() { - $user = factory(User::class)->create(); + $user = User::factory()->create(); $subscription = $user->subscriptions()->save( - factory(Cashier::$subscriptionModel)->make([ - 'cycle_ends_at' => now()->addWeek(), ]) + SubscriptionFactory::new()->make([ + 'cycle_ends_at' => now()->addWeek(), + ]) ); $this->assertFalse($subscription->onTrial()); @@ -495,10 +499,10 @@ public function cancelNowWorks() public function resumingACancelledSubscriptionResetsCycleEndsAt() { $this->withConfiguredPlans(); - $user = factory(User::class)->create(); + $user = User::factory()->create(); /** @var Subscription $subscription */ - $subscription = $user->subscriptions()->save(factory(Cashier::$subscriptionModel)->make([ + $subscription = $user->subscriptions()->save(SubscriptionFactory::new()->make([ 'ends_at' => now()->addWeek(), ])); diff --git a/tests/SwapSubscriptionPlanTest.php b/tests/SwapSubscriptionPlanTest.php index 251dc18c..34264693 100644 --- a/tests/SwapSubscriptionPlanTest.php +++ b/tests/SwapSubscriptionPlanTest.php @@ -13,6 +13,8 @@ use Laravel\Cashier\Order\Order; use Laravel\Cashier\Order\OrderItem; use Laravel\Cashier\Subscription; +use Laravel\Cashier\Tests\Database\Factories\OrderItemFactory; +use Laravel\Cashier\Tests\Database\Factories\SubscriptionFactory; use Mollie\Api\MollieApiClient; use Mollie\Api\Resources\Customer; use Mollie\Api\Resources\Mandate; @@ -45,7 +47,7 @@ public function canSwapToAnotherPlan() $user = $this->getUserWithZeroBalance(); $subscription = $this->getSubscriptionForUser($user); - $alreadyPaidOrderItem = factory(Cashier::$orderItemModel)->create([ + $alreadyPaidOrderItem = OrderItemFactory::new()->create([ 'owner_id' => $user->id, 'order_id' => 1, 'unit_price' => 1000, @@ -124,7 +126,7 @@ public function canSwapToAnotherPlan() public function swappingACancelledSubscriptionResumesIt() { $subscription = $this->getUser()->subscriptions()->save( - factory(Cashier::$subscriptionModel)->make([ + SubscriptionFactory::new()->make([ 'ends_at' => now()->addWeek(), 'plan' => 'monthly-20-1', ]) @@ -142,7 +144,7 @@ public function swappingACancelledSubscriptionResumesIt() public function swappingACancelledSubscriptionAtNextCycleResumesIt() { $subscription = $this->getUser()->subscriptions()->save( - factory(Cashier::$subscriptionModel)->make([ + SubscriptionFactory::new()->make([ 'ends_at' => now()->addWeek(), 'plan' => 'monthly-20-1', ]) @@ -230,7 +232,7 @@ protected function getUserWithZeroBalance() */ protected function getSubscriptionForUser($user) { - return $user->subscriptions()->save(factory(Cashier::$subscriptionModel)->make([ + return $user->subscriptions()->save(SubscriptionFactory::new()->make([ 'name' => 'dummy name', 'plan' => 'monthly-10-1', 'cycle_started_at' => now()->subWeeks(2), diff --git a/tests/UpdatePaymentMethod/UpdatePaymentMethodTest.php b/tests/UpdatePaymentMethod/UpdatePaymentMethodTest.php index fda7f5ab..a161c2c5 100644 --- a/tests/UpdatePaymentMethod/UpdatePaymentMethodTest.php +++ b/tests/UpdatePaymentMethod/UpdatePaymentMethodTest.php @@ -19,7 +19,7 @@ public function canUpdatePaymentMethod() { $this->withPackageMigrations(); - $owner = factory(User::class)->create([ + $owner = User::factory()->create([ 'mollie_mandate_id' => 'mdt_unique_mandate_id', ]); diff --git a/tests/UpdatePaymentMethod/UpdatePaymentMethodWithoutAddingToBalanceTest.php b/tests/UpdatePaymentMethod/UpdatePaymentMethodWithoutAddingToBalanceTest.php index e4a447de..265f920a 100644 --- a/tests/UpdatePaymentMethod/UpdatePaymentMethodWithoutAddingToBalanceTest.php +++ b/tests/UpdatePaymentMethod/UpdatePaymentMethodWithoutAddingToBalanceTest.php @@ -19,7 +19,7 @@ public function canUpdatePaymentMethodWithoutAddingToBalance() { $this->withPackageMigrations(); - $owner = factory(User::class)->create([ + $owner = User::factory()->create([ 'mollie_mandate_id' => 'mdt_unique_mandate_id', ]); diff --git a/tests/database/factories/OrderFactory.php b/tests/database/factories/OrderFactory.php deleted file mode 100644 index e80b5322..00000000 --- a/tests/database/factories/OrderFactory.php +++ /dev/null @@ -1,22 +0,0 @@ -define(Cashier::$orderModel, function (Faker $faker) { - return [ - 'owner_id' => 1, - 'owner_type' => User::class, - 'currency' => 'EUR', - 'subtotal' => 123, - 'tax' => 0, - 'total' => 123, - 'total_due' => 123, - 'number' => '2018-0000-0001', - 'credit_used' => 0, - 'balance_before' => 0, - ]; -}); diff --git a/tests/database/factories/OrderItemFactory.php b/tests/database/factories/OrderItemFactory.php deleted file mode 100644 index 3ee7e597..00000000 --- a/tests/database/factories/OrderItemFactory.php +++ /dev/null @@ -1,43 +0,0 @@ -define(Cashier::$orderItemModel, function (Faker $faker) { - return [ - 'owner_type' => User::class, - 'owner_id' => 1, - 'orderable_type' => Cashier::$subscriptionModel, - 'orderable_id' => 1, - 'description' => 'Some dummy description', - 'unit_price' => 12150, - 'quantity' => 1, - 'tax_percentage' => 21.5, - 'currency' => 'EUR', - 'process_at' => now()->subMinute(), - ]; -}); - -$factory->state(Cashier::$orderItemModel, 'unlinked', [ - 'orderable_type' => null, - 'orderable_id' => null, -]); - -$factory->state(Cashier::$orderItemModel, 'unprocessed', [ - 'order_id' => null, -]); - -$factory->state(Cashier::$orderItemModel, 'processed', [ - 'order_id' => 1, -]); - -$factory->state(Cashier::$orderItemModel, 'EUR', [ - 'currency' => 'EUR', -]); - -$factory->state(Cashier::$orderItemModel, 'USD', [ - 'currency' => 'USD', -]); diff --git a/tests/database/factories/RedeemedCouponFactory.php b/tests/database/factories/RedeemedCouponFactory.php deleted file mode 100644 index 8aed9bbf..00000000 --- a/tests/database/factories/RedeemedCouponFactory.php +++ /dev/null @@ -1,18 +0,0 @@ -define(Cashier::$redeemedCouponModel, function (Faker $faker) { - return [ - 'name' => 'Test redemeed coupon', - 'model_type' => Cashier::$subscriptionModel, - 'model_id' => 1, - 'owner_type' => User::class, - 'owner_id' => 1, - 'times_left' => 1, - ]; -}); diff --git a/tests/database/factories/RefundFactory.php b/tests/database/factories/RefundFactory.php deleted file mode 100644 index 4ec0892f..00000000 --- a/tests/database/factories/RefundFactory.php +++ /dev/null @@ -1,18 +0,0 @@ -define(Cashier::$refundModel, function (Faker $faker) { - return [ - 'owner_id' => 1, - 'owner_type' => User::class, - 'original_order_id' => 1, - 'mollie_refund_id' => 're_dummy_refund_id', - 'mollie_refund_status' => RefundStatus::STATUS_PENDING, - ]; -}); diff --git a/tests/database/factories/SubscriptionFactory.php b/tests/database/factories/SubscriptionFactory.php deleted file mode 100644 index 8089b69d..00000000 --- a/tests/database/factories/SubscriptionFactory.php +++ /dev/null @@ -1,22 +0,0 @@ -define(Cashier::$subscriptionModel, function (Faker $faker) { - return [ - 'name' => 'dummy name', - 'plan' => 'monthly-10-1', - 'owner_id' => 1, - 'owner_type' => User::class, - 'cycle_started_at' => now(), - 'cycle_ends_at' => function (array $subscription) { - return Carbon::parse($subscription['cycle_started_at'])->addMonth(); - }, - 'tax_percentage' => 0, - ]; -}); diff --git a/tests/database/factories/UserFactory.php b/tests/database/factories/UserFactory.php deleted file mode 100644 index 521ef03a..00000000 --- a/tests/database/factories/UserFactory.php +++ /dev/null @@ -1,14 +0,0 @@ -define(User::class, function (Faker $faker) { - return [ - 'name' => $faker->name, - 'email' => $faker->email, - 'tax_percentage' => 0, - ]; -});