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); } [Fact] public async Task PerformAction_PlayerNotFound() { var svc = new Mock(cfg); svc.Setup(p => p.GetByUserIdAsync("u")).ReturnsAsync((Player?)null); var controller = new PlayerController(svc.Object, new Mock(cfg).Object, new Mock(cfg).Object, new Mock(cfg).Object) { ControllerContext = ContextWithUser("u") }; var result = await controller.PerformAction(new PerformActionRequest { Action = "gather" }); Assert.IsType(result); } [Fact] public async Task PerformAction_ReturnsOutcome() { var playerSvc = new Mock(cfg); var player = new Player { Id = "p", UserId = "u", LocationId = "loc", InventoryLocationId = "inv" }; playerSvc.Setup(p => p.GetByUserIdAsync("u")).ReturnsAsync(player); var locSvc = new Mock(cfg); var loc = new Location { Id = "loc", Content = new List { "i" } }; locSvc.Setup(l => l.GetByIdAsync("loc")).ReturnsAsync(loc); var itemSvc = new Mock(cfg); itemSvc.Setup(i => i.GetByIdAsync("i")).ReturnsAsync(new Item { Id = "i", Name = "wood" }); var spawnSvc = new Mock(cfg); spawnSvc.Setup(s => s.GetByNameAsync("wood")).ReturnsAsync(new Spawnable { Name = "wood", CollectAction = "chop", CollectResults = new List { new() { Result = "log", SuccessRate = 100 } } }); var controller = new PlayerController(playerSvc.Object, locSvc.Object, spawnSvc.Object, itemSvc.Object) { ControllerContext = ContextWithUser("u") }; var result = await controller.PerformAction(new PerformActionRequest { Action = "chop" }); var ok = Assert.IsType(result); Assert.Equal("log", ok.Value); } }