Multi-Platform Package Manager for Stable Diffusion
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
3.5 KiB

using StabilityMatrix.Core.Extensions;
using StabilityMatrix.Core.Helper;
using StabilityMatrix.Core.Models;
namespace StabilityMatrix.Tests.Models;
[TestClass]
public class SharedFoldersTests
{
private string tempFolder = string.Empty;
private string TempModelsFolder => Path.Combine(tempFolder, "models");
private string TempPackageFolder => Path.Combine(tempFolder, "package");
private readonly Dictionary<SharedFolderType, string> sampleDefinitions = new()
{
[SharedFolderType.StableDiffusion] = "models/Stable-diffusion",
[SharedFolderType.ESRGAN] = "models/ESRGAN",
[SharedFolderType.TextualInversion] = "embeddings",
};
[TestInitialize]
public void Initialize()
{
tempFolder = Path.GetTempFileName();
File.Delete(tempFolder);
Directory.CreateDirectory(tempFolder);
}
[TestCleanup]
public void Cleanup()
{
if (string.IsNullOrEmpty(tempFolder)) return;
TempFiles.DeleteDirectory(tempFolder);
}
private void CreateSampleJunctions()
{
var definitions = new Dictionary<SharedFolderType, IReadOnlyList<string>>
{
[SharedFolderType.StableDiffusion] = new[] {"models/Stable-diffusion"},
[SharedFolderType.ESRGAN] = new[] {"models/ESRGAN"},
[SharedFolderType.TextualInversion] = new[] {"embeddings"},
};
SharedFolders.SetupLinks(definitions, TempModelsFolder, TempPackageFolder);
}
[TestMethod]
public void SetupLinks_CreatesJunctions()
{
CreateSampleJunctions();
// Check model folders
foreach (var (folderType, relativePath) in sampleDefinitions)
{
var packagePath = Path.Combine(TempPackageFolder, relativePath);
var modelFolder = Path.Combine(TempModelsFolder, folderType.GetStringValue());
// Should exist and be a junction
Assert.IsTrue(Directory.Exists(packagePath), $"Package folder {packagePath} does not exist.");
var info = new DirectoryInfo(packagePath);
Assert.IsTrue(info.Attributes.HasFlag(FileAttributes.ReparsePoint), $"Package folder {packagePath} is not a junction.");
// Check junction target should be in models folder
Assert.AreEqual(modelFolder, info.LinkTarget, $"Package folder {packagePath} does not point to {modelFolder}.");
}
}
[TestMethod]
public void SetupLinks_CanDeleteJunctions()
{
CreateSampleJunctions();
var modelFolder = Path.Combine(tempFolder, "models", SharedFolderType.StableDiffusion.GetStringValue());
var packagePath = Path.Combine(tempFolder, "package", sampleDefinitions[SharedFolderType.StableDiffusion]);
// Write a file to a model folder
File.Create(Path.Combine(modelFolder, "AFile")).Close();
Assert.IsTrue(File.Exists(Path.Combine(modelFolder, "AFile")), $"File should exist in {modelFolder}.");
// Should exist in the package folder
Assert.IsTrue(File.Exists(Path.Combine(packagePath, "AFile")), $"File should exist in {packagePath}.");
// Now delete the junction
Directory.Delete(packagePath, false);
Assert.IsFalse(Directory.Exists(packagePath), $"Package folder {packagePath} should not exist.");
// The file should still exist in the model folder
Assert.IsTrue(File.Exists(Path.Combine(modelFolder, "AFile")), $"File should exist in {modelFolder}.");
}
}