category = Category::factory()->create([ 'checkin_email' => false, 'eula_text' => null, 'require_acceptance' => false, 'use_default_eula' => false, ]); $this->assetModel = AssetModel::factory()->for($this->category)->create(); $this->asset = Asset::factory()->for($this->assetModel, 'model')->create(); $this->user = User::factory()->create(); } public function test_email_sent_to_user_when_category_requires_acceptance() { $this->category->update(['require_acceptance' => true]); $this->fireCheckoutEvent(); $this->assertUserSentEmail(); } public function test_email_sent_to_user_when_category_using_default_eula() { $this->settings->setEula(); $this->category->update(['use_default_eula' => true]); $this->fireCheckoutEvent(); $this->assertUserSentEmail(); } public function test_email_sent_to_user_when_category_using_local_eula() { $this->category->update(['eula_text' => 'Some EULA text']); $this->fireCheckoutEvent(); $this->assertUserSentEmail(); } public function test_email_sent_to_user_when_category_set_to_explicitly_send_email() { $this->category->update(['checkin_email' => true]); $this->fireCheckoutEvent(); $this->assertUserSentEmail(); } public function test_handles_user_not_having_email_address_set() { $this->category->update(['checkin_email' => true]); $this->user->update(['email' => null]); $this->fireCheckoutEvent(); Mail::assertNothingSent(); } public function test_admin_alert_email_sends() { $this->settings->enableAdminCC('cc@example.com'); $this->category->update(['checkin_email' => true]); $this->fireCheckoutEvent(); Mail::assertSent(CheckoutAssetMail::class, function (CheckoutAssetMail $mail) { return $mail->hasCc('cc@example.com'); }); } public function test_admin_alert_email_still_sent_when_category_is_not_set_to_send_email_to_user() { $this->settings->enableAdminCC('cc@example.com'); $this->fireCheckoutEvent(); Mail::assertSent(CheckoutAssetMail::class, function ($mail) { return $mail->hasTo('cc@example.com'); }); } public function test_admin_alert_email_still_sent_when_user_has_no_email_address() { $this->settings->enableAdminCC('cc@example.com'); $this->category->update(['checkin_email' => true]); $this->user->update(['email' => null]); $this->fireCheckoutEvent(); Mail::assertSent(CheckoutAssetMail::class, function ($mail) { return $mail->hasTo('cc@example.com'); }); } private function fireCheckoutEvent(): void { event(new CheckoutableCheckedOut( $this->asset, $this->user, User::factory()->superuser()->create(), '', )); } private function assertUserSentEmail(): void { Mail::assertSent(CheckoutAssetMail::class, function (CheckoutAssetMail $mail) { return $mail->hasTo($this->user->email); }); } }