UserControllerTests.cs 6.3 KB

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