// // Copyright (c) PlaceholderCompany. All rights reserved. // namespace Emby.Server.Implementations.Tests.AppBase; using System; using System.IO; using System.Text.Json; using Emby.Server.Implementations.AppBase; using Jellyfin.Database.Implementations.DbConfiguration; using Jellyfin.Extensions.Json; using Xunit; /// /// Tests for the ConfigurationHelper JSON loading functionality. /// public class ConfigurationHelperTests { [Fact] public void GetJsonConfiguration_ValidJsonFile_DeserializesCorrectly() { // Arrange var tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); var jsonPath = Path.Combine(tempDir, "test-config.json"); var testConfig = new DatabaseConfigurationOptions { DatabaseType = "Jellyfin-PostgreSQL", LockingBehavior = DatabaseLockingBehaviorTypes.NoLock }; Directory.CreateDirectory(tempDir); var json = JsonSerializer.Serialize(testConfig, JsonDefaults.Options); File.WriteAllText(jsonPath, json); try { // Act var result = ConfigurationHelper.GetJsonConfiguration(jsonPath); // Assert Assert.NotNull(result); Assert.Equal("Jellyfin-PostgreSQL", result.DatabaseType); Assert.Equal(DatabaseLockingBehaviorTypes.NoLock, result.LockingBehavior); } finally { // Cleanup if (Directory.Exists(tempDir)) { Directory.Delete(tempDir, recursive: true); } } } [Fact] public void GetJsonConfiguration_MissingFile_CreatesDefaultAndReturnsIt() { // Arrange var tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); var jsonPath = Path.Combine(tempDir, "test-config.json"); try { // Act var result = ConfigurationHelper.GetJsonConfiguration(jsonPath); // Assert Assert.NotNull(result); Assert.True(File.Exists(jsonPath), "JSON file should be created"); // Verify the file is valid JSON var fileContent = File.ReadAllText(jsonPath); var deserialized = JsonSerializer.Deserialize(fileContent, JsonDefaults.Options); Assert.NotNull(deserialized); } finally { // Cleanup if (Directory.Exists(tempDir)) { Directory.Delete(tempDir, recursive: true); } } } [Fact] public void GetJsonConfiguration_WithCustomProviderOptions_PreservesSettings() { // Arrange var tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); var jsonPath = Path.Combine(tempDir, "test-config.json"); var testConfig = new DatabaseConfigurationOptions { DatabaseType = "Jellyfin-PostgreSQL", LockingBehavior = DatabaseLockingBehaviorTypes.Pessimistic, CustomProviderOptions = new CustomDatabaseOptions { PluginName = "Jellyfin-PostgreSQL", PluginAssembly = "Jellyfin.Database.Providers.Postgres", ConnectionString = "Host=localhost;Port=5432;Database=jellyfin;Username=jellyfin;Password=secret" } }; Directory.CreateDirectory(tempDir); var json = JsonSerializer.Serialize(testConfig, JsonDefaults.Options); File.WriteAllText(jsonPath, json); try { // Act var result = ConfigurationHelper.GetJsonConfiguration(jsonPath); // Assert Assert.NotNull(result); Assert.Equal("Jellyfin-PostgreSQL", result.DatabaseType); Assert.Equal(DatabaseLockingBehaviorTypes.Pessimistic, result.LockingBehavior); Assert.NotNull(result.CustomProviderOptions); Assert.Equal("Jellyfin-PostgreSQL", result.CustomProviderOptions.PluginName); Assert.Equal("Host=localhost;Port=5432;Database=jellyfin;Username=jellyfin;Password=secret", result.CustomProviderOptions.ConnectionString); } finally { // Cleanup if (Directory.Exists(tempDir)) { Directory.Delete(tempDir, recursive: true); } } } [Fact] public void GetJsonConfiguration_InvalidJson_CreatesDefault() { // Arrange var tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); var jsonPath = Path.Combine(tempDir, "test-config.json"); Directory.CreateDirectory(tempDir); File.WriteAllText(jsonPath, "{ invalid json"); try { // Act var result = ConfigurationHelper.GetJsonConfiguration(jsonPath); // Assert - should get default instance on invalid JSON Assert.NotNull(result); } finally { // Cleanup if (Directory.Exists(tempDir)) { Directory.Delete(tempDir, recursive: true); } } } [Fact] public void GetJsonConfiguration_RoundTrip_PreservesData() { // Arrange var tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); var jsonPath = Path.Combine(tempDir, "test-config.json"); var originalConfig = new DatabaseConfigurationOptions { DatabaseType = "Jellyfin-PostgreSQL", LockingBehavior = DatabaseLockingBehaviorTypes.Optimistic }; Directory.CreateDirectory(tempDir); try { // Act - First load should create the file var result1 = ConfigurationHelper.GetJsonConfiguration(jsonPath); // Modify and verify round-trip var json = JsonSerializer.Serialize(originalConfig, JsonDefaults.Options); File.WriteAllText(jsonPath, json); var result2 = ConfigurationHelper.GetJsonConfiguration(jsonPath); // Assert Assert.NotNull(result2); Assert.Equal("Jellyfin-PostgreSQL", result2.DatabaseType); Assert.Equal(DatabaseLockingBehaviorTypes.Optimistic, result2.LockingBehavior); } finally { // Cleanup if (Directory.Exists(tempDir)) { Directory.Delete(tempDir, recursive: true); } } } }