diff --git a/src/app/Sku.php b/src/app/Sku.php index 083587a0..04d44701 100644 --- a/src/app/Sku.php +++ b/src/app/Sku.php @@ -1,57 +1,71 @@ 'integer', 'units_free' => 'integer' ]; protected $fillable = [ 'active', 'cost', 'description', 'handler_class', 'name', // persist for annual domain registration 'period', 'title', 'units_free', ]; /** @var array Translatable properties */ public $translatable = [ 'name', 'description', ]; /** * List the entitlements that consume this SKU. * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function entitlements() { return $this->hasMany('App\Entitlement'); } public function packages() { return $this->belongsToMany( 'App\Package', 'package_skus' )->using('App\PackageSku')->withPivot(['cost', 'qty']); } } diff --git a/src/tests/Functional/Methods/PackageSkuTest.php b/src/tests/Functional/Methods/PackageSkuTest.php new file mode 100644 index 00000000..20174b25 --- /dev/null +++ b/src/tests/Functional/Methods/PackageSkuTest.php @@ -0,0 +1,127 @@ +first(); + $skuGroupwareTestAttributes = $skuGroupware->toArray(); + $skuGroupwareTestAttributes['title'] = 'groupware-test'; + $this->skuGroupwareTest = \App\Sku::create($skuGroupwareTestAttributes); + + $skuMailbox = \App\Sku::where('title', 'mailbox')->first(); + $skuMailboxTestAttributes = $skuMailbox->toArray(); + $skuMailboxTestAttributes['title'] = 'mailbox-test'; + $this->skuMailboxTest = \App\Sku::create($skuMailboxTestAttributes); + + $skuStorage = \App\Sku::where('title', 'storage')->first(); + $skuStorageTestAttributes = $skuStorage->toArray(); + $skuStorageTestAttributes['title'] = 'storage-test'; + $this->skuStorageTest = \App\Sku::create($skuStorageTestAttributes); + + $this->packageKolabTest = \App\Package::create( + [ + 'title' => 'kolab-test', + 'description' => 'A test package', + 'name' => "A Kolab Test Package" + ] + ); + + $this->packageKolabTest->skus()->saveMany( + [ + $this->skuGroupwareTest, + $this->skuMailboxTest, + $this->skuStorageTest + ] + ); + + $this->packageKolabTest->skus()->updateExistingPivot( + $this->skuStorageTest, + ['qty' => 2], + false + ); + } + + public function tearDown(): void + { + $this->packageKolabTest->forceDelete(); + $this->skuGroupwareTest->forceDelete(); + $this->skuMailboxTest->forceDelete(); + $this->skuStorageTest->forceDelete(); + + parent::tearDown(); + } + + public function testCostNegativeNetUnits() + { + foreach ($this->packageKolabTest->skus as $sku) { + $sku->units_free = $sku->pivot->qty + 1; + $sku->save(); + + $this->assertEqual($sku->pivot->cost(), 0); + + $sku->units_free -= 1; + $sku->save(); + } + } + + public function testCost() + { + foreach ($this->packageKolabTest->skus as $sku) { + $this->assertEqual($sku->pivot->cost(), $sku->cost * ($sku->pivot->qty - $sku->units_free)); + } + } + + public function testCostWithPackageDiscountRate() + { + foreach ([15, 30, 50, 100] as $rate) { + $this->packageKolabTest->discount_rate = $rate; + $this->packageKolabTest->save(); + + $multiplier = ((100 - $rate) / 100); + + foreach ($this->packageKolabTest->fresh()->skus as $sku) { + $expected = $multiplier * $sku->cost * ($sku->pivot->qty - $sku->units_free); + + $this->assertEqual($sku->pivot->cost(), $expected); + } + } + } + + public function testPackage() + { + foreach ($this->packageKolabTest->skus as $sku) { + $this->assertSame($sku->pivot->package->id, $this->packageKolabTest->id); + } + } + + public function testQty() + { + $this->markTestIncomplete(); + } + + public function testSku() + { + $this->markTestIncomplete(); + } + + public function testSkuInactive() + { + $this->markTestIncomplete(); + } +} diff --git a/src/tests/Functional/Methods/PackageTest.php b/src/tests/Functional/Methods/PackageTest.php index 69c28a03..a21aca6f 100644 --- a/src/tests/Functional/Methods/PackageTest.php +++ b/src/tests/Functional/Methods/PackageTest.php @@ -1,58 +1,109 @@ packageDomainHosting = \App\Package::where('title', 'domain-hosting')->first(); $this->packageKolab = \App\Package::where('title', 'kolab')->first(); $this->packageLite = \App\Package::where('title', 'lite')->first(); $this->skuDomainHosting = \App\Sku::where('title', 'domain-hosting')->first(); $this->skuGroupware = \App\Sku::where('title', 'groupware')->first(); $this->skuMailbox = \App\Sku::where('title', 'mailbox')->first(); $this->skuStorage = \App\Sku::where('title', 'storage')->first(); } public function testSkusDomainHosting() { // this is without a package quantity manipulator, just unique SKUs $this->assertCount(1, $this->packageDomainHosting->skus); $this->assertTrue($this->packageDomainHosting->skus->contains($this->skuDomainHosting)); + $this->assertFalse($this->packageDomainHosting->skus->contains($this->skuGroupware)); + $this->assertFalse($this->packageDomainHosting->skus->contains($this->skuMailbox)); + $this->assertFalse($this->packageDomainHosting->skus->contains($this->skuStorage)); } public function testSkusKolab() { // this is without a package quantity manipulator, just unique SKUs $this->assertCount(3, $this->packageKolab->skus); + $this->assertFalse($this->packageKolab->skus->contains($this->skuDomainHosting)); $this->assertTrue($this->packageKolab->skus->contains($this->skuGroupware)); $this->assertTrue($this->packageKolab->skus->contains($this->skuMailbox)); $this->assertTrue($this->packageKolab->skus->contains($this->skuStorage)); } public function testSkusLite() { // this is without a package quantity manipulator, just unique SKUs $this->assertCount(2, $this->packageLite->skus); + $this->assertFalse($this->packageLite->skus->contains($this->skuDomainHosting)); + $this->assertFalse($this->packageLite->skus->contains($this->skuGroupware)); + $this->assertTrue($this->packageLite->skus->contains($this->skuMailbox)); + $this->assertTrue($this->packageLite->skus->contains($this->skuStorage)); + } + + public function testPackageIsDomainFailure() + { + $this->assertFalse($this->packageKolab->isDomain()); + $this->assertFalse($this->packageLite->isDomain()); + } + + public function testPackageIsDomainSuccess() + { + $this->assertTrue($this->packageDomainHosting->isDomain()); + } + + public function testPackageDomainHostingCost() + { + $this->assertEqual($this->packageDomainHosting->cost(), 0); + } + + public function testPackageKolabCost() + { + $this->assertEqual($this->packageKolab->cost(), 999); + } + + public function testPackageLiteCost() + { + $this->assertEqual($this->packageLite->cost(), 444); + } + + public function testPackageCostWithNegativeNetUnits() + { + $skus = $this->packageLite->skus; + + foreach ($skus as $sku) { + if ($sku->title == "storage") { + $sku->units_free = $sku->pivot->qty + 1; + } + } + + $this->assertEqual($this->packageLite->cost(), 444); + } + + public function testPackageCostWithDiscountRate() + { + $this->markTestIncomplete(); } } diff --git a/src/tests/Functional/Methods/PaymentTest.php b/src/tests/Functional/Methods/PaymentTest.php new file mode 100644 index 00000000..7a150255 --- /dev/null +++ b/src/tests/Functional/Methods/PaymentTest.php @@ -0,0 +1,23 @@ +assertInstanceOf('Illuminate\Database\Eloquent\Relations\BelongsTo', (new \App\Payment())->wallet()); + $this->assertNull((new \App\Payment())->wallet); + } +} diff --git a/src/tests/Functional/Methods/SkuTest.php b/src/tests/Functional/Methods/SkuTest.php new file mode 100644 index 00000000..fb6edcc0 --- /dev/null +++ b/src/tests/Functional/Methods/SkuTest.php @@ -0,0 +1,19 @@ +assertNotNull($sku->handler_class); + $this->assertTrue(method_exists($sku->handler_class, 'preReq')); + } + } +}