mirror of
https://github.com/wearepixel/laravel-cart.git
synced 2026-11-14 22:01:48 +00:00
feat: database support
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'format_numbers' => true,
|
||||
'decimals' => 2,
|
||||
'round_mode' => 'up',
|
||||
'driver' => 'database',
|
||||
'storage' => [
|
||||
'session',
|
||||
'database' => [
|
||||
'model' => \Joelwmale\Cart\Tests\Helpers\MockCartModel::class,
|
||||
'id' => 'session_id',
|
||||
'items' => 'items',
|
||||
'conditions' => 'conditions',
|
||||
],
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace Joelwmale\Cart\Tests\Helpers;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class MockCartModel extends Model
|
||||
{
|
||||
protected $fillable = [
|
||||
'session_id',
|
||||
'items',
|
||||
'conditions',
|
||||
];
|
||||
|
||||
public $timestamps = false;
|
||||
|
||||
protected $casts = [
|
||||
'items' => 'array',
|
||||
'conditions' => 'array',
|
||||
];
|
||||
|
||||
protected $table = 'carts';
|
||||
}
|
||||
+2
-26
@@ -1,29 +1,5 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Test Case
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The closure you provide to your test functions is always bound to a specific PHPUnit test
|
||||
| case class. By default, that class is "PHPUnit\Framework\TestCase". Of course, you may
|
||||
| need to change it using the "pest()" function to bind a different classes or traits.
|
||||
|
|
||||
*/
|
||||
use Tests\TestCase;
|
||||
|
||||
// pest()->extend(Tests\TestCase::class)->in('Feature');
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Expectations
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| When you're writing tests, you often need to check that values meet certain conditions. The
|
||||
| "expect()" function gives you access to a set of "expectations" methods that you can use
|
||||
| to assert different things. Of course, you may extend the Expectation API at any time.
|
||||
|
|
||||
*/
|
||||
|
||||
expect()->extend('toBeOne', function () {
|
||||
return $this->toBe(1);
|
||||
});
|
||||
uses(TestCase::class)->in(__DIR__);
|
||||
|
||||
+44
-2
@@ -1,10 +1,52 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Tests;
|
||||
|
||||
use Illuminate\Events\Dispatcher;
|
||||
use Illuminate\Container\Container;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Capsule\Manager as DB;
|
||||
use PHPUnit\Framework\TestCase as BaseTestCase;
|
||||
|
||||
abstract class TestCase extends BaseTestCase
|
||||
class TestCase extends BaseTestCase
|
||||
{
|
||||
//
|
||||
protected DB $db;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
// Create a Laravel container
|
||||
$container = Container::getInstance();
|
||||
$dispatcher = new Dispatcher;
|
||||
|
||||
// Setup Capsule (Eloquent ORM)
|
||||
$this->db = new DB($container);
|
||||
$this->db->addConnection([
|
||||
'driver' => 'sqlite',
|
||||
'database' => ':memory:',
|
||||
'prefix' => '',
|
||||
]);
|
||||
$this->db->setAsGlobal();
|
||||
$this->db->bootEloquent();
|
||||
$this->db->getConnection()->setEventDispatcher($dispatcher);
|
||||
|
||||
// Run migrations (optional, for testing models)
|
||||
$this->migrateDatabase();
|
||||
}
|
||||
|
||||
protected function migrateDatabase()
|
||||
{
|
||||
$schema = $this->db->schema();
|
||||
|
||||
$schema->create('carts', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('session_id');
|
||||
$table->text('items');
|
||||
$table->text('conditions');
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
use Joelwmale\Cart\Cart;
|
||||
use Joelwmale\Cart\Tests\Helpers\MockCartModel;
|
||||
|
||||
beforeEach(function () {
|
||||
$events = Mockery::mock('Illuminate\Contracts\Events\Dispatcher');
|
||||
$events->shouldReceive('dispatch');
|
||||
|
||||
$storage = new MockCartModel;
|
||||
|
||||
$this->cart = new Cart(
|
||||
$storage,
|
||||
$events,
|
||||
'cart',
|
||||
'SAMPLESESSIONKEY',
|
||||
require (__DIR__ . '/../Helpers/ConfigDatabaseMock.php')
|
||||
);
|
||||
});
|
||||
|
||||
afterEach(function () {
|
||||
Mockery::close();
|
||||
});
|
||||
|
||||
describe('database cart', function () {
|
||||
test('can add an item', function () {
|
||||
$this->cart->add(1, 'Sample Item', 100.99, 2, []);
|
||||
|
||||
expect($this->cart->isEmpty())->toBeFalse('Cart should not be empty');
|
||||
expect($this->cart->getContent()->count())->toEqual(1, 'Cart content should be 1');
|
||||
expect($this->cart->getContent()->first()['id'])->toEqual(1, 'Item added has ID of 1 so first content ID should be 1');
|
||||
expect($this->cart->getContent()->first()['price'])->toEqual(100.99, 'Item added has price of 100.99 so first content price should be 100.99');
|
||||
|
||||
expect(MockCartModel::all()->count())->toEqual(1, 'The carts database table should have 1 row');
|
||||
});
|
||||
|
||||
test('can add and remove an item', function () {
|
||||
$this->cart->add(1, 'Sample Item', 100.99, 2, []);
|
||||
|
||||
expect($this->cart->isEmpty())->toBeFalse('Cart should not be empty');
|
||||
expect($this->cart->getContent()->count())->toEqual(1, 'Cart content should be 1');
|
||||
expect($this->cart->getContent()->first()['id'])->toEqual(1, 'Item added has ID of 1 so first content ID should be 1');
|
||||
expect($this->cart->getContent()->first()['price'])->toEqual(100.99, 'Item added has price of 100.99 so first content price should be 100.99');
|
||||
|
||||
expect(MockCartModel::all()->count())->toEqual(1, 'The carts database table should have 1 row');
|
||||
|
||||
$this->cart->remove(1);
|
||||
|
||||
$cartModel = MockCartModel::first();
|
||||
|
||||
expect($this->cart->isEmpty())->toBeTrue('Cart should be empty');
|
||||
expect($this->cart->getContent()->count())->toEqual(0, 'Cart content should be 0');
|
||||
expect($cartModel->items)->toEqual([], 'The carts database table should have 0 row');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user