Skip to content

Commit 93e315f

Browse files
Copilotiamgergo
andcommitted
Add remaining tests: Traits, Listeners, Actions, Support, Relations, Notifications, and HTTP Controllers
Co-authored-by: iamgergo <[email protected]>
1 parent e9e3f21 commit 93e315f

File tree

14 files changed

+1071
-0
lines changed

14 files changed

+1071
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cone\Bazar\Tests\Actions;
6+
7+
use Cone\Bazar\Actions\SendOrderDetails;
8+
use Cone\Bazar\Models\Order;
9+
use Cone\Bazar\Models\Product;
10+
use Cone\Bazar\Tests\TestCase;
11+
use Illuminate\Database\Eloquent\Collection;
12+
use Illuminate\Http\Request;
13+
use Illuminate\Support\Facades\Notification;
14+
15+
class SendOrderDetailsTest extends TestCase
16+
{
17+
protected SendOrderDetails $action;
18+
19+
protected function setUp(): void
20+
{
21+
parent::setUp();
22+
23+
$this->action = new SendOrderDetails();
24+
}
25+
26+
public function test_action_sends_order_details_notification(): void
27+
{
28+
Notification::fake();
29+
30+
$order = Order::factory()->create();
31+
32+
Product::factory()->count(2)->create()->each(function ($product) use ($order) {
33+
$order->items()->create([
34+
'buyable_id' => $product->id,
35+
'buyable_type' => Product::class,
36+
'quantity' => 2,
37+
'price' => $product->price,
38+
'name' => $product->name,
39+
]);
40+
});
41+
42+
$request = Request::create('/');
43+
$models = new Collection([$order]);
44+
45+
$this->action->handle($request, $models);
46+
47+
$this->assertTrue(true);
48+
}
49+
50+
public function test_action_handles_multiple_orders(): void
51+
{
52+
Notification::fake();
53+
54+
$orders = Order::factory()->count(3)->create();
55+
56+
$request = Request::create('/');
57+
58+
$this->action->handle($request, $orders);
59+
60+
$this->assertTrue(true);
61+
}
62+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cone\Bazar\Tests\Http\Controllers;
6+
7+
use Cone\Bazar\Http\Controllers\Controller;
8+
use Cone\Bazar\Tests\TestCase;
9+
10+
class ControllerTest extends TestCase
11+
{
12+
public function test_controller_extends_base_controller(): void
13+
{
14+
$controller = new ConcreteController();
15+
16+
$this->assertInstanceOf(\Illuminate\Routing\Controller::class, $controller);
17+
}
18+
19+
public function test_controller_can_be_instantiated(): void
20+
{
21+
$controller = new ConcreteController();
22+
23+
$this->assertInstanceOf(Controller::class, $controller);
24+
}
25+
}
26+
27+
class ConcreteController extends Controller
28+
{
29+
//
30+
}
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cone\Bazar\Tests\Http\Controllers;
6+
7+
use Cone\Bazar\Gateway\CashDriver;
8+
use Cone\Bazar\Gateway\Response;
9+
use Cone\Bazar\Http\Controllers\GatewayController;
10+
use Cone\Bazar\Models\Order;
11+
use Cone\Bazar\Models\Product;
12+
use Cone\Bazar\Support\Facades\Gateway;
13+
use Cone\Bazar\Tests\TestCase;
14+
use Illuminate\Http\Request;
15+
16+
class GatewayControllerTest extends TestCase
17+
{
18+
protected GatewayController $controller;
19+
20+
protected Order $order;
21+
22+
protected function setUp(): void
23+
{
24+
parent::setUp();
25+
26+
$this->controller = new GatewayController();
27+
28+
$this->order = Order::factory()->create();
29+
30+
Product::factory()->count(2)->create()->each(function ($product) {
31+
$this->order->items()->create([
32+
'buyable_id' => $product->id,
33+
'buyable_type' => Product::class,
34+
'quantity' => 2,
35+
'price' => $product->price,
36+
'name' => $product->name,
37+
]);
38+
});
39+
}
40+
41+
public function test_controller_handles_capture_request(): void
42+
{
43+
$request = Request::create('/gateway/cash/capture', 'POST', [
44+
'order_id' => $this->order->id,
45+
]);
46+
47+
$this->mock(CashDriver::class, function ($mock) {
48+
$mock->shouldReceive('resolveOrderForCapture')
49+
->once()
50+
->andReturn($this->order);
51+
52+
$mock->shouldReceive('handleCapture')
53+
->once()
54+
->andReturn(new Response(['status' => 'success']));
55+
});
56+
57+
Gateway::shouldReceive('driver')
58+
->with('cash')
59+
->andReturn($this->app->make(CashDriver::class));
60+
61+
$response = $this->controller->capture($request, 'cash');
62+
63+
$this->assertEquals(200, $response->getStatusCode());
64+
}
65+
66+
public function test_controller_handles_invalid_capture_request(): void
67+
{
68+
$request = Request::create('/gateway/invalid/capture', 'POST');
69+
70+
Gateway::shouldReceive('driver')
71+
->with('invalid')
72+
->andThrow(new \Exception('Invalid driver'));
73+
74+
$response = $this->controller->capture($request, 'invalid');
75+
76+
$this->assertEquals(400, $response->getStatusCode());
77+
$this->assertStringContainsString('Invalid request', $response->getContent());
78+
}
79+
80+
public function test_controller_handles_notification_request(): void
81+
{
82+
$request = Request::create('/gateway/cash/notification', 'POST', [
83+
'order_id' => $this->order->id,
84+
]);
85+
86+
$this->mock(CashDriver::class, function ($mock) {
87+
$mock->shouldReceive('resolveOrderForNotification')
88+
->once()
89+
->andReturn($this->order);
90+
91+
$mock->shouldReceive('handleNotification')
92+
->once()
93+
->andReturn(new Response(['status' => 'success']));
94+
});
95+
96+
Gateway::shouldReceive('driver')
97+
->with('cash')
98+
->andReturn($this->app->make(CashDriver::class));
99+
100+
$response = $this->controller->notification($request, 'cash');
101+
102+
$this->assertEquals(200, $response->getStatusCode());
103+
}
104+
105+
public function test_controller_handles_invalid_notification_request(): void
106+
{
107+
$request = Request::create('/gateway/invalid/notification', 'POST');
108+
109+
Gateway::shouldReceive('driver')
110+
->with('invalid')
111+
->andThrow(new \Exception('Invalid driver'));
112+
113+
$response = $this->controller->notification($request, 'invalid');
114+
115+
$this->assertEquals(400, $response->getStatusCode());
116+
$this->assertStringContainsString('Invalid request', $response->getContent());
117+
}
118+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cone\Bazar\Tests\Listeners;
6+
7+
use Cone\Bazar\Listeners\ClearCookies;
8+
use Cone\Bazar\Tests\TestCase;
9+
use Cone\Bazar\Tests\User;
10+
use Illuminate\Auth\Events\Logout;
11+
use Illuminate\Support\Facades\Cookie;
12+
13+
class ClearCookiesTest extends TestCase
14+
{
15+
protected ClearCookies $listener;
16+
17+
protected User $user;
18+
19+
protected function setUp(): void
20+
{
21+
parent::setUp();
22+
23+
$this->listener = new ClearCookies();
24+
$this->user = User::factory()->create();
25+
}
26+
27+
public function test_listener_clears_cart_cookie_on_logout(): void
28+
{
29+
Cookie::queue('cart_id', 'test-cart-id', 864000);
30+
31+
$this->assertNotEmpty(Cookie::getQueuedCookies());
32+
33+
$event = new Logout('web', $this->user);
34+
35+
$this->listener->handle($event);
36+
37+
$queuedCookies = Cookie::getQueuedCookies();
38+
39+
$this->assertNotEmpty($queuedCookies);
40+
41+
$cartCookie = collect($queuedCookies)->firstWhere('name', 'cart_id');
42+
43+
$this->assertNotNull($cartCookie);
44+
$this->assertTrue(time() > $cartCookie->getExpiresTime());
45+
}
46+
47+
public function test_listener_handles_logout_event(): void
48+
{
49+
$event = new Logout('web', $this->user);
50+
51+
$this->listener->handle($event);
52+
53+
$this->assertTrue(true);
54+
}
55+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cone\Bazar\Tests\Listeners;
6+
7+
use Cone\Bazar\Listeners\FormatBazarStubs;
8+
use Cone\Bazar\Tests\TestCase;
9+
use Illuminate\Foundation\Events\VendorTagPublished;
10+
use Illuminate\Support\Facades\File;
11+
12+
class FormatBazarStubsTest extends TestCase
13+
{
14+
protected FormatBazarStubs $listener;
15+
16+
protected function setUp(): void
17+
{
18+
parent::setUp();
19+
20+
$this->listener = new FormatBazarStubs();
21+
}
22+
23+
public function test_listener_formats_bazar_stubs(): void
24+
{
25+
$tempFile = tempnam(sys_get_temp_dir(), 'stub_');
26+
file_put_contents($tempFile, 'namespace {{ namespace }};');
27+
28+
$event = new VendorTagPublished('bazar-stubs', [$tempFile => $tempFile]);
29+
30+
$this->listener->handle($event);
31+
32+
$contents = file_get_contents($tempFile);
33+
34+
$this->assertStringNotContainsString('{{ namespace }}', $contents);
35+
$this->assertStringContainsString($this->app->getNamespace(), $contents);
36+
37+
unlink($tempFile);
38+
}
39+
40+
public function test_listener_ignores_non_bazar_stubs_tags(): void
41+
{
42+
$tempFile = tempnam(sys_get_temp_dir(), 'stub_');
43+
file_put_contents($tempFile, 'namespace {{ namespace }};');
44+
45+
$event = new VendorTagPublished('other-tag', [$tempFile => $tempFile]);
46+
47+
$this->listener->handle($event);
48+
49+
$contents = file_get_contents($tempFile);
50+
51+
$this->assertStringContainsString('{{ namespace }}', $contents);
52+
53+
unlink($tempFile);
54+
}
55+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Cone\Bazar\Tests\Listeners;
6+
7+
use Cone\Bazar\Events\PaymentCaptured;
8+
use Cone\Bazar\Listeners\RefreshInventory;
9+
use Cone\Bazar\Models\Order;
10+
use Cone\Bazar\Models\Product;
11+
use Cone\Bazar\Tests\TestCase;
12+
13+
class RefreshInventoryTest extends TestCase
14+
{
15+
protected RefreshInventory $listener;
16+
17+
protected Order $order;
18+
19+
protected Product $product;
20+
21+
protected function setUp(): void
22+
{
23+
parent::setUp();
24+
25+
$this->listener = new RefreshInventory();
26+
$this->order = Order::factory()->create();
27+
$this->product = Product::factory()->create();
28+
29+
$this->product->setQuantity(100);
30+
31+
$this->order->items()->create([
32+
'buyable_id' => $this->product->id,
33+
'buyable_type' => Product::class,
34+
'quantity' => 10,
35+
'price' => $this->product->price,
36+
'name' => $this->product->name,
37+
]);
38+
}
39+
40+
public function test_listener_decrements_inventory_on_payment_captured(): void
41+
{
42+
$initialQuantity = $this->product->getQuantity();
43+
44+
$event = new PaymentCaptured($this->order->transactions()->create([
45+
'type' => 'payment',
46+
'driver' => 'cash',
47+
'amount' => $this->order->getTotal(),
48+
'completed_at' => now(),
49+
]));
50+
51+
$this->listener->handle($event);
52+
53+
$this->product->refresh();
54+
55+
$this->assertEquals($initialQuantity - 10, $this->product->getQuantity());
56+
}
57+
58+
public function test_listener_handles_payment_captured_event(): void
59+
{
60+
$transaction = $this->order->transactions()->create([
61+
'type' => 'payment',
62+
'driver' => 'cash',
63+
'amount' => $this->order->getTotal(),
64+
'completed_at' => now(),
65+
]);
66+
67+
$event = new PaymentCaptured($transaction);
68+
69+
$this->listener->handle($event);
70+
71+
$this->assertTrue(true);
72+
}
73+
}

0 commit comments

Comments
 (0)