diff --git a/app/Models/Team.php b/app/Models/Team.php index d5d564444..0fbcfe0c6 100644 --- a/app/Models/Team.php +++ b/app/Models/Team.php @@ -233,6 +233,9 @@ public function subscriptionEnded() 'is_reachable' => false, ]); ServerReachabilityChanged::dispatch($server); + $server->unreachable_count = 3; + $server->unreachable_notification_sent = true; + $server->save(); } } @@ -344,5 +347,4 @@ public function webhookNotificationSettings() { return $this->hasOne(WebhookNotificationSettings::class); } - } diff --git a/tests/Feature/CleanupUnreachableServersTest.php b/tests/Feature/CleanupUnreachableServersTest.php index edfd0511c..c06944969 100644 --- a/tests/Feature/CleanupUnreachableServersTest.php +++ b/tests/Feature/CleanupUnreachableServersTest.php @@ -30,7 +30,7 @@ 'updated_at' => now()->subDays(8), ]); - $originalIp = $server->ip; + $originalIp = (string) $server->ip; $this->artisan('cleanup:unreachable-servers')->assertSuccessful(); @@ -47,7 +47,7 @@ 'updated_at' => now()->subDays(3), ]); - $originalIp = $server->ip; + $originalIp = (string) $server->ip; $this->artisan('cleanup:unreachable-servers')->assertSuccessful(); @@ -64,7 +64,7 @@ 'updated_at' => now()->subDays(8), ]); - $originalIp = $server->ip; + $originalIp = (string) $server->ip; $this->artisan('cleanup:unreachable-servers')->assertSuccessful(); diff --git a/tests/Feature/CleanupUnsubscribedServersTest.php b/tests/Feature/CleanupUnsubscribedServersTest.php new file mode 100644 index 000000000..ee3fdb02d --- /dev/null +++ b/tests/Feature/CleanupUnsubscribedServersTest.php @@ -0,0 +1,78 @@ +create(); + Subscription::create([ + 'team_id' => $team->id, + 'stripe_invoice_paid' => true, + ]); + $server = Server::factory()->create([ + 'team_id' => $team->id, + 'unreachable_count' => 0, + 'unreachable_notification_sent' => false, + ]); + + $team->subscriptionEnded(); + + $server->refresh(); + expect($server->unreachable_count)->toBe(3); + expect($server->unreachable_notification_sent)->toBeTrue(); +}); + +it('cleans up unsubscribed server IP after 7 days via cleanup command', function () { + $team = Team::factory()->create(); + $server = Server::factory()->create([ + 'team_id' => $team->id, + 'unreachable_count' => 3, + 'unreachable_notification_sent' => true, + 'updated_at' => now()->subDays(8), + ]); + + $this->artisan('cleanup:unreachable-servers')->assertSuccessful(); + + $server->refresh(); + expect($server->ip)->toBe('1.2.3.4'); +}); + +it('does not clean up unsubscribed server IP within 7 day grace period', function () { + $team = Team::factory()->create(); + $server = Server::factory()->create([ + 'team_id' => $team->id, + 'unreachable_count' => 3, + 'unreachable_notification_sent' => true, + 'updated_at' => now()->subDays(3), + ]); + + $originalIp = (string) $server->ip; + + $this->artisan('cleanup:unreachable-servers')->assertSuccessful(); + + $server->refresh(); + expect((string) $server->ip)->toBe($originalIp); +}); + +it('does not affect servers with active subscriptions', function () { + $team = Team::factory()->create(); + Subscription::create([ + 'team_id' => $team->id, + 'stripe_invoice_paid' => true, + ]); + $server = Server::factory()->create([ + 'team_id' => $team->id, + 'unreachable_count' => 0, + 'unreachable_notification_sent' => false, + ]); + + $originalCount = $server->unreachable_count; + $originalNotification = $server->unreachable_notification_sent; + + expect($originalCount)->toBe(0); + expect($originalNotification)->toBeFalse(); +});