diff --git a/tests/Tgstation.Server.Host.Tests/Components/StaticFiles/TestConfiguration.cs b/tests/Tgstation.Server.Host.Tests/Components/StaticFiles/TestConfiguration.cs
new file mode 100644
index 0000000000..cec38f9875
--- /dev/null
+++ b/tests/Tgstation.Server.Host.Tests/Components/StaticFiles/TestConfiguration.cs
@@ -0,0 +1,95 @@
+using System;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+
+using Microsoft.Extensions.Logging;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+using Moq;
+
+using Tgstation.Server.Host.Configuration;
+using Tgstation.Server.Host.IO;
+using Tgstation.Server.Host.System;
+using Tgstation.Server.Host.Transfer;
+
+namespace Tgstation.Server.Host.Components.StaticFiles.Tests
+{
+ [TestClass]
+ public sealed class TestConfiguration
+ {
+ ///
+ /// Regression test for https://github.com/tgstation/tgstation-server/issues/1617.
+ ///
+ [TestMethod]
+ public async Task TestListOrdering()
+ {
+ using var loggerFactory = LoggerFactory.Create(builder =>
+ {
+ builder.AddConsole();
+ builder.SetMinimumLevel(LogLevel.Trace);
+ });
+
+ var tempPath = Path.GetTempFileName();
+ File.Delete(tempPath);
+ var ioManager = new ResolvingIOManager(new DefaultIOManager(), tempPath);
+ await ioManager.CreateDirectory(".", CancellationToken.None);
+ try
+ {
+ await ioManager.WriteAllBytes("a.txt", Array.Empty(), CancellationToken.None);
+ await ioManager.WriteAllBytes("c.txt", Array.Empty(), CancellationToken.None);
+ await ioManager.WriteAllBytes("d.txt", Array.Empty(), CancellationToken.None);
+ await ioManager.CreateDirectory("a", CancellationToken.None);
+ await ioManager.CreateDirectory("c", CancellationToken.None);
+ await ioManager.CreateDirectory("d", CancellationToken.None);
+
+ var configuration = new Configuration(
+ ioManager,
+ new SynchronousIOManager(),
+ Mock.Of(),
+ Mock.Of(),
+ Mock.Of(),
+ Mock.Of(),
+ Mock.Of(),
+ loggerFactory.CreateLogger(),
+ new GeneralConfiguration(),
+ new SessionConfiguration());
+
+ await configuration.StartAsync(CancellationToken.None);
+
+ var listResponse = await configuration.ListDirectory(".", null, CancellationToken.None);
+ Assert.AreEqual(9, listResponse.Count);
+ Assert.AreEqual("a", listResponse[0].Path[2..]);
+ Assert.AreEqual("c", listResponse[1].Path[2..]);
+ Assert.AreEqual("CodeModifications", listResponse[2].Path[2..]);
+ Assert.AreEqual("d", listResponse[3].Path[2..]);
+ Assert.AreEqual("EventScripts", listResponse[4].Path[2..]);
+ Assert.AreEqual("GameStaticFiles", listResponse[5].Path[2..]);
+ Assert.AreEqual("a.txt", listResponse[6].Path[2..]);
+ Assert.AreEqual("c.txt", listResponse[7].Path[2..]);
+ Assert.AreEqual("d.txt", listResponse[8].Path[2..]);
+
+ await ioManager.CreateDirectory("GameStaticFiles/config/title_screens", CancellationToken.None);
+ await ioManager.CreateDirectory("GameStaticFiles/config/title_music", CancellationToken.None);
+ await ioManager.WriteAllBytes("GameStaticFiles/config/word_filter.toml", Array.Empty(), CancellationToken.None);
+ await ioManager.WriteAllBytes("GameStaticFiles/config/whitelist.txt", Array.Empty(), CancellationToken.None);
+ await ioManager.WriteAllBytes("GameStaticFiles/config/unbuyableshuttles.txt", Array.Empty(), CancellationToken.None);
+ await ioManager.WriteAllBytes("GameStaticFiles/config/spaceruinblacklist.txt", Array.Empty(), CancellationToken.None);
+
+ listResponse = await configuration.ListDirectory("GameStaticFiles/config", null, CancellationToken.None);
+ var substringStart = "GameStaticFiles/config".Length + 1;
+ Assert.AreEqual(6, listResponse.Count);
+ Assert.AreEqual("title_music", listResponse[0].Path[substringStart..]);
+ Assert.AreEqual("title_screens", listResponse[1].Path[substringStart..]);
+ Assert.AreEqual("spaceruinblacklist.txt", listResponse[2].Path[substringStart..]);
+ Assert.AreEqual("unbuyableshuttles.txt", listResponse[3].Path[substringStart..]);
+ Assert.AreEqual("whitelist.txt", listResponse[4].Path[substringStart..]);
+ Assert.AreEqual("word_filter.toml", listResponse[5].Path[substringStart..]);
+ }
+ finally
+ {
+ await ioManager.DeleteDirectory(tempPath, CancellationToken.None);
+ }
+ }
+ }
+}