Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F117914546
D4616.1775403453.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
23 KB
Referenced Files
None
Subscribers
None
D4616.1775403453.diff
View Options
diff --git a/src/tests/Feature/BillingTest.php b/src/tests/Feature/BillingTest.php
deleted file mode 100644
--- a/src/tests/Feature/BillingTest.php
+++ /dev/null
@@ -1,261 +0,0 @@
-<?php
-
-namespace Tests\Feature;
-
-use Carbon\Carbon;
-use Tests\TestCase;
-
-class BillingTest extends TestCase
-{
- /** @property \App\Package $package */
- private $package;
-
- /** @property \App\User $user */
- private $user;
-
- /** @property \App\Wallet $wallet */
- private $wallet;
-
- /** @property string $wallet_id */
- private $wallet_id;
-
- public function setUp(): void
- {
- parent::setUp();
-
- $this->deleteTestUser('jane@kolabnow.com');
- $this->deleteTestUser('jack@kolabnow.com');
-
- \App\Package::withEnvTenantContext()->where('title', 'kolab-kube')->delete();
-
- $this->user = $this->getTestUser('jane@kolabnow.com');
- $this->package = \App\Package::withEnvTenantContext()->where('title', 'kolab')->first();
- $this->user->assignPackage($this->package);
-
- $this->wallet = $this->user->wallets->first();
-
- $this->wallet_id = $this->wallet->id;
- }
-
- public function tearDown(): void
- {
- $this->deleteTestUser('jane@kolabnow.com');
- $this->deleteTestUser('jack@kolabnow.com');
-
- \App\Package::withEnvTenantContext()->where('title', 'kolab-kube')->delete();
-
- parent::tearDown();
- }
-
- /**
- * Test the expected results for a user that registers and is almost immediately gone.
- */
- public function testTouchAndGo(): void
- {
- $this->assertCount(7, $this->wallet->entitlements);
-
- $this->assertEquals(0, $this->wallet->expectedCharges());
-
- $this->user->delete();
-
- $this->assertCount(0, $this->wallet->fresh()->entitlements->where('deleted_at', null));
-
- $this->assertCount(7, $this->wallet->entitlements);
- }
-
- /**
- * Verify the last day before the end of a full month's trial.
- */
- public function testNearFullTrial(): void
- {
- $this->backdateEntitlements(
- $this->wallet->entitlements,
- Carbon::now()->subMonthsWithoutOverflow(1)->addDays(1)
- );
-
- $this->assertEquals(0, $this->wallet->expectedCharges());
- }
-
- /**
- * Verify the exact end of the month's trial.
- */
- public function testFullTrial(): void
- {
- $this->backdateEntitlements(
- $this->wallet->entitlements,
- Carbon::now()->subMonthsWithoutOverflow(1)
- );
-
- $this->assertEquals(990, $this->wallet->expectedCharges());
- }
-
- /**
- * Verify that over-running the trial by a single day causes charges to be incurred.
- */
- public function testOutRunTrial(): void
- {
- $this->backdateEntitlements(
- $this->wallet->entitlements,
- Carbon::now()->subMonthsWithoutOverflow(1)->subDays(1)
- );
-
- $this->assertEquals(990, $this->wallet->expectedCharges());
- }
-
- /**
- * Verify additional storage configuration entitlement created 'early' does incur additional
- * charges to the wallet.
- */
- public function testAddtStorageEarly(): void
- {
- $this->backdateEntitlements(
- $this->wallet->entitlements,
- Carbon::now()->subMonthsWithoutOverflow(1)->subDays(1)
- );
-
- $this->assertEquals(990, $this->wallet->expectedCharges());
-
- $sku = \App\Sku::withEnvTenantContext()->where('title', 'storage')->first();
-
- $entitlement = \App\Entitlement::create(
- [
- 'wallet_id' => $this->wallet_id,
- 'sku_id' => $sku->id,
- 'cost' => $sku->cost,
- 'entitleable_id' => $this->user->id,
- 'entitleable_type' => \App\User::class
- ]
- );
-
- $this->backdateEntitlements(
- [$entitlement],
- Carbon::now()->subMonthsWithoutOverflow(1)->subDays(1)
- );
-
- $this->assertEquals(1015, $this->wallet->expectedCharges());
- }
-
- /**
- * Verify additional storage configuration entitlement created 'late' does not incur additional
- * charges to the wallet.
- */
- public function testAddtStorageLate(): void
- {
- $this->backdateEntitlements($this->wallet->entitlements, Carbon::now()->subMonthsWithoutOverflow(1));
-
- $this->assertEquals(990, $this->wallet->expectedCharges());
-
- $sku = \App\Sku::withEnvTenantContext()->where(['title' => 'storage'])->first();
-
- $entitlement = \App\Entitlement::create(
- [
- 'wallet_id' => $this->wallet_id,
- 'sku_id' => $sku->id,
- 'cost' => $sku->cost,
- 'entitleable_id' => $this->user->id,
- 'entitleable_type' => \App\User::class
- ]
- );
-
- $this->backdateEntitlements([$entitlement], Carbon::now()->subDays(14));
-
- $this->assertEquals(990, $this->wallet->expectedCharges());
- }
-
- public function testFifthWeek(): void
- {
- $targetDateA = Carbon::now()->subWeeks(5);
- $targetDateB = $targetDateA->copy()->addMonthsWithoutOverflow(1);
-
- $this->backdateEntitlements($this->wallet->entitlements, $targetDateA);
-
- $this->assertEquals(990, $this->wallet->expectedCharges());
-
- $this->wallet->chargeEntitlements();
-
- $this->assertEquals(-990, $this->wallet->balance);
-
- foreach ($this->wallet->entitlements()->get() as $entitlement) {
- $this->assertTrue($entitlement->created_at->isSameSecond($targetDateA));
- $this->assertTrue($entitlement->updated_at->isSameSecond($targetDateB));
- }
- }
-
- public function testSecondMonth(): void
- {
- $this->backdateEntitlements($this->wallet->entitlements, Carbon::now()->subMonthsWithoutOverflow(2));
-
- $this->assertCount(7, $this->wallet->entitlements);
-
- $this->assertEquals(1980, $this->wallet->expectedCharges());
-
- $sku = \App\Sku::withEnvTenantContext()->where('title', 'storage')->first();
-
- $entitlement = \App\Entitlement::create(
- [
- 'entitleable_id' => $this->user->id,
- 'entitleable_type' => \App\User::class,
- 'cost' => $sku->cost,
- 'sku_id' => $sku->id,
- 'wallet_id' => $this->wallet_id
- ]
- );
-
- $this->backdateEntitlements([$entitlement], Carbon::now()->subMonthsWithoutOverflow(1));
-
- $this->assertEquals(2005, $this->wallet->expectedCharges());
- }
-
- public function testWithDiscountRate(): void
- {
- $package = \App\Package::create(
- [
- 'title' => 'kolab-kube',
- 'name' => 'Kolab for Kuba Fans',
- 'description' => 'Kolab for Kube fans',
- 'discount_rate' => 50
- ]
- );
-
- $skus = [
- \App\Sku::withEnvTenantContext()->where('title', 'mailbox')->first(),
- \App\Sku::withEnvTenantContext()->where('title', 'storage')->first(),
- \App\Sku::withEnvTenantContext()->where('title', 'groupware')->first()
- ];
-
- $package->skus()->saveMany($skus);
-
- $package->skus()->updateExistingPivot(
- \App\Sku::withEnvTenantContext()->where('title', 'storage')->first(),
- ['qty' => 5],
- false
- );
-
- $user = $this->getTestUser('jack@kolabnow.com');
-
- $user->assignPackage($package);
-
- $wallet = $user->wallets->first();
-
- $wallet_id = $wallet->id;
-
- $this->backdateEntitlements($wallet->entitlements, Carbon::now()->subMonthsWithoutOverflow(1));
-
- $this->assertEquals(495, $wallet->expectedCharges());
- }
-
- /**
- * Test cost calculation with a wallet discount
- */
- public function testWithWalletDiscount(): void
- {
- $discount = \App\Discount::withEnvTenantContext()->where('code', 'TEST')->first();
-
- $wallet = $this->user->wallets()->first();
- $wallet->discount()->associate($discount);
-
- $this->backdateEntitlements($wallet->entitlements, Carbon::now()->subMonthsWithoutOverflow(1));
-
- $this->assertEquals(891, $wallet->expectedCharges());
- }
-}
diff --git a/src/tests/Feature/DomainOwnerTest.php b/src/tests/Feature/DomainOwnerTest.php
deleted file mode 100644
--- a/src/tests/Feature/DomainOwnerTest.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-namespace Tests\Feature;
-
-use App\User;
-use Illuminate\Support\Facades\Queue;
-use Tests\TestCase;
-
-class DomainOwnerTest extends TestCase
-{
- /**
- * {@inheritDoc}
- */
- public function setUp(): void
- {
- parent::setUp();
-
- $this->deleteTestUser('jane@kolab.org');
- }
-
- /**
- * {@inheritDoc}
- */
- public function tearDown(): void
- {
- $this->deleteTestUser('jane@kolab.org');
-
- parent::tearDown();
- }
-
- public function testJohnCreateJane(): void
- {
- $john = User::where('email', 'john@kolab.org')->first();
-
- $jane = User::create(
- [
- 'name' => 'Jane Doe',
- 'email' => 'jane@kolab.org',
- 'password' => 'simple123',
- 'email_verified_at' => now()
- ]
- );
-
- $package = \App\Package::withEnvTenantContext()->where('title', 'kolab')->first();
- $mailbox_sku = \App\Sku::withEnvTenantContext()->where('title', 'mailbox')->first();
-
- $john->assignPackage($package, $jane);
-
- // assert jane has a mailbox entitlement
- $this->assertCount(7, $jane->entitlements);
- $this->assertCount(1, $jane->entitlements()->where('sku_id', $mailbox_sku->id)->get());
- }
-}
diff --git a/src/tests/Feature/WalletTest.php b/src/tests/Feature/WalletTest.php
--- a/src/tests/Feature/WalletTest.php
+++ b/src/tests/Feature/WalletTest.php
@@ -23,12 +23,6 @@
'UserWallet1@UserWallet.com',
'UserWallet2@UserWallet.com',
'UserWallet3@UserWallet.com',
- 'UserWallet4@UserWallet.com',
- 'UserWallet5@UserWallet.com',
- 'WalletControllerA@WalletController.com',
- 'WalletControllerB@WalletController.com',
- 'WalletController2A@WalletController.com',
- 'WalletController2B@WalletController.com',
'jane@kolabnow.com'
];
@@ -74,7 +68,7 @@
{
Queue::fake();
- $user = $this->getTestUser('UserWallet1@UserWallet.com');
+ $user = $this->getTestUser('jane@kolabnow.com');
$user->suspend();
$user->degrade();
@@ -96,7 +90,6 @@
$this->assertNull($wallet->getSetting('balance_negative_since'));
// Test un-restricting users on balance change
- $this->deleteTestUser('UserWallet1@UserWallet.com');
$owner = $this->getTestUser('UserWallet1@UserWallet.com');
$user1 = $this->getTestUser('UserWallet2@UserWallet.com');
$user2 = $this->getTestUser('UserWallet3@UserWallet.com');
@@ -185,27 +178,20 @@
}
/**
- * Verify a wallet is created, when a user is created.
+ * Basic wallet features
*/
- public function testCreateUserCreatesWallet(): void
+ public function testWallet(): void
{
+ // Verify a wallet is created, when a user is created.
$user = $this->getTestUser('UserWallet1@UserWallet.com');
$this->assertCount(1, $user->wallets);
$this->assertSame(\config('app.currency'), $user->wallets[0]->currency);
$this->assertSame(0, $user->wallets[0]->balance);
- }
- /**
- * Verify a user can haz more wallets.
- */
- public function testAddWallet(): void
- {
- $user = $this->getTestUser('UserWallet2@UserWallet.com');
-
- $user->wallets()->save(
- new Wallet(['currency' => 'USD'])
- );
+ // Verify a user can haz more wallets.
+ $user->wallets()->save(new Wallet(['currency' => 'USD']));
+ $user->refresh();
$this->assertCount(2, $user->wallets);
@@ -217,15 +203,8 @@
// For now all wallets use system currency
$this->assertFalse($user->wallets()->where('currency', 'USD')->exists());
- }
-
- /**
- * Verify we can not delete a user wallet that holds balance.
- */
- public function testDeleteWalletWithCredit(): void
- {
- $user = $this->getTestUser('UserWallet3@UserWallet.com');
+ // Verify we can not delete a user wallet that holds balance.
$user->wallets()->each(
function ($wallet) {
$wallet->credit(100)->save();
@@ -237,46 +216,18 @@
$this->assertFalse($wallet->delete());
}
);
- }
- /**
- * Verify we can not delete a wallet that is the last wallet.
- */
- public function testDeleteLastWallet(): void
- {
- $user = $this->getTestUser('UserWallet4@UserWallet.com');
-
- $this->assertCount(1, $user->wallets);
-
- $user->wallets()->each(
- function ($wallet) {
- $this->assertFalse($wallet->delete());
- }
- );
- }
+ $user->wallets()->update(['balance' => 0]);
+ $user->refresh();
- /**
- * Verify we can remove a wallet that is an additional wallet.
- */
- public function testDeleteAddtWallet(): void
- {
- $user = $this->getTestUser('UserWallet5@UserWallet.com');
+ // Verify we can remove a wallet that is an additional wallet.
+ $user->wallets()->first()->delete();
+ $user->refresh();
- $user->wallets()->save(
- new Wallet(['currency' => 'USD'])
- );
+ $this->assertCount(1, $user->wallets);
- // For now additional wallets with a different currency is not allowed
- $this->assertFalse($user->wallets()->where('currency', 'USD')->exists());
-/*
- $user->wallets()->each(
- function ($wallet) {
- if ($wallet->currency == 'USD') {
- $this->assertNotFalse($wallet->delete());
- }
- }
- );
-*/
+ // Verify we can not delete a wallet that is the last wallet.
+ $this->assertFalse($user->wallets[0]->delete());
}
/**
@@ -284,8 +235,8 @@
*/
public function testAddController(): void
{
- $userA = $this->getTestUser('WalletControllerA@WalletController.com');
- $userB = $this->getTestUser('WalletControllerB@WalletController.com');
+ $userA = $this->getTestUser('UserWallet1@UserWallet.com');
+ $userB = $this->getTestUser('UserWallet2@UserWallet.com');
$userA->wallets()->each(
function ($wallet) use ($userB) {
@@ -301,12 +252,140 @@
$this->assertTrue($bAccount->id === $aWallet->id);
}
+ /**
+ * Test Wallet::expectedCharges()
+ */
+ public function testExpectedCharges(): void
+ {
+ $user = $this->getTestUser('jane@kolabnow.com');
+ $package = Package::withEnvTenantContext()->where('title', 'kolab')->first();
+ $user->assignPackage($package);
+
+ $wallet = $user->wallets->first();
+
+ // Verify the last day before the end of a full month's trial.
+ $this->backdateEntitlements(
+ $wallet->entitlements,
+ Carbon::now()->subMonthsWithoutOverflow(1)->addDays(1)
+ );
+
+ $this->assertEquals(0, $wallet->expectedCharges());
+
+ // Verify the exact end of the month's trial.
+ $this->backdateEntitlements(
+ $wallet->entitlements,
+ Carbon::now()->subMonthsWithoutOverflow(1)
+ );
+
+ $this->assertEquals(990, $wallet->expectedCharges());
+
+ // Verify that over-running the trial by a single day causes charges to be incurred.
+ $this->backdateEntitlements(
+ $wallet->entitlements,
+ Carbon::now()->subMonthsWithoutOverflow(1)->subDays(1)
+ );
+
+ $this->assertEquals(990, $wallet->expectedCharges());
+
+ // Verify additional storage configuration entitlement created 'early' does incur additional
+ // charges to the wallet.
+ $this->backdateEntitlements(
+ $wallet->entitlements,
+ Carbon::now()->subMonthsWithoutOverflow(1)->subDays(1)
+ );
+
+ $this->assertEquals(990, $wallet->expectedCharges());
+
+ $sku = Sku::withEnvTenantContext()->where('title', 'storage')->first();
+
+ $entitlement = Entitlement::create([
+ 'wallet_id' => $wallet->id,
+ 'sku_id' => $sku->id,
+ 'cost' => $sku->cost,
+ 'entitleable_id' => $user->id,
+ 'entitleable_type' => \App\User::class
+ ]);
+
+ $this->backdateEntitlements(
+ [$entitlement],
+ Carbon::now()->subMonthsWithoutOverflow(1)->subDays(1)
+ );
+
+ $this->assertEquals(1015, $wallet->expectedCharges());
+
+ $entitlement->forceDelete();
+ $wallet->refresh();
+
+ // Verify additional storage configuration entitlement created 'late' does not incur additional
+ // charges to the wallet.
+ $this->backdateEntitlements($wallet->entitlements, Carbon::now()->subMonthsWithoutOverflow(1));
+
+ $this->assertEquals(990, $wallet->expectedCharges());
+
+ $entitlement = \App\Entitlement::create([
+ 'wallet_id' => $wallet->id,
+ 'sku_id' => $sku->id,
+ 'cost' => $sku->cost,
+ 'entitleable_id' => $user->id,
+ 'entitleable_type' => \App\User::class
+ ]);
+
+ $this->backdateEntitlements([$entitlement], Carbon::now()->subDays(14));
+
+ $this->assertEquals(990, $wallet->expectedCharges());
+
+ $entitlement->forceDelete();
+ $wallet->refresh();
+
+ // Test fifth week
+ $targetDateA = Carbon::now()->subWeeks(5);
+ $targetDateB = $targetDateA->copy()->addMonthsWithoutOverflow(1);
+
+ $this->backdateEntitlements($wallet->entitlements, $targetDateA);
+
+ $this->assertEquals(990, $wallet->expectedCharges());
+
+ $entitlement->forceDelete();
+ $wallet->refresh();
+
+ // Test second month
+ $this->backdateEntitlements($wallet->entitlements, Carbon::now()->subMonthsWithoutOverflow(2));
+
+ $this->assertCount(7, $wallet->entitlements);
+
+ $this->assertEquals(1980, $wallet->expectedCharges());
+
+ $entitlement = \App\Entitlement::create([
+ 'entitleable_id' => $user->id,
+ 'entitleable_type' => \App\User::class,
+ 'cost' => $sku->cost,
+ 'sku_id' => $sku->id,
+ 'wallet_id' => $wallet->id
+ ]);
+
+ $this->backdateEntitlements([$entitlement], Carbon::now()->subMonthsWithoutOverflow(1));
+
+ $this->assertEquals(2005, $wallet->expectedCharges());
+
+ $entitlement->forceDelete();
+ $wallet->refresh();
+
+ // Test cost calculation with a wallet discount
+ $discount = Discount::withEnvTenantContext()->where('code', 'TEST')->first();
+
+ $wallet->discount()->associate($discount);
+
+ $this->backdateEntitlements($wallet->entitlements, Carbon::now()->subMonthsWithoutOverflow(1));
+
+ $this->assertEquals(891, $wallet->expectedCharges());
+ }
+
/**
* Test Wallet::getMinMandateAmount()
*/
public function testGetMinMandateAmount(): void
{
- $user = $this->getTestUser('WalletControllerA@WalletController.com');
+ $user = $this->getTestUser('UserWallet1@UserWallet.com');
$user->setSetting('plan_id', null);
$wallet = $user->wallets()->first();
@@ -349,10 +428,10 @@
/**
* Verify controllers can also be removed from wallets.
*/
- public function testRemoveWalletController(): void
+ public function testRemoveController(): void
{
- $userA = $this->getTestUser('WalletController2A@WalletController.com');
- $userB = $this->getTestUser('WalletController2B@WalletController.com');
+ $userA = $this->getTestUser('UserWallet1@UserWallet.com');
+ $userB = $this->getTestUser('UserWallet2@UserWallet.com');
$userA->wallets()->each(
function ($wallet) use ($userB) {
@@ -715,9 +794,9 @@
}
/**
- * Tests for award() and penalty()
+ * Tests for award/penalty/chargeback/refund/credit/debit methods
*/
- public function testAwardAndPenalty(): void
+ public function testBalanceChange(): void
{
$user = $this->getTestUser('UserWallet1@UserWallet.com');
$wallet = $user->wallets()->first();
@@ -741,14 +820,58 @@
$this->assertSame(-100, $transaction->amount);
$this->assertSame(Transaction::WALLET_PENALTY, $transaction->type);
$this->assertSame('test', $transaction->description);
- }
- /**
- * Tests for chargeback() and refund()
- */
- public function testChargebackAndRefund(): void
- {
- $this->markTestIncomplete();
+ $wallet->transactions()->delete();
+ $wallet->balance = 0;
+ $wallet->save();
+
+ // Test chargeback
+ $this->assertSame($wallet->id, $wallet->chargeback(100, 'test')->id);
+ $this->assertSame(-100, $wallet->balance);
+ $this->assertSame(-100, $wallet->fresh()->balance);
+ $transaction = $wallet->transactions()->first();
+ $this->assertSame(-100, $transaction->amount);
+ $this->assertSame(Transaction::WALLET_CHARGEBACK, $transaction->type);
+ $this->assertSame('test', $transaction->description);
+
+ $wallet->transactions()->delete();
+ $wallet->balance = 0;
+ $wallet->save();
+
+ // Test refund
+ $this->assertSame($wallet->id, $wallet->refund(100, 'test')->id);
+ $this->assertSame(-100, $wallet->balance);
+ $this->assertSame(-100, $wallet->fresh()->balance);
+ $transaction = $wallet->transactions()->first();
+ $this->assertSame(-100, $transaction->amount);
+ $this->assertSame(Transaction::WALLET_REFUND, $transaction->type);
+ $this->assertSame('test', $transaction->description);
+
+ $wallet->transactions()->delete();
+ $wallet->balance = 0;
+ $wallet->save();
+
+ // Test credit
+ $this->assertSame($wallet->id, $wallet->credit(100, 'test')->id);
+ $this->assertSame(100, $wallet->balance);
+ $this->assertSame(100, $wallet->fresh()->balance);
+ $transaction = $wallet->transactions()->first();
+ $this->assertSame(100, $transaction->amount);
+ $this->assertSame(Transaction::WALLET_CREDIT, $transaction->type);
+ $this->assertSame('test', $transaction->description);
+
+ $wallet->transactions()->delete();
+ $wallet->balance = 0;
+ $wallet->save();
+
+ // Test debit
+ $this->assertSame($wallet->id, $wallet->debit(100, 'test')->id);
+ $this->assertSame(-100, $wallet->balance);
+ $this->assertSame(-100, $wallet->fresh()->balance);
+ $transaction = $wallet->transactions()->first();
+ $this->assertSame(-100, $transaction->amount);
+ $this->assertSame(Transaction::WALLET_DEBIT, $transaction->type);
+ $this->assertSame('test', $transaction->description);
}
/**
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Apr 5, 3:37 PM (7 h, 12 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18833813
Default Alt Text
D4616.1775403453.diff (23 KB)
Attached To
Mode
D4616: Merge and optimize Wallet tests
Attached
Detach File
Event Timeline