UserControllerTests.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. using System;
  2. using System.Globalization;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Http;
  6. using System.Net.Http.Headers;
  7. using System.Net.Mime;
  8. using System.Text.Json;
  9. using System.Threading.Tasks;
  10. using Jellyfin.Api.Models.UserDtos;
  11. using Jellyfin.Extensions.Json;
  12. using MediaBrowser.Model.Dto;
  13. using Xunit;
  14. using Xunit.Priority;
  15. namespace Jellyfin.Server.Integration.Tests.Controllers
  16. {
  17. [TestCaseOrderer(PriorityOrderer.Name, PriorityOrderer.Assembly)]
  18. public sealed class UserControllerTests : IClassFixture<JellyfinApplicationFactory>
  19. {
  20. private const string TestUsername = "testUser01";
  21. private readonly JellyfinApplicationFactory _factory;
  22. private readonly JsonSerializerOptions _jsonOpions = JsonDefaults.Options;
  23. private static string? _accessToken;
  24. private static Guid _testUserId = Guid.Empty;
  25. public UserControllerTests(JellyfinApplicationFactory factory)
  26. {
  27. _factory = factory;
  28. }
  29. private Task<HttpResponseMessage> CreateUserByName(HttpClient httpClient, CreateUserByName request)
  30. {
  31. using var postContent = new ByteArrayContent(JsonSerializer.SerializeToUtf8Bytes(request, _jsonOpions));
  32. postContent.Headers.ContentType = MediaTypeHeaderValue.Parse(MediaTypeNames.Application.Json);
  33. return httpClient.PostAsync("Users/New", postContent);
  34. }
  35. private Task<HttpResponseMessage> UpdateUserPassword(HttpClient httpClient, Guid userId, UpdateUserPassword request)
  36. {
  37. using var postContent = new ByteArrayContent(JsonSerializer.SerializeToUtf8Bytes(request, _jsonOpions));
  38. postContent.Headers.ContentType = MediaTypeHeaderValue.Parse(MediaTypeNames.Application.Json);
  39. return httpClient.PostAsync("Users/" + userId.ToString("N", CultureInfo.InvariantCulture) + "/Password", postContent);
  40. }
  41. [Fact]
  42. [Priority(-1)]
  43. public async Task GetPublicUsers_Valid_Success()
  44. {
  45. var client = _factory.CreateClient();
  46. using var response = await client.GetAsync("Users/Public").ConfigureAwait(false);
  47. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  48. var users = await JsonSerializer.DeserializeAsync<UserDto[]>(
  49. await response.Content.ReadAsStreamAsync().ConfigureAwait(false), _jsonOpions).ConfigureAwait(false);
  50. // User are hidden by default
  51. Assert.Empty(users);
  52. }
  53. [Fact]
  54. [Priority(-1)]
  55. public async Task GetUsers_Valid_Success()
  56. {
  57. var client = _factory.CreateClient();
  58. client.DefaultRequestHeaders.AddAuthHeader(_accessToken ??= await AuthHelper.CompleteStartupAsync(client).ConfigureAwait(false));
  59. using var response = await client.GetAsync("Users").ConfigureAwait(false);
  60. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  61. var users = await JsonSerializer.DeserializeAsync<UserDto[]>(
  62. await response.Content.ReadAsStreamAsync().ConfigureAwait(false), _jsonOpions).ConfigureAwait(false);
  63. Assert.Single(users);
  64. Assert.False(users![0].HasConfiguredPassword);
  65. }
  66. [Fact]
  67. [Priority(0)]
  68. public async Task New_Valid_Success()
  69. {
  70. var client = _factory.CreateClient();
  71. // access token can't be null here as the previous test populated it
  72. client.DefaultRequestHeaders.AddAuthHeader(_accessToken!);
  73. var createRequest = new CreateUserByName()
  74. {
  75. Name = TestUsername
  76. };
  77. using var response = await CreateUserByName(client, createRequest).ConfigureAwait(false);
  78. Assert.Equal(HttpStatusCode.OK, response.StatusCode);
  79. var user = await JsonSerializer.DeserializeAsync<UserDto>(
  80. await response.Content.ReadAsStreamAsync().ConfigureAwait(false), _jsonOpions).ConfigureAwait(false);
  81. Assert.Equal(TestUsername, user!.Name);
  82. Assert.False(user.HasPassword);
  83. Assert.False(user.HasConfiguredPassword);
  84. _testUserId = user.Id;
  85. Console.WriteLine(user.Id.ToString("N", CultureInfo.InvariantCulture));
  86. }
  87. [Theory]
  88. [InlineData(null)]
  89. [InlineData("")]
  90. [InlineData(" ")]
  91. [InlineData("‼️")]
  92. [Priority(0)]
  93. public async Task New_Invalid_Fail(string? username)
  94. {
  95. var client = _factory.CreateClient();
  96. // access token can't be null here as the previous test populated it
  97. client.DefaultRequestHeaders.AddAuthHeader(_accessToken!);
  98. var createRequest = new CreateUserByName()
  99. {
  100. Name = username
  101. };
  102. using var response = await CreateUserByName(client, createRequest).ConfigureAwait(false);
  103. Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
  104. }
  105. [Fact]
  106. [Priority(1)]
  107. public async Task UpdateUserPassword_Valid_Success()
  108. {
  109. var client = _factory.CreateClient();
  110. client.DefaultRequestHeaders.AddAuthHeader(_accessToken!);
  111. var createRequest = new UpdateUserPassword()
  112. {
  113. NewPw = "4randomPa$$word"
  114. };
  115. using var response = await UpdateUserPassword(client, _testUserId, createRequest).ConfigureAwait(false);
  116. Assert.Equal(HttpStatusCode.NoContent, response.StatusCode);
  117. var users = await JsonSerializer.DeserializeAsync<UserDto[]>(
  118. await client.GetStreamAsync("Users").ConfigureAwait(false), _jsonOpions).ConfigureAwait(false);
  119. var user = users!.First(x => x.Id == _testUserId);
  120. Assert.True(user.HasPassword);
  121. Assert.True(user.HasConfiguredPassword);
  122. }
  123. [Fact]
  124. [Priority(2)]
  125. public async Task UpdateUserPassword_Empty_RemoveSetPassword()
  126. {
  127. var client = _factory.CreateClient();
  128. client.DefaultRequestHeaders.AddAuthHeader(_accessToken!);
  129. var createRequest = new UpdateUserPassword()
  130. {
  131. CurrentPw = "4randomPa$$word",
  132. };
  133. using var response = await UpdateUserPassword(client, _testUserId, createRequest).ConfigureAwait(false);
  134. Assert.Equal(HttpStatusCode.NoContent, response.StatusCode);
  135. var users = await JsonSerializer.DeserializeAsync<UserDto[]>(
  136. await client.GetStreamAsync("Users").ConfigureAwait(false), _jsonOpions).ConfigureAwait(false);
  137. var user = users!.First(x => x.Id == _testUserId);
  138. Assert.False(user.HasPassword);
  139. Assert.False(user.HasConfiguredPassword);
  140. }
  141. }
  142. }