Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Sunrise.API/Controllers/BeatmapController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ public async Task<IActionResult> HypeBeatmapSet([Range(1, int.MaxValue)] int id,

var user = HttpContext.GetCurrentUserOrThrow();

var hypeBeatmapSetResult = await database.Beatmaps.Hypes.AddBeatmapHypeFromUserInventory(user, beatmapSet.Id);
var hypeBeatmapSetResult = await database.Beatmaps.Hypes.AddBeatmapHypeFromUserInventory(user, beatmapSet.Id, beatmapSet.StatusGeneric);
if (hypeBeatmapSetResult.IsFailure)
return Problem(hypeBeatmapSetResult.Error, statusCode: StatusCodes.Status400BadRequest);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,19 @@
using Sunrise.Shared.Enums;
using Sunrise.Shared.Enums.Beatmaps;
using Sunrise.Shared.Enums.Users;
using Sunrise.Shared.Extensions.Beatmaps;
using Sunrise.Tests.Abstracts;
using Sunrise.Tests.Extensions;
using Sunrise.Tests.Services.Mock;
using Sunrise.Tests.Utils;
using Sunrise.Tests;

namespace Sunrise.Server.Tests.API.BeatmapController;

[Collection("Integration tests collection")]
public class ApiAddBeatmapSetHypeTests(IntegrationDatabaseFixture fixture) : ApiTest(fixture)
{
private readonly MockService _mocker = new();

[Theory]
[InlineData(true)]
[InlineData(false)]
Expand All @@ -32,6 +32,12 @@ public async Task TestAddBeatmapSetHype(bool shouldFillHypeTrain)

var beatmapSet = _mocker.Beatmap.GetRandomBeatmapSet();
beatmapSet.Id = 1;
beatmapSet.StatusString = BeatmapStatusWeb.Graveyard.BeatmapStatusWebToString();

foreach (var beatmap in beatmapSet.Beatmaps)
{
beatmap.StatusString = beatmapSet.StatusString;
}

await _mocker.Beatmap.MockBeatmapSet(beatmapSet);

Expand Down Expand Up @@ -75,12 +81,18 @@ public async Task TestAddBeatmapSetHypeCantHypeIfNoMultipleHypeIsEnabled(bool is

var beatmapSet = _mocker.Beatmap.GetRandomBeatmapSet();
beatmapSet.Id = 1;
beatmapSet.StatusString = BeatmapStatusWeb.Graveyard.BeatmapStatusWebToString();

foreach (var beatmap in beatmapSet.Beatmaps)
{
beatmap.StatusString = beatmapSet.StatusString;
}

await _mocker.Beatmap.MockBeatmapSet(beatmapSet);

EnvManager.Set("BeatmapHype:AllowMultipleHypeFromSameUser", isMultipleHypeEnabled ? "true" : "false");

var addBeatmapHypeBeforeResult = await Database.Beatmaps.Hypes.AddBeatmapHypeFromUserInventory(user, beatmapSet.Id);
var addBeatmapHypeBeforeResult = await Database.Beatmaps.Hypes.AddBeatmapHypeFromUserInventory(user, beatmapSet.Id, beatmapSet.StatusGeneric);
if (addBeatmapHypeBeforeResult.IsFailure)
throw new Exception(addBeatmapHypeBeforeResult.Error);

Expand Down Expand Up @@ -122,6 +134,12 @@ public async Task TestAddBeatmapSetHypeCantHypeIfUserDoesntHasHypes()

var beatmapSet = _mocker.Beatmap.GetRandomBeatmapSet();
beatmapSet.Id = 1;
beatmapSet.StatusString = BeatmapStatusWeb.Graveyard.BeatmapStatusWebToString();

foreach (var beatmap in beatmapSet.Beatmaps)
{
beatmap.StatusString = beatmapSet.StatusString;
}

await _mocker.Beatmap.MockBeatmapSet(beatmapSet);

Expand Down Expand Up @@ -152,6 +170,12 @@ public async Task TestAddBeatmapSetHypeCantHypeIfBeatmapSetHasCustomStatus()

var beatmapSet = _mocker.Beatmap.GetRandomBeatmapSet();
beatmapSet.Id = 1;
beatmapSet.StatusString = BeatmapStatusWeb.Graveyard.BeatmapStatusWebToString();

foreach (var beatmap in beatmapSet.Beatmaps)
{
beatmap.StatusString = beatmapSet.StatusString;
}

await _mocker.Beatmap.MockBeatmapSet(beatmapSet);

Expand Down Expand Up @@ -179,7 +203,7 @@ await Database.Beatmaps.CustomStatuses.AddCustomBeatmapStatus(new CustomBeatmapS
Assert.NotNull(userHypes);
Assert.Equal(userHypes.Quantity, Configuration.UserHypesWeekly);
}

[Fact]
public async Task TestAddBeatmapSetHypeUnauthorized()
{
Expand Down Expand Up @@ -227,4 +251,113 @@ public async Task TestAddBeatmapSetHypeNotFound()
// Assert
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}

[Fact]
public async Task TestAddBeatmapSetHypeCantHypeExcludedStatuses()
{
// Arrange
var client = App.CreateClient().UseClient("api");

var excludedStatus = BeatmapStatusWeb.Pending;

EnvManager.Set("General:IgnoreBeatmapRanking", "false");

EnvManager.Set("BeatmapHype:ExcludedHypeStatuses",
[excludedStatus.ToString()]);

var user = await CreateTestUser();
var tokens = await GetUserAuthTokens(user);
client.UseUserAuthToken(tokens);

var beatmapSet = _mocker.Beatmap.GetRandomBeatmapSet();
beatmapSet.Id = 1;
beatmapSet.StatusString = excludedStatus.BeatmapStatusWebToString();

await _mocker.Beatmap.MockBeatmapSet(beatmapSet);

// Act
var response = await client.PostAsync("beatmapset/1/hype", new StringContent(string.Empty));

// Assert
Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);

var responseString = await response.Content.ReadFromJsonAsyncWithAppConfig<ProblemDetails>();
Assert.Contains("can't hype", responseString?.Detail?.ToLower());

var beatmapHypeCount = await Database.Beatmaps.Hypes.GetBeatmapHypeCount(beatmapSet.Id);
Assert.Equal(0, beatmapHypeCount);

var userHypes = await Database.Users.Inventory.GetInventoryItem(user.Id, ItemType.Hype);
Assert.NotNull(userHypes);
Assert.Equal(userHypes.Quantity, Configuration.UserHypesWeekly);
}

[Fact]
public async Task TestAddBeatmapSetHypeCanHypeNonExcludedStatuses()
{
// Arrange
var client = App.CreateClient().UseClient("api");

EnvManager.Set("General:IgnoreBeatmapRanking", "false");

var user = await CreateTestUser();
var tokens = await GetUserAuthTokens(user);
client.UseUserAuthToken(tokens);

var allowedStatus = BeatmapStatusWeb.Graveyard;

var beatmapSet = _mocker.Beatmap.GetRandomBeatmapSet();
beatmapSet.Id = 1;
beatmapSet.StatusString = allowedStatus.BeatmapStatusWebToString();

await _mocker.Beatmap.MockBeatmapSet(beatmapSet);

// Act
var response = await client.PostAsync("beatmapset/1/hype", new StringContent(string.Empty));

// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);

var beatmapHypeCount = await Database.Beatmaps.Hypes.GetBeatmapHypeCount(beatmapSet.Id);
Assert.Equal(1, beatmapHypeCount);

var userHypes = await Database.Users.Inventory.GetInventoryItem(user.Id, ItemType.Hype);
Assert.NotNull(userHypes);
Assert.Equal(userHypes.Quantity, Configuration.UserHypesWeekly - 1);
}

[Fact]
public async Task TestAddBeatmapSetHypeOverridesDefault()
{
// Arrange
var client = App.CreateClient().UseClient("api");

EnvManager.Set("General:IgnoreBeatmapRanking", "false");
EnvManager.Set("BeatmapHype:ExcludedHypeStatuses", [BeatmapStatusWeb.Qualified.ToString()]);

var user = await CreateTestUser();
var tokens = await GetUserAuthTokens(user);
client.UseUserAuthToken(tokens);

var allowedStatus = BeatmapStatusWeb.Ranked;

var beatmapSet = _mocker.Beatmap.GetRandomBeatmapSet();
beatmapSet.Id = 1;
beatmapSet.StatusString = allowedStatus.BeatmapStatusWebToString();

await _mocker.Beatmap.MockBeatmapSet(beatmapSet);

// Act
var response = await client.PostAsync("beatmapset/1/hype", new StringContent(string.Empty));

// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);

var beatmapHypeCount = await Database.Beatmaps.Hypes.GetBeatmapHypeCount(beatmapSet.Id);
Assert.Equal(1, beatmapHypeCount);

var userHypes = await Database.Users.Inventory.GetInventoryItem(user.Id, ItemType.Hype);
Assert.NotNull(userHypes);
Assert.Equal(userHypes.Quantity, Configuration.UserHypesWeekly - 1);
}
}
31 changes: 30 additions & 1 deletion Sunrise.Server.Tests/API/BeatmapController/ApiBeatmapSetTests.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
using System.Net;
using System.Net;
using System.Net.Http.Json;
using Sunrise.API.Serializable.Request;
using Sunrise.API.Serializable.Response;
using Sunrise.Shared.Database.Models.Beatmap;
using Sunrise.Shared.Enums.Beatmaps;
using Sunrise.Shared.Extensions.Beatmaps;
using Sunrise.Tests.Abstracts;
using Sunrise.Tests.Extensions;
using Sunrise.Tests.Services.Mock;
Expand Down Expand Up @@ -169,4 +170,32 @@ public async Task TestGetBeatmapSetNotFound()
// Assert
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
}

[Theory]
[InlineData(BeatmapStatusWeb.Graveyard, true)]
[InlineData(BeatmapStatusWeb.Ranked, false)]
public async Task TestGetBeatmapSetCanBeHypedBasedOnExcludedStatuses(BeatmapStatusWeb status, bool expectedCanBeHyped)
{
// Arrange
var client = App.CreateClient().UseClient("api");

EnvManager.Set("General:IgnoreBeatmapRanking", "false");

var beatmapSet = _mocker.Beatmap.GetRandomBeatmapSet();
beatmapSet.Id = 1;
beatmapSet.StatusString = status.BeatmapStatusWebToString();

await _mocker.Beatmap.MockBeatmapSet(beatmapSet);

// Act
var response = await client.GetAsync("beatmapset/1");

// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);

var beatmapSetResponse = await response.Content.ReadFromJsonAsyncWithAppConfig<BeatmapSetResponse>();
Assert.NotNull(beatmapSetResponse);
Assert.Equal(status, beatmapSetResponse.Status);
Assert.Equal(expectedCanBeHyped, beatmapSetResponse.CanBeHyped);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
using System.Net;
using System.Net;
using Sunrise.API.Serializable.Response;
using Sunrise.Shared.Application;
using Sunrise.Tests.Abstracts;
using Sunrise.Tests.Extensions;
using Sunrise.Tests.Services.Mock;
using Sunrise.Tests.Utils;
using Sunrise.Tests;

namespace Sunrise.Server.Tests.API.BeatmapController;

Expand All @@ -30,7 +29,7 @@ public async Task TestGetBeatmapSetHype(bool shouldHypeBefore)
if (shouldHypeBefore)
{
var user = await CreateTestUser();
var addBeatmapHypeResult = await Database.Beatmaps.Hypes.AddBeatmapHypeFromUserInventory(user, beatmapSet.Id);
var addBeatmapHypeResult = await Database.Beatmaps.Hypes.AddBeatmapHypeFromUserInventory(user, beatmapSet.Id, beatmapSet.StatusGeneric);
if (addBeatmapHypeResult.IsFailure)
throw new Exception(addBeatmapHypeResult.Error);
}
Expand All @@ -47,7 +46,7 @@ public async Task TestGetBeatmapSetHype(bool shouldHypeBefore)
Assert.Equal(shouldHypeBefore ? 1 : 0, content.CurrentHypes);
Assert.Equal(Configuration.HypesToStartHypeTrain, content.RequiredHypes);
}

[Theory]
[InlineData("-1")]
public async Task TestGetBeatmapSetHypeInvalidBeatmapSetId(string beatmapSetId)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
using System.Net;
using System.Net;
using Sunrise.API.Serializable.Response;
using Sunrise.Shared.Enums.Beatmaps;
using Sunrise.Shared.Enums.Users;
using Sunrise.Shared.Extensions.Beatmaps;
using Sunrise.Tests.Abstracts;
using Sunrise.Tests.Extensions;
using Sunrise.Tests.Services.Mock;
using Sunrise.Tests.Utils;
using Sunrise.Tests;

namespace Sunrise.Server.Tests.API.BeatmapController;

Expand Down Expand Up @@ -62,7 +63,7 @@ public async Task TestGetHypedBeatmapSets(bool shouldAddedHypeStartHypeTrain)

EnvManager.Set("BeatmapHype:HypesToStartHypeTrain", shouldAddedHypeStartHypeTrain ? "1" : "100");

await Database.Beatmaps.Hypes.AddBeatmapHypeFromUserInventory(user, beatmapSet.Id);
await Database.Beatmaps.Hypes.AddBeatmapHypeFromUserInventory(user, beatmapSet.Id, beatmapSet.StatusGeneric);

// Act
var response = await client.GetAsync("beatmapset/get-hyped-sets");
Expand Down Expand Up @@ -97,15 +98,17 @@ public async Task TestGetHypedBeatmapSetsTestPageAndLimit()

var beatmapSetFirst = _mocker.Beatmap.GetRandomBeatmapSet();
beatmapSetFirst.Id = 1;
beatmapSetFirst.StatusString = BeatmapStatusWeb.Graveyard.BeatmapStatusWebToString();

await _mocker.Beatmap.MockBeatmapSet(beatmapSetFirst);
await Database.Beatmaps.Hypes.AddBeatmapHypeFromUserInventory(user, beatmapSetFirst.Id);
await Database.Beatmaps.Hypes.AddBeatmapHypeFromUserInventory(user, beatmapSetFirst.Id, beatmapSetFirst.StatusGeneric);

var beatmapSetSecond = _mocker.Beatmap.GetRandomBeatmapSet();
beatmapSetSecond.Id = 2;
beatmapSetSecond.StatusString = BeatmapStatusWeb.Graveyard.BeatmapStatusWebToString();

await _mocker.Beatmap.MockBeatmapSet(beatmapSetSecond);
await Database.Beatmaps.Hypes.AddBeatmapHypeFromUserInventory(user, beatmapSetSecond.Id);
await Database.Beatmaps.Hypes.AddBeatmapHypeFromUserInventory(user, beatmapSetSecond.Id, beatmapSetSecond.StatusGeneric);

// Act
var response = await client.GetAsync("beatmapset/get-hyped-sets?limit=1&page=2");
Expand All @@ -120,7 +123,7 @@ public async Task TestGetHypedBeatmapSetsTestPageAndLimit()
Assert.Equal(2, content.TotalCount);
Assert.Equal(beatmapSetFirst.Id, content.Sets.First().Id);
}

[Fact]
public async Task TestGetHypedBeatmapSetsUnauthorized()
{
Expand Down
Loading
Loading