getKey() on the notifiable during send-time tracking. // Output-level assertions still catch what matters: the command // completes without exception, took the correct branch, and reported // the right thing to cron. public function test_reports_low_inventory_count_when_items_are_low(): void { $this->settings->set([ 'alerts_enabled' => 1, 'alert_email' => 'ops@example.test', 'alert_threshold' => 0, ]); Consumable::factory()->create(['qty' => 0, 'min_amt' => 1]); $this->artisan('snipeit:inventory-alerts') ->expectsOutputToContain('below minimum inventory') ->assertExitCode(0); } public function test_reports_nothing_to_send_when_no_low_inventory(): void { $this->settings->set([ 'alerts_enabled' => 1, 'alert_email' => 'ops@example.test', 'alert_threshold' => 0, ]); Consumable::factory()->create(['qty' => 10, 'min_amt' => 1]); $this->artisan('snipeit:inventory-alerts') ->expectsOutputToContain('No low inventory items found') ->assertExitCode(0); } public function test_no_op_when_alerts_disabled_in_settings(): void { $this->settings->set([ 'alerts_enabled' => 0, 'alert_email' => 'ops@example.test', ]); Consumable::factory()->create(['qty' => 0, 'min_amt' => 1]); $this->artisan('snipeit:inventory-alerts') ->expectsOutputToContain('Alerts are disabled') ->assertExitCode(0); } public function test_no_op_when_alert_email_is_blank(): void { $this->settings->set([ 'alerts_enabled' => 1, 'alert_email' => '', ]); Consumable::factory()->create(['qty' => 0, 'min_amt' => 1]); $this->artisan('snipeit:inventory-alerts') ->expectsOutputToContain('No alert email configured') ->assertExitCode(0); } }