using System; using System.Net; using System.Net.Http; using System.Net.Http.Json; using System.Net.Mime; using System.Text.Json; using System.Threading.Tasks; using Jellyfin.Api.Models.StartupDtos; using Jellyfin.Extensions.Json; using Xunit; using Xunit.Priority; namespace Jellyfin.Server.Integration.Tests.Controllers { [TestCaseOrderer(PriorityOrderer.Name, PriorityOrderer.Assembly)] public sealed class StartupControllerTests : IClassFixture { private readonly JellyfinApplicationFactory _factory; private readonly JsonSerializerOptions _jsonOptions = JsonDefaults.Options; public StartupControllerTests(JellyfinApplicationFactory factory) { _factory = factory; } [Fact] [Priority(-2)] public async Task Configuration_EditConfig_Success() { var client = _factory.CreateClient(); var config = new StartupConfigurationDto() { UICulture = "NewCulture", MetadataCountryCode = "be", PreferredMetadataLanguage = "nl" }; using var postResponse = await client.PostAsJsonAsync("/Startup/Configuration", config, _jsonOptions).ConfigureAwait(false); Assert.Equal(HttpStatusCode.NoContent, postResponse.StatusCode); using var getResponse = await client.GetAsync("/Startup/Configuration").ConfigureAwait(false); Assert.Equal(HttpStatusCode.OK, getResponse.StatusCode); Assert.Equal(MediaTypeNames.Application.Json, getResponse.Content.Headers.ContentType?.MediaType); using var responseStream = await getResponse.Content.ReadAsStreamAsync().ConfigureAwait(false); var newConfig = await JsonSerializer.DeserializeAsync(responseStream, _jsonOptions).ConfigureAwait(false); Assert.Equal(config.UICulture, newConfig!.UICulture); Assert.Equal(config.MetadataCountryCode, newConfig.MetadataCountryCode); Assert.Equal(config.PreferredMetadataLanguage, newConfig.PreferredMetadataLanguage); } [Fact] [Priority(-2)] public async Task User_DefaultUser_NameWithoutPassword() { var client = _factory.CreateClient(); using var response = await client.GetAsync("/Startup/User").ConfigureAwait(false); Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(MediaTypeNames.Application.Json, response.Content.Headers.ContentType?.MediaType); using var contentStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false); var user = await JsonSerializer.DeserializeAsync(contentStream, _jsonOptions).ConfigureAwait(false); Assert.NotEmpty(user!.Name); Assert.Null(user.Password); } [Fact] [Priority(-1)] public async Task User_EditUser_Success() { var client = _factory.CreateClient(); var user = new StartupUserDto() { Name = "NewName", Password = "NewPassword" }; var postResponse = await client.PostAsJsonAsync("/Startup/User", user, _jsonOptions).ConfigureAwait(false); Assert.Equal(HttpStatusCode.NoContent, postResponse.StatusCode); var getResponse = await client.GetAsync("/Startup/User").ConfigureAwait(false); Assert.Equal(HttpStatusCode.OK, getResponse.StatusCode); Assert.Equal(MediaTypeNames.Application.Json, getResponse.Content.Headers.ContentType?.MediaType); var contentStream = await getResponse.Content.ReadAsStreamAsync().ConfigureAwait(false); var newUser = await JsonSerializer.DeserializeAsync(contentStream, _jsonOptions).ConfigureAwait(false); Assert.Equal(user.Name, newUser!.Name); Assert.NotEmpty(newUser.Password); Assert.NotEqual(user.Password, newUser.Password); } [Fact] [Priority(0)] public async Task CompleteWizard_Success() { var client = _factory.CreateClient(); var response = await client.PostAsync("/Startup/Complete", new ByteArrayContent(Array.Empty())).ConfigureAwait(false); Assert.Equal(HttpStatusCode.NoContent, response.StatusCode); } [Fact] [Priority(1)] public async Task GetFirstUser_CompleteWizard_Unauthorized() { var client = _factory.CreateClient(); using var response = await client.GetAsync("/Startup/User").ConfigureAwait(false); Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); } } }