using Flaro.Api; namespace Flaro.Api.Tests; /// Das Durchklicken durch das Dateisystem. /// /// /// Alles unter , nicht unter festen Pfaden. /// Diese Tests laufen auf dem Arbeitsrechner, wo es weder /media noch /// /volume1 gibt — ein Test, der das voraussetzt, prüft nur, auf /// welchem Rechner er gerade läuft. /// public class OrdnerbaumTests { private string _wurzel = ""; [SetUp] public void Anlegen() => _wurzel = Directory.CreateDirectory( Path.Combine(Path.GetTempPath(), "flaro-baum-" + Guid.CreateVersion7().ToString("N"))).FullName; [TearDown] public void Aufraeumen() { // Rechte zurücksetzen, sonst bleibt das gesperrte Verzeichnis liegen. if (!OperatingSystem.IsWindows() && Directory.Exists(_wurzel)) { foreach (var d in Directory.EnumerateDirectories(_wurzel, "*", SearchOption.AllDirectories)) File.SetUnixFileMode(d, UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute); } if (Directory.Exists(_wurzel)) Directory.Delete(_wurzel, recursive: true); } [Test] public void ListetUnterordnerAlphabetisch() { Directory.CreateDirectory(Path.Combine(_wurzel, "Serien")); Directory.CreateDirectory(Path.Combine(_wurzel, "filme")); Directory.CreateDirectory(Path.Combine(_wurzel, "Dokus")); var baum = Ordnerbaum.Lesen(_wurzel); Assert.That(baum, Is.Not.Null); // Ohne Rücksicht auf Gross- und Kleinschreibung — sonst stünde // „filme" hinter „Serien", was in einer Liste niemand sucht. Assert.That(baum!.Entries.Select(e => e.Name), Is.EqualTo(new[] { "Dokus", "filme", "Serien" })); Assert.That(baum.Note, Is.Null); } /// Dateien gehören nicht in eine Ordnerauswahl. [Test] public void ZeigtNurOrdnerKeineDateien() { Directory.CreateDirectory(Path.Combine(_wurzel, "Filme")); File.WriteAllText(Path.Combine(_wurzel, "Dune.mkv"), ""); var baum = Ordnerbaum.Lesen(_wurzel); Assert.That(baum!.Entries.Select(e => e.Name), Is.EqualTo(new[] { "Filme" })); } [Test] public void KenntDenUebergeordnetenOrdner() { var unten = Directory.CreateDirectory(Path.Combine(_wurzel, "Filme", "Tief")).FullName; var baum = Ordnerbaum.Lesen(unten); Assert.That(baum!.Parent, Is.EqualTo(Path.Combine(_wurzel, "Filme"))); } /// „/media/../etc" wird zu „/etc" — der angezeigte Pfad ist der, den man tippen würde. [Test] public void LoestPunktPunktAuf() { Directory.CreateDirectory(Path.Combine(_wurzel, "Filme")); var verschlungen = Path.Combine(_wurzel, "Filme", "..", "Filme"); var baum = Ordnerbaum.Lesen(verschlungen); Assert.That(baum!.Path, Is.EqualTo(Path.Combine(_wurzel, "Filme"))); } /// null heisst „diesen Pfad gibt es nicht" — nicht „leer". [Test] public void GibtNullFuerEinenPfadDenEsNichtGibt() => Assert.That(Ordnerbaum.Lesen(Path.Combine(_wurzel, "gibtesnicht")), Is.Null); /// Eine Datei ist kein Ordner, auch wenn es sie gibt. [Test] public void GibtNullFuerEineDatei() { var datei = Path.Combine(_wurzel, "Dune.mkv"); File.WriteAllText(datei, ""); Assert.That(Ordnerbaum.Lesen(datei), Is.Null); } [Test] public void SagtWennEsNichtsDarunterGibt() { var baum = Ordnerbaum.Lesen(_wurzel); Assert.That(baum!.Entries, Is.Empty); Assert.That(baum.Note, Is.EqualTo("Keine Unterordner.")); } /// Ein Ordner ohne Leserecht ist eine Auskunft, kein Serverfehler. /// /// /// Ohne diesen Fall flöge eine bis /// in die Antwort und würde zu einer 500 — während die ehrliche Antwort /// lautet: den darfst du nicht lesen. /// [Test] public void MeldetFehlendesLeserechtStattZuWerfen() { // Mit `return` statt nur `Assert.Ignore`: der Plattform-Analysator // kennt `Assert.Ignore` nicht als Abbruch und hielte den Rest sonst // unter Windows für erreichbar — CA1416. if (OperatingSystem.IsWindows()) { Assert.Ignore("Unix-Rechte gibt es dort nicht."); return; } var gesperrt = Directory.CreateDirectory(Path.Combine(_wurzel, "gesperrt")).FullName; Directory.CreateDirectory(Path.Combine(gesperrt, "darin")); File.SetUnixFileMode(gesperrt, UnixFileMode.None); var baum = Ordnerbaum.Lesen(gesperrt); Assert.That(baum, Is.Not.Null); Assert.That(baum!.Entries, Is.Empty); Assert.That(baum.Note, Is.EqualTo("Kein Leserecht für diesen Ordner.")); } /// Ohne Angabe fängt die Auswahl irgendwo Sinnvollem an — und existiert. [Test] public void FaengtBeiEinemVorhandenenOrdnerAn() { var anfang = Ordnerbaum.Anfang(); Assert.That(anfang, Is.Not.Empty); Assert.That(Directory.Exists(anfang), $"Der Anfang „{anfang}\" müsste es geben."); Assert.That(Ordnerbaum.Lesen(null), Is.Not.Null); Assert.That(Ordnerbaum.Lesen(" "), Is.Not.Null, "Leerzeichen zählen wie keine Angabe."); } }