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.

123 lines
3.9 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
.UpdateLinksForPackage(definitions, TempModelsFolder, TempPackageFolder)
.GetAwaiter()
.GetResult();
}
[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}."
);
}
}