diff --git a/src/Lavalink4NET.Tests/Players/QueuedLavalinkPlayerTests.cs b/src/Lavalink4NET.Tests/Players/QueuedLavalinkPlayerTests.cs index bfc3c3e3..be551409 100644 --- a/src/Lavalink4NET.Tests/Players/QueuedLavalinkPlayerTests.cs +++ b/src/Lavalink4NET.Tests/Players/QueuedLavalinkPlayerTests.cs @@ -312,6 +312,84 @@ await listener apiClientMock.Verify(); } + [Fact] + public async Task TestQueueItemRetainedOnTrackEndAsync() + { + // Arrange + var sessionId = "abc"; + var guildId = 0UL; + + var apiClientMock = new Mock(MockBehavior.Strict); + + var playerModel = new PlayerInformationModel( + GuildId: guildId, + CurrentTrack: new TrackModel( + Data: "track1", + Information: CreateDummyTrack(), + AdditionalInformation: ImmutableDictionary.Empty), + Volume: 1F, + IsPaused: false, + VoiceState: CreateVoiceState(), + Filters: new PlayerFilterMapModel()); + + var resultModel = playerModel with + { + CurrentTrack = new TrackModel( + Data: "track2", + Information: CreateDummyTrack(), + AdditionalInformation: ImmutableDictionary.Empty), + }; + + apiClientMock + .Setup(x => x.UpdatePlayerAsync( + sessionId, + guildId, + It.IsAny(), + It.IsAny())) + .Callback(static (string sessionId, ulong guildId, PlayerUpdateProperties properties, CancellationToken token) => + { + Assert.True(properties.Identifier.IsPresent); + Assert.Equal("track2", properties.Identifier.Value); + }) + .ReturnsAsync(resultModel) + .Verifiable(); + + var discordClientMock = new Mock(); + + var sessionProvider = Mock.Of(x + => x.GetSessionAsync(guildId, It.IsAny()) + == ValueTask.FromResult(new LavalinkPlayerSession(apiClientMock.Object, "abc", "abc"))); + + var playerProperties = new PlayerProperties( + Context: new PlayerContext( + ServiceProvider: null, + SessionProvider: sessionProvider, + DiscordClient: discordClientMock.Object, + SystemClock: new SystemClock(), + LifecycleNotifier: null), + Lifecycle: Mock.Of(), + ApiClient: apiClientMock.Object, + InitialState: playerModel, + Label: "Player", + VoiceChannelId: 0, + SessionId: sessionId, + Options: Options.Create(new QueuedLavalinkPlayerOptions()), + Logger: NullLogger.Instance); + + var player = new QueuedLavalinkPlayer(playerProperties); + await player.PlayAsync(new CustomTrackQueueItem(new TrackReference("track2"))); + + var listener = (ILavalinkPlayerListener)player; + + // Act + await listener + .NotifyTrackEndedAsync(player.CurrentTrack!, TrackEndReason.Finished) + .ConfigureAwait(false); + + // Assert + Assert.IsType(player.CurrentItem); + } + [Fact] public async Task TestPlayerRepeatsTrackIfRepeatModeIsTrackAsync() { @@ -570,3 +648,5 @@ private static VoiceStateModel CreateVoiceState() SessionId: "abc"); } } + +public sealed record class CustomTrackQueueItem(TrackReference Reference) : ITrackQueueItem; \ No newline at end of file