using GameAuthApi.Controllers; using GameAuthApi.Models; using GameAuthApi.Services; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using System.Security.Claims; public class PlayerControllerTests { private static IConfiguration cfg = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary { {"MongoDB:ConnectionString","mongodb://localhost"}, {"MongoDB:DatabaseName","test"} }).Build(); private static ControllerContext ContextWithUser(string id, string role="USER") { var ctx = new DefaultHttpContext(); ctx.User = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, id), new Claim(ClaimTypes.Role, role) }, "mock")); return new ControllerContext { HttpContext = ctx }; } [Fact] public async Task Create_ReturnsOk() { var playerService = new Mock(cfg); playerService.Setup(p => p.GetByUserIdAsync("u")).ReturnsAsync((Player?)null); playerService.Setup(p => p.CreateAsync(It.IsAny())).Returns(Task.CompletedTask).Verifiable(); var locSvc = new Mock(cfg); locSvc.Setup(l => l.GetSpawnLocationAsync()).ReturnsAsync((Location?)null); locSvc.Setup(l => l.CreateAsync(It.IsAny())).Returns(Task.CompletedTask); var controller = new PlayerController(playerService.Object, locSvc.Object, new Mock(cfg).Object, new Mock(cfg).Object) { ControllerContext = ContextWithUser("u") }; var result = await controller.Create(new CreatePlayerRequest { Name = "p" }); Assert.IsType(result); playerService.Verify(); } [Fact] public async Task Delete_NotFound() { var playerService = new Mock(cfg); playerService.Setup(p => p.GetByUserIdAsync("u")).ReturnsAsync((Player?)null); var controller = new PlayerController(playerService.Object, new Mock(cfg).Object, new Mock(cfg).Object, new Mock(cfg).Object) { ControllerContext = ContextWithUser("u") }; var result = await controller.Delete(); Assert.IsType(result); } [Fact] public async Task AdminTeleport_PlayerNotFound() { var playerService = new Mock(cfg); playerService.Setup(p => p.GetByIdAsync("p")).ReturnsAsync((Player?)null); var controller = new PlayerController(playerService.Object, new Mock(cfg).Object, new Mock(cfg).Object, new Mock(cfg).Object) { ControllerContext = ContextWithUser("admin", "SUPER") }; var result = await controller.AdminTeleport(new TeleportRequest { PlayerId = "p", LocationId = "l" }); Assert.IsType(result); } [Fact] public async Task Move_PlayerNotFound() { var playerService = new Mock(cfg); playerService.Setup(p => p.GetByUserIdAsync("u")).ReturnsAsync((Player?)null); var controller = new PlayerController(playerService.Object, new Mock(cfg).Object, new Mock(cfg).Object, new Mock(cfg).Object) { ControllerContext = ContextWithUser("u") }; var result = await controller.Move(new MoveRequest { Direction = "N" }); Assert.IsType(result); } }