Skip to content
Open
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
9 changes: 5 additions & 4 deletions Refresh.Database/GameDatabaseContext.Contests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ public GameContest CreateContest(string contestId, ICreateContestInfo createInfo
ContestId = contestId,
Organizer = organizer,
CreationDate = this._time.Now,
StartDate = createInfo.StartDate!.Value,
EndDate = createInfo.EndDate!.Value,
// EF doesn't support timestamps with offsets
StartDate = createInfo.StartDate!.Value.UtcDateTime,
EndDate = createInfo.EndDate!.Value.UtcDateTime,
ContestTitle = createInfo.ContestTitle!,
BannerUrl = createInfo.BannerUrl ?? "",
ContestTag = createInfo.ContestTag ?? $"#{contestId}",
Expand Down Expand Up @@ -80,9 +81,9 @@ public GameContest UpdateContest(ICreateContestInfo body, GameContest contest, G
contest.Organizer = newOrganizer;

if(body.StartDate != null)
contest.StartDate = body.StartDate.Value;
contest.StartDate = body.StartDate.Value.UtcDateTime;
if(body.EndDate != null)
contest.EndDate = body.EndDate.Value;
contest.EndDate = body.EndDate.Value.UtcDateTime;
if(body.ContestTag != null)
contest.ContestTag = body.ContestTag;
if(body.BannerUrl != null)
Expand Down
2 changes: 1 addition & 1 deletion Refresh.Database/GameDatabaseContext.Users.cs
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ private void PunishUser(GameUser user, string reason, DateTimeOffset expiryDate,
{
user.Role = role;
user.BanReason = reason;
user.BanExpiryDate = expiryDate;
user.BanExpiryDate = expiryDate.UtcDateTime; // EF doesn't support timestamps with offsets
});
}

Expand Down
44 changes: 43 additions & 1 deletion RefreshTests.GameServer/Tests/Levels/ContestTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ private GameContest CreateContest(TestContext context, GameUser? organizer = nul
{
organizer ??= context.CreateUser();
GameLevel templateLevel = context.CreateLevel(organizer);

GameContest contest = context.Database.CreateContest(id, new ApiContestRequest
{
OrganizerId = organizer.UserId.ToString(),
Expand Down Expand Up @@ -95,6 +94,49 @@ public void CanCreateContestWithLessData()
Assert.That(contest, Is.Not.Null);
}

[Test]
public void CanCreateAndUpdateContestWithOffsetTimestamps()
{
using TestContext context = this.GetServer(false);
GameUser organizer = context.CreateUser();
DateTime now = context.Time.Now.DateTime;

// Create
Assert.That(() =>
{
// ReSharper disable once AccessToDisposedClosure
context.Database.CreateContest("contestde", new ApiContestRequest
{
OrganizerId = organizer.UserId.ToString(),
ContestTitle = "geremany contest",
StartDate = new(now, new(2, 0, 0)),
EndDate = new(now.AddHours(4), new(2, 0, 0)),
}, organizer, null);
}, Throws.Nothing);

GameContest? contest = context.Database.GetContestById("contestde");
Assert.That(contest, Is.Not.Null);
Assert.That(contest!.StartDate.DateTime.Equals(now.AddHours(-2)), Is.True);
Assert.That(contest!.EndDate.DateTime.Equals(now.AddHours(2)), Is.True);

// Update
Assert.That(() =>
{
// ReSharper disable once AccessToDisposedClosure
context.Database.UpdateContest(new ApiContestRequest
{
OrganizerId = organizer.UserId.ToString(),
StartDate = new(now, new(4, 0, 0)),
EndDate = new(now.AddHours(5), new(4, 0, 0)),
}, contest, organizer, null);
}, Throws.Nothing);

GameContest? updated = context.Database.GetContestById("contestde");
Assert.That(updated, Is.Not.Null);
Assert.That(updated!.StartDate.DateTime.Equals(now.AddHours(-4)), Is.True);
Assert.That(updated!.EndDate.DateTime.Equals(now.AddHours(1)), Is.True);
}

[Test]
public void CanCreateContestFromApi()
{
Expand Down
42 changes: 42 additions & 0 deletions RefreshTests.GameServer/Tests/Moderation/PunishmentTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using Refresh.Database.Models.Users;

namespace RefreshTests.GameServer.Tests.Moderation;

public class PunishmentTests : GameServerTest
{
[Test]
public void CanPunishWithOffsetExpiryDate()
{
using TestContext context = this.GetServer();
GameUser user = context.CreateUser();
GameUser mod = context.CreateUser();
DateTime now = context.Time.Now.DateTime;

// Restrict
Assert.That(() =>
{
context.Database.RestrictUser(user, "too many skill issues", new(now.AddHours(4), new(2, 0, 0)));
}, Throws.Nothing);

context.Database.Refresh();
GameUser? restrictedUser = context.Database.GetUserByObjectId(user.UserId);
Assert.That(restrictedUser, Is.Not.Null);
Assert.That(restrictedUser!.Role, Is.EqualTo(GameUserRole.Restricted));
Assert.That(restrictedUser!.BanExpiryDate, Is.Not.Null);
Assert.That(restrictedUser!.BanExpiryDate!.Value.DateTime.Equals(now.AddHours(2)), Is.True);

// Ban
Assert.That(() =>
{
// Passing user here, for some reason, makes the ban not get written but also doesn't cause a throw
context.Database.BanUser(restrictedUser, "even more skill issues", new(now.AddHours(8), new(4, 0, 0)));
}, Throws.Nothing);

context.Database.Refresh();
GameUser? bannedUser = context.Database.GetUserByObjectId(restrictedUser.UserId);
Assert.That(bannedUser, Is.Not.Null);
Assert.That(bannedUser!.Role, Is.EqualTo(GameUserRole.Banned));
Assert.That(bannedUser!.BanExpiryDate, Is.Not.Null);
Assert.That(bannedUser!.BanExpiryDate!.Value.DateTime.Equals(now.AddHours(4)), Is.True);
}
}