createOne(); $resource = ExternalResource::factory()->createOne(); $song->resources()->attach($resource); Event::assertDispatched(SongResourceCreated::class); } /** * When an Song is detached from a Resource or vice versa, an SongResourceDeleted event shall be dispatched. * * @return void */ public function testSongResourceDeletedEventDispatched(): void { $song = Song::factory()->createOne(); $resource = ExternalResource::factory()->createOne(); $song->resources()->attach($resource); $song->resources()->detach($resource); Event::assertDispatched(SongResourceDeleted::class); } /** * When an Song Resource pivot is updated, an SongResourceUpdated event shall be dispatched. * * @return void */ public function testSongResourceUpdatedEventDispatched(): void { $song = Song::factory()->createOne(); $resource = ExternalResource::factory()->createOne(); $songResource = SongResource::factory() ->for($song, 'song') ->for($resource, 'resource') ->createOne(); $changes = SongResource::factory() ->for($song, 'song') ->for($resource, 'resource') ->makeOne(); $songResource->fill($changes->getAttributes()); $songResource->save(); Event::assertDispatched(SongResourceUpdated::class); } /** * The SongResourceUpdated event shall contain embed fields. * * @return void */ public function testSongResourceUpdatedEventEmbedFields(): void { $song = Song::factory()->createOne(); $resource = ExternalResource::factory()->createOne(); $songResource = SongResource::factory() ->for($song, 'song') ->for($resource, 'resource') ->createOne(); $changes = SongResource::factory() ->for($song, 'song') ->for($resource, 'resource') ->makeOne(); $songResource->fill($changes->getAttributes()); $songResource->save(); Event::assertDispatched(SongResourceUpdated::class, function (SongResourceUpdated $event) { $message = $event->getDiscordMessage(); return ! empty(Arr::get($message->embed, 'fields')); }); } }