/
itp_practice
/
itp_backend
Обзор
Документация
Войти
/
itp_practice
/
itp_backend
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
tests/Unit/Services/SubscriptionServiceTest.php
148 строк
5 KB
vivanenko
tariff buy
27 май 2025, 19:46
27 май 2025, 19:46
d32c67d
Код
Авторство
О чём код?
<?php namespace Tests\Unit\Services; use Tests\TestCase; use App\Services\SubscriptionService; use App\Models\Order; use App\Models\User; use App\Models\Tariff; use App\Models\TapApp; use App\Models\CartItem; use App\Models\UserTariffSubscription; use App\Models\Tap; use App\Enums\SubscriptionStatus; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\DB; class SubscriptionServiceTest extends TestCase { use RefreshDatabase; private SubscriptionService $subscriptionService; protected function setUp(): void { parent::setUp(); $this->subscriptionService = new SubscriptionService(); } public function test_creates_subscriptions_from_order() { // Arrange $user = User::factory()->create(); $tapApp = TapApp::factory()->create(); $tariff = Tariff::factory()->create(['duration_days' => 30]); $tariff->tapApps()->attach($tapApp); $order = Order::factory()->create(['user_id' => $user->id]); $cartItem = CartItem::factory()->create([ 'order_id' => $order->id, 'itemable_type' => 'App\\Models\\Tariff', 'itemable_id' => $tariff->id, 'quantity' => 2, ]); // Act $result = $this->subscriptionService->createSubscriptionsFromOrder($order); // Assert $this->assertCount(2, $result['subscriptions']); $this->assertCount(2, $result['taps']); // 2 subscriptions * 1 tap app each $this->assertDatabaseCount('user_tariff_subscriptions', 2); $this->assertDatabaseCount('taps', 2); $subscription = UserTariffSubscription::first(); $this->assertEquals($user->id, $subscription->user_id); $this->assertEquals($tariff->id, $subscription->tariff_id); $this->assertEquals(SubscriptionStatus::ACTIVE, $subscription->status); } public function test_skips_non_tariff_cart_items() { // Arrange $user = User::factory()->create(); $order = Order::factory()->create(['user_id' => $user->id]); $cartItem = CartItem::factory()->create([ 'order_id' => $order->id, 'itemable_type' => 'App\\Models\\SomeOtherModel', 'itemable_id' => 999, 'quantity' => 1, ]); // Act $result = $this->subscriptionService->createSubscriptionsFromOrder($order); // Assert $this->assertCount(0, $result['subscriptions']); $this->assertCount(0, $result['taps']); $this->assertDatabaseCount('user_tariff_subscriptions', 0); $this->assertDatabaseCount('taps', 0); } public function test_deactivates_subscription() { // Arrange $user = User::factory()->create(); $subscription = UserTariffSubscription::factory()->create([ 'user_id' => $user->id, 'status' => SubscriptionStatus::ACTIVE, ]); $tap = Tap::factory()->create([ 'user_id' => $user->id, 'is_active' => true, 'process_state' => 'running', ]); // Act $result = $this->subscriptionService->deactivateSubscription($subscription->id, $user->id); // Assert $this->assertTrue($result); $subscription->refresh(); $this->assertEquals(SubscriptionStatus::CANCELLED, $subscription->status); $tap->refresh(); $this->assertFalse($tap->is_active); $this->assertEquals('stopped', $tap->process_state); } public function test_throws_exception_for_non_existent_subscription() { // Arrange $user = User::factory()->create(); // Act & Assert $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('Subscription not found'); $this->subscriptionService->deactivateSubscription(999, $user->id); } public function test_gets_user_active_subscriptions() { // Arrange $user = User::factory()->create(); $activeSubscription = UserTariffSubscription::factory()->create([ 'user_id' => $user->id, 'status' => SubscriptionStatus::ACTIVE, 'start_date' => now()->subDay(), 'end_date' => now()->addDay(), ]); $expiredSubscription = UserTariffSubscription::factory()->create([ 'user_id' => $user->id, 'status' => SubscriptionStatus::ACTIVE, 'start_date' => now()->subDays(2), 'end_date' => now()->subDay(), ]); // Act $result = $this->subscriptionService->getUserActiveSubscriptions($user->id); // Assert $this->assertCount(1, $result); $this->assertEquals($activeSubscription->id, $result[0]['id']); } }