feat(mypage): can_give_daily_login_bonus reflects IsDue(viewer)

Injects ILoginBonusService into MyPageController and sets
CanGiveDailyLoginBonus from IsDue(viewer) in the Index response.
Adds two integration tests: fresh viewer → true, post-load-index → false.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
gamer147
2026-06-13 16:50:17 -04:00
parent 7d83560fc9
commit 0d2da66795
2 changed files with 61 additions and 1 deletions

View File

@@ -30,16 +30,18 @@ public class MyPageController : SVSimController
private readonly IGameConfigService _config; private readonly IGameConfigService _config;
private readonly IArenaTwoPickRunRepository _arenaTwoPickRuns; private readonly IArenaTwoPickRunRepository _arenaTwoPickRuns;
private readonly IHomeDialogSessionTracker _homeDialogTracker; private readonly IHomeDialogSessionTracker _homeDialogTracker;
private readonly ILoginBonusService _loginBonus;
public MyPageController(IViewerRepository viewerRepository, IGlobalsRepository globalsRepository, public MyPageController(IViewerRepository viewerRepository, IGlobalsRepository globalsRepository,
IGameConfigService config, IArenaTwoPickRunRepository arenaTwoPickRuns, IGameConfigService config, IArenaTwoPickRunRepository arenaTwoPickRuns,
IHomeDialogSessionTracker homeDialogTracker) IHomeDialogSessionTracker homeDialogTracker, ILoginBonusService loginBonus)
{ {
_viewerRepository = viewerRepository; _viewerRepository = viewerRepository;
_globalsRepository = globalsRepository; _globalsRepository = globalsRepository;
_config = config; _config = config;
_arenaTwoPickRuns = arenaTwoPickRuns; _arenaTwoPickRuns = arenaTwoPickRuns;
_homeDialogTracker = homeDialogTracker; _homeDialogTracker = homeDialogTracker;
_loginBonus = loginBonus;
} }
[HttpPost("index")] [HttpPost("index")]
@@ -83,6 +85,7 @@ public class MyPageController : SVSimController
return new MyPageIndexResponse return new MyPageIndexResponse
{ {
UserInfo = new UserInfo(deviceType, viewer), UserInfo = new UserInfo(deviceType, viewer),
CanGiveDailyLoginBonus = _loginBonus.IsDue(viewer),
UnreceivedMissionRewardCount = 0, // TODO(mypage-stub): viewer mission progress UnreceivedMissionRewardCount = 0, // TODO(mypage-stub): viewer mission progress
ReceiveFriendApplyCount = 0, // TODO(mypage-stub): viewer friend-request inbox ReceiveFriendApplyCount = 0, // TODO(mypage-stub): viewer friend-request inbox
UnreadPresentCount = 0, // TODO(mypage-stub): viewer presents/mail UnreadPresentCount = 0, // TODO(mypage-stub): viewer presents/mail

View File

@@ -0,0 +1,57 @@
using System.Net;
using System.Text;
using System.Text.Json;
using NUnit.Framework;
using SVSim.UnitTests.Infrastructure;
namespace SVSim.UnitTests.Controllers;
/// <summary>
/// Coverage for <c>/mypage/index</c>. Focused on fields computed from viewer state
/// that are easy to regress (can_give_daily_login_bonus).
/// </summary>
public class MyPageControllerTests
{
// MyPageIndexRequest extends BaseRequest, so viewer_id + steam_session_ticket are required.
private const string MyPageRequestJson =
"""{"viewer_id":"0","steam_id":0,"steam_session_ticket":"","carrier":"steam"}""";
private const string LoadIndexRequestJson =
"""{"viewer_id":"0","steam_id":0,"steam_session_ticket":"","carrier":"steam","card_master_hash":""}""";
[Test]
public async Task MyPage_can_give_daily_login_bonus_is_true_for_fresh_viewer()
{
using var factory = new SVSimTestFactory();
long viewerId = await factory.SeedViewerAsync();
using var client = factory.CreateAuthenticatedClient(viewerId);
var resp = await client.PostAsync("/mypage/index",
new StringContent(MyPageRequestJson, Encoding.UTF8, "application/json"));
Assert.That(resp.StatusCode, Is.EqualTo(HttpStatusCode.OK), await resp.Content.ReadAsStringAsync());
var root = JsonDocument.Parse(await resp.Content.ReadAsStringAsync()).RootElement;
Assert.That(root.GetProperty("can_give_daily_login_bonus").GetBoolean(), Is.True);
}
[Test]
public async Task MyPage_can_give_daily_login_bonus_is_false_after_load_index_claim()
{
using var factory = new SVSimTestFactory();
long viewerId = await factory.SeedViewerAsync();
using var client = factory.CreateAuthenticatedClient(viewerId);
// /load/index claims today's bonus
var loadResp = await client.PostAsync("/load/index",
new StringContent(LoadIndexRequestJson, Encoding.UTF8, "application/json"));
Assert.That(loadResp.StatusCode, Is.EqualTo(HttpStatusCode.OK), await loadResp.Content.ReadAsStringAsync());
// /mypage/index must report flag = false after the claim
var resp = await client.PostAsync("/mypage/index",
new StringContent(MyPageRequestJson, Encoding.UTF8, "application/json"));
Assert.That(resp.StatusCode, Is.EqualTo(HttpStatusCode.OK), await resp.Content.ReadAsStringAsync());
var root = JsonDocument.Parse(await resp.Content.ReadAsStringAsync()).RootElement;
Assert.That(root.GetProperty("can_give_daily_login_bonus").GetBoolean(), Is.False);
}
}