Skip to content

Commit f80f016

Browse files
committed
Add playlist API tests
1 parent af4e7ef commit f80f016

2 files changed

Lines changed: 250 additions & 0 deletions

File tree

RefreshTests.GameServer/TestContext.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
using Refresh.Interfaces.Game.Types.UserData.Leaderboard;
1515
using Refresh.Workers;
1616
using Refresh.Interfaces.Game.Endpoints.DataTypes.Request;
17+
using Refresh.Database.Models.Playlists;
18+
using Refresh.Interfaces.APIv3.Endpoints.DataTypes.Request;
1719

1820
namespace RefreshTests.GameServer;
1921

@@ -197,6 +199,16 @@ public GameScore SubmitScore(int score, byte type, GameLevel level, GameUser use
197199
return submittedScore;
198200
}
199201

202+
public GamePlaylist CreatePlaylist(GameUser author, string? title = null)
203+
{
204+
ApiPlaylistCreationRequest playlist = new()
205+
{
206+
Name = title
207+
};
208+
209+
return this.Database.CreatePlaylist(author, playlist);
210+
}
211+
200212
[Pure]
201213
public TService GetService<TService>() where TService : Service => this.Server.Value.GetService<TService>();
202214

Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
using Refresh.Database.Models.Users;
2+
using Refresh.Interfaces.APIv3.Endpoints.ApiTypes;
3+
using RefreshTests.GameServer.Extensions;
4+
using Refresh.Database.Models.Authentication;
5+
using Refresh.Interfaces.APIv3.Endpoints.DataTypes.Response.Playlists;
6+
using Refresh.Interfaces.APIv3.Endpoints.DataTypes.Request;
7+
using Refresh.Database.Models.Playlists;
8+
using Refresh.Database.Models.Levels;
9+
using Refresh.Common.Constants;
10+
11+
namespace RefreshTests.GameServer.Tests.ApiV3;
12+
13+
public class PlaylistApiTests : GameServerTest
14+
{
15+
[Test]
16+
public void CreateAndUpdatePlaylist()
17+
{
18+
using TestContext context = this.GetServer();
19+
GameUser user = context.CreateUser();
20+
using HttpClient client = context.GetAuthenticatedClient(TokenType.Api, user);
21+
22+
// Create
23+
ApiPlaylistCreationRequest request = new()
24+
{
25+
Name = "Hardest levels",
26+
Description = "idk"
27+
};
28+
ApiResponse<ApiGamePlaylistResponse>? response = client.PostData<ApiGamePlaylistResponse>($"/api/v3/playlists", request);
29+
Assert.That(response?.Data, Is.Not.Null);
30+
Assert.That(response!.Data!.Name, Is.EqualTo(request.Name));
31+
Assert.That(response!.Data!.Description, Is.EqualTo(request.Description));
32+
context.Database.Refresh();
33+
34+
// Ensure the playlist is in the root playlist
35+
GamePlaylist? root = context.Database.GetUserRootPlaylist(user);
36+
Assert.That(root, Is.Not.Null);
37+
Assert.That(context.Database.GetPlaylistsInPlaylist(root!, 0, 100).Items.Any(p => p.PlaylistId == response.Data.PlaylistId), Is.True);
38+
context.Database.Refresh();
39+
40+
// Update
41+
ApiPlaylistCreationRequest update = new()
42+
{
43+
Description = "Read the description smh"
44+
};
45+
response = client.PatchData<ApiGamePlaylistResponse>($"/api/v3/playlists/id/{response.Data.PlaylistId}", update);
46+
Assert.That(response?.Data, Is.Not.Null);
47+
Assert.That(response!.Data!.Name, Is.EqualTo(request.Name));
48+
Assert.That(response!.Data!.Description, Is.EqualTo(update.Description));
49+
Assert.That(response!.Data!.Description, Is.Not.EqualTo(request.Description));
50+
}
51+
52+
[Test]
53+
public void TrimPlaylistNameAndDescription()
54+
{
55+
using TestContext context = this.GetServer();
56+
GameUser user = context.CreateUser();
57+
using HttpClient client = context.GetAuthenticatedClient(TokenType.Api, user);
58+
59+
// Create
60+
ApiPlaylistCreationRequest request = new()
61+
{
62+
Name = new string('S', 600),
63+
Description = new string('S', 600)
64+
};
65+
ApiResponse<ApiGamePlaylistResponse>? response = client.PostData<ApiGamePlaylistResponse>($"/api/v3/playlists", request);
66+
Assert.That(response?.Data, Is.Not.Null);
67+
Assert.That(response!.Data!.Name.Length, Is.EqualTo(UgcLimits.TitleLimit));
68+
Assert.That(response!.Data!.Description.Length, Is.EqualTo(UgcLimits.DescriptionLimit));
69+
context.Database.Refresh();
70+
71+
// Update
72+
ApiPlaylistCreationRequest update = new()
73+
{
74+
Name = new string('S', 600),
75+
Description = new string('S', 600)
76+
};
77+
response = client.PatchData<ApiGamePlaylistResponse>($"/api/v3/playlists/id/{response.Data.PlaylistId}", update);
78+
Assert.That(response?.Data, Is.Not.Null);
79+
Assert.That(response!.Data!.Name.Length, Is.EqualTo(UgcLimits.TitleLimit));
80+
Assert.That(response!.Data!.Description.Length, Is.EqualTo(UgcLimits.DescriptionLimit));
81+
}
82+
83+
[Test]
84+
public void ClampPlaylistLocation()
85+
{
86+
using TestContext context = this.GetServer();
87+
GameUser user = context.CreateUser();
88+
using HttpClient client = context.GetAuthenticatedClient(TokenType.Api, user);
89+
90+
// Create
91+
ApiPlaylistCreationRequest request = new()
92+
{
93+
Location = new(1234567, -420)
94+
};
95+
ApiResponse<ApiGamePlaylistResponse>? response = client.PostData<ApiGamePlaylistResponse>($"/api/v3/playlists", request);
96+
Assert.That(response?.Data, Is.Not.Null);
97+
Assert.That(response!.Data!.Location.X, Is.EqualTo(ushort.MaxValue));
98+
Assert.That(response!.Data!.Location.Y, Is.Zero);
99+
context.Database.Refresh();
100+
101+
// Update
102+
ApiPlaylistCreationRequest update = new()
103+
{
104+
Location = new(-420, 510)
105+
};
106+
response = client.PatchData<ApiGamePlaylistResponse>($"/api/v3/playlists/id/{response.Data.PlaylistId}", update);
107+
Assert.That(response?.Data, Is.Not.Null);
108+
Assert.That(response!.Data!.Location.X, Is.Zero);
109+
Assert.That(response!.Data!.Location.Y, Is.EqualTo(update.Location.Y));
110+
}
111+
112+
[Test]
113+
public async Task GetAndDeletePlaylist()
114+
{
115+
using TestContext context = this.GetServer();
116+
GameUser user = context.CreateUser();
117+
GamePlaylist playlist = context.CreatePlaylist(user);
118+
using HttpClient client = context.GetAuthenticatedClient(TokenType.Api, user);
119+
120+
// Get (unauthenticated)
121+
ApiPlaylistCreationRequest request = new()
122+
{
123+
Name = "Easiest levels",
124+
Description = "for the skill issued"
125+
};
126+
ApiResponse<ApiGamePlaylistResponse>? response = context.Http.GetData<ApiGamePlaylistResponse>($"/api/v3/playlists/id/{playlist.PlaylistId}");
127+
Assert.That(response?.Data, Is.Not.Null);
128+
Assert.That(response!.Data!.PlaylistId, Is.EqualTo(playlist.PlaylistId));
129+
130+
// Delete (authenticated)
131+
HttpResponseMessage deletionResponse = await client.DeleteAsync($"/api/v3/playlists/id/{playlist.PlaylistId}");
132+
Assert.That(deletionResponse, Is.Not.Null);
133+
Assert.That(deletionResponse.IsSuccessStatusCode, Is.True);
134+
135+
GamePlaylist? postDeletionPlaylist = context.Database.GetPlaylistById(playlist.PlaylistId);
136+
Assert.That(postDeletionPlaylist, Is.Null);
137+
}
138+
139+
[Test]
140+
public async Task AddAndRemoveLevelToPlaylist()
141+
{
142+
using TestContext context = this.GetServer();
143+
GameUser user = context.CreateUser();
144+
GameLevel level = context.CreateLevel(user);
145+
GamePlaylist playlist = context.CreatePlaylist(user);
146+
using HttpClient client = context.GetAuthenticatedClient(TokenType.Api, user);
147+
148+
// Add
149+
HttpResponseMessage response = await client.PostAsync($"/api/v3/playlists/id/{playlist.PlaylistId}/addLevel/id/{level.LevelId}", null);
150+
Assert.That(response.IsSuccessStatusCode, Is.True);
151+
Assert.That(context.Database.GetTotalLevelsInPlaylist(playlist), Is.EqualTo(1));
152+
Assert.That(context.Database.GetTotalPlaylistsContainingLevel(level), Is.EqualTo(1));
153+
154+
// Remove
155+
response = await client.PostAsync($"/api/v3/playlists/id/{playlist.PlaylistId}/removeLevel/id/{level.LevelId}", null);
156+
Assert.That(response.IsSuccessStatusCode, Is.True);
157+
Assert.That(context.Database.GetTotalLevelsInPlaylist(playlist), Is.Zero);
158+
Assert.That(context.Database.GetTotalPlaylistsContainingLevel(level), Is.Zero);
159+
}
160+
161+
[Test]
162+
public async Task CantAddAndRemoveLevelToOthersPlaylist()
163+
{
164+
using TestContext context = this.GetServer();
165+
GameUser creator = context.CreateUser();
166+
GameUser moron = context.CreateUser();
167+
GameLevel level = context.CreateLevel(moron);
168+
GamePlaylist playlist = context.CreatePlaylist(creator);
169+
using HttpClient client = context.GetAuthenticatedClient(TokenType.Api, moron);
170+
171+
// Add (fail)
172+
HttpResponseMessage response = await client.PostAsync($"/api/v3/playlists/id/{playlist.PlaylistId}/addLevel/id/{level.LevelId}", null);
173+
Assert.That(response.IsSuccessStatusCode, Is.False);
174+
Assert.That(context.Database.GetTotalLevelsInPlaylist(playlist), Is.Zero);
175+
Assert.That(context.Database.GetTotalPlaylistsContainingLevel(level), Is.Zero);
176+
177+
// Add (prepare for removal)
178+
context.Database.AddLevelToPlaylist(level, playlist);
179+
Assert.That(context.Database.GetTotalLevelsInPlaylist(playlist), Is.EqualTo(1));
180+
Assert.That(context.Database.GetTotalPlaylistsContainingLevel(level), Is.EqualTo(1));
181+
182+
// Remove
183+
response = await client.PostAsync($"/api/v3/playlists/id/{playlist.PlaylistId}/removeLevel/id/{level.LevelId}", null);
184+
Assert.That(response.IsSuccessStatusCode, Is.False);
185+
Assert.That(context.Database.GetTotalLevelsInPlaylist(playlist), Is.EqualTo(1));
186+
Assert.That(context.Database.GetTotalPlaylistsContainingLevel(level), Is.EqualTo(1));
187+
}
188+
189+
[Test]
190+
public async Task AddAndRemovePlaylistToPlaylist()
191+
{
192+
using TestContext context = this.GetServer();
193+
GameUser user = context.CreateUser();
194+
GamePlaylist parent = context.CreatePlaylist(user);
195+
GamePlaylist child = context.CreatePlaylist(user);
196+
using HttpClient client = context.GetAuthenticatedClient(TokenType.Api, user);
197+
198+
// Add
199+
HttpResponseMessage response = await client.PostAsync($"/api/v3/playlists/id/{parent.PlaylistId}/addPlaylist/id/{child.PlaylistId}", null);
200+
Assert.That(response.IsSuccessStatusCode, Is.True);
201+
Assert.That(context.Database.GetTotalPlaylistsInPlaylist(parent), Is.EqualTo(1));
202+
Assert.That(context.Database.GetTotalPlaylistsContainingPlaylist(child), Is.EqualTo(1));
203+
204+
// Remove
205+
response = await client.PostAsync($"/api/v3/playlists/id/{parent.PlaylistId}/removePlaylist/id/{child.PlaylistId}", null);
206+
Assert.That(response.IsSuccessStatusCode, Is.True);
207+
Assert.That(context.Database.GetTotalPlaylistsInPlaylist(parent), Is.Zero);
208+
Assert.That(context.Database.GetTotalPlaylistsContainingPlaylist(child), Is.Zero);
209+
}
210+
211+
[Test]
212+
public async Task CantAddAndRemovePlaylistToOthersPlaylist()
213+
{
214+
using TestContext context = this.GetServer();
215+
GameUser creator = context.CreateUser();
216+
GameUser moron = context.CreateUser();
217+
GamePlaylist parent = context.CreatePlaylist(creator);
218+
GamePlaylist child = context.CreatePlaylist(moron);
219+
using HttpClient client = context.GetAuthenticatedClient(TokenType.Api, moron);
220+
221+
// Add (fail)
222+
HttpResponseMessage response = await client.PostAsync($"/api/v3/playlists/id/{parent.PlaylistId}/addPlaylist/id/{child.PlaylistId}", null);
223+
Assert.That(response.IsSuccessStatusCode, Is.False);
224+
Assert.That(context.Database.GetTotalPlaylistsInPlaylist(parent), Is.Zero);
225+
Assert.That(context.Database.GetTotalPlaylistsContainingPlaylist(child), Is.Zero);
226+
227+
// Add (prepare for removal)
228+
context.Database.AddPlaylistToPlaylist(child, parent);
229+
Assert.That(context.Database.GetTotalPlaylistsInPlaylist(parent), Is.EqualTo(1));
230+
Assert.That(context.Database.GetTotalPlaylistsContainingPlaylist(child), Is.EqualTo(1));
231+
232+
// Remove
233+
response = await client.PostAsync($"/api/v3/playlists/id/{parent.PlaylistId}/removePlaylist/id/{child.PlaylistId}", null);
234+
Assert.That(response.IsSuccessStatusCode, Is.False);
235+
Assert.That(context.Database.GetTotalPlaylistsInPlaylist(parent), Is.EqualTo(1));
236+
Assert.That(context.Database.GetTotalPlaylistsContainingPlaylist(child), Is.EqualTo(1));
237+
}
238+
}

0 commit comments

Comments
 (0)