using System.Security.Claims; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using NSubstitute; using UniVerse.Api.Controllers; using UniVerse.Application.DTOs.Users; using UniVerse.Application.Interfaces; using UniVerse.Domain.Enums; using Xunit; namespace UniVerse.Api.Tests.Auth; public class ProfilePhotoControllerTests { [Fact] public async Task Get_UsesCurrentUserAndReturnsPhotoWithoutCaching() { var auth = Substitute.For(); auth.GetCurrentUserAsync(7).Returns(new CurrentUserDto( 7, "user@sfedu.ru", "Test", null, [UserRole.Student], 0, 0, 1, DateTime.UtcNow)); var microsoft = Substitute.For(); microsoft.GetPhotoAsync(7, Arg.Any()) .Returns(new MicrosoftPhotoResult([1, 2, 3], "image/jpeg")); var controller = CreateController(auth, microsoft, 7); var result = await controller.Get(CancellationToken.None); var file = Assert.IsType(result); Assert.Equal([1, 2, 3], file.FileContents); Assert.Equal("image/jpeg", file.ContentType); Assert.Equal("private, no-store", controller.Response.Headers.CacheControl); await microsoft.Received(1).GetPhotoAsync(7, Arg.Any()); } [Fact] public async Task Get_ReturnsNotFoundWhenPhotoIsUnavailable() { var auth = Substitute.For(); auth.GetCurrentUserAsync(7).Returns(new CurrentUserDto( 7, "user@sfedu.ru", "Test", null, [UserRole.Student], 0, 0, 1, DateTime.UtcNow)); var controller = CreateController(auth, Substitute.For(), 7); Assert.IsType(await controller.Get(CancellationToken.None)); } private static ProfilePhotoController CreateController(IAuthService auth, IMicrosoftAuthClient microsoft, int userId) { var controller = new ProfilePhotoController(auth, microsoft); controller.ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext { User = new ClaimsPrincipal(new ClaimsIdentity( [new Claim(ClaimTypes.NameIdentifier, userId.ToString())], "test")) } }; return controller; } }