fix #23 by adding validating on first startup and close #30 by adding
tests / package-smoke-linux (push) Skipped
tests / package-smoke-windows (push) Skipped
tests / package-smoke-macos (push) Skipped
tests / macos (push) Successful in 1m20s
tests / linux (push) Successful in 2m14s
tests / windows (push) Failing after 23m21s
tests / package-smoke-linux (push) Skipped
tests / package-smoke-windows (push) Skipped
tests / package-smoke-macos (push) Skipped
tests / macos (push) Successful in 1m20s
tests / linux (push) Successful in 2m14s
tests / windows (push) Failing after 23m21s
version number Signed-off-by: galeon <dertiellis@gmail.com>
This commit is contained in:
1 parent
bc205fa2e7
commit
1d781b5324
19 files changed
+805
-10
No files matched your search
@@ -76,6 +76,24 @@ class TestLauncherBackend : public QObject
|
||||
return Fixtures::installFakeJava(m_game + "/../" + name, "17.0.8", config);
|
||||
}
|
||||
|
||||
// Папка игры, в которой до лаунчера играли с Fabric. Возвращает её состав.
|
||||
static QStringList populateGameDir(const QString &dir)
|
||||
{
|
||||
QDir(dir).removeRecursively();
|
||||
const QString fabric = QStringLiteral("fabric-loader-0.15.0-1.20.1");
|
||||
Fixtures::write(dir + "/versions/1.20.1/1.20.1.json", R"({"id": "1.20.1", "type": "release"})");
|
||||
Fixtures::write(dir + "/versions/" + fabric + "/" + fabric + ".json",
|
||||
Fixtures::read("versions/" + fabric + ".json"));
|
||||
Fixtures::writeJson(dir + "/launcher_profiles.json",
|
||||
{{"profiles", QJsonObject{{"fabric", QJsonObject{
|
||||
{"type", "custom"}, {"lastVersionId", fabric},
|
||||
{"lastUsed", "2026-03-01T10:00:00.000Z"}}}}}});
|
||||
Fixtures::write(dir + "/mods/sodium.jar", "jar");
|
||||
Fixtures::write(dir + "/saves/World/level.dat", "world");
|
||||
Fixtures::write(dir + "/options.txt", "fov:90");
|
||||
return Fixtures::listTree(dir);
|
||||
}
|
||||
|
||||
private slots:
|
||||
void initTestCase()
|
||||
{
|
||||
@@ -116,6 +134,89 @@ private slots:
|
||||
Localization::instance().setLanguage(QStringLiteral("en"));
|
||||
}
|
||||
|
||||
void firstRunImportsGameDir()
|
||||
{
|
||||
// Настоящий первый запуск: ни одного файла лаунчера, папка игры по умолчанию.
|
||||
QFile::remove(LauncherPaths::settingsFile());
|
||||
const QString game = LauncherPaths::defaultMinecraftDir();
|
||||
const QStringList before = populateGameDir(game);
|
||||
const QByteArray profilesBefore = Fixtures::readFile(game + "/launcher_profiles.json");
|
||||
|
||||
{
|
||||
auto backend = make();
|
||||
QSignalSpy imported(backend.get(), &LauncherBackend::gameDirImported);
|
||||
QSignalSpy errors(backend.get(), &LauncherBackend::launchError);
|
||||
QVERIFY(imported.wait(2000)); // сообщение откладывается до подключения интерфейса
|
||||
QCOMPARE(imported.constFirst().constFirst().toString(), QStringLiteral("Fabric Loader 1.20.1"));
|
||||
QCOMPARE(backend->customBuildNames(), QStringList{"Fabric Loader 1.20.1"});
|
||||
QCOMPARE(backend->activeBuildIndex(), 0);
|
||||
const QVariantMap build = backend->customBuildAt(0);
|
||||
QCOMPARE(build.value("minecraftVersion").toString(), QStringLiteral("1.20.1"));
|
||||
QCOMPARE(build.value("loader").toString(), QStringLiteral("fabric"));
|
||||
QCOMPARE(build.value("loaderVersion").toString(), QStringLiteral("0.15.0"));
|
||||
QCOMPARE(build.value("launchVersionId").toString(), QStringLiteral("fabric-loader-0.15.0-1.20.1"));
|
||||
const int id = QJsonDocument::fromJson(Fixtures::readFile(LauncherPaths::customBuildsFile()))
|
||||
.array().at(0).toObject().value("id").toInt();
|
||||
QCOMPARE(id, 1);
|
||||
QCOMPARE(backend->settings().value("activeBuildId").toInt(), id);
|
||||
QCOMPARE(Fixtures::readJsonFile(LauncherPaths::settingsFile()).value("activeBuildId").toInt(), id);
|
||||
// Ничего не качается, ничего не переключается, папка игры та же.
|
||||
QVERIFY(!backend->downloading());
|
||||
QVERIFY(!backend->switching());
|
||||
QVERIFY2(errors.isEmpty(), qPrintable(strings(errors).join('\n')));
|
||||
}
|
||||
QCOMPARE(Fixtures::listTree(game), before);
|
||||
QCOMPARE(Fixtures::readFile(game + "/launcher_profiles.json"), profilesBefore);
|
||||
QVERIFY(!QFile::exists(LauncherPaths::buildStorageDir() + "/index.json"));
|
||||
|
||||
// Второй запуск — уже не первый: новой сборки нет.
|
||||
{
|
||||
auto backend = make();
|
||||
QSignalSpy imported(backend.get(), &LauncherBackend::gameDirImported);
|
||||
QTest::qWait(50);
|
||||
QVERIFY(imported.isEmpty());
|
||||
QCOMPARE(backend->customBuildNames(), QStringList{"Fabric Loader 1.20.1"});
|
||||
}
|
||||
QDir(game).removeRecursively();
|
||||
}
|
||||
|
||||
void importOnlyOnFirstRun()
|
||||
{
|
||||
// Настройки уже есть (init() их пишет), а списка сборок нет — это не первый запуск.
|
||||
populateGameDir(m_game);
|
||||
{
|
||||
auto backend = make();
|
||||
QSignalSpy imported(backend.get(), &LauncherBackend::gameDirImported);
|
||||
QTest::qWait(50);
|
||||
QVERIFY(imported.isEmpty());
|
||||
QVERIFY(backend->customBuildNames().isEmpty());
|
||||
}
|
||||
|
||||
// Пустой список сборок — пользователь сам всё удалил; воскрешать не надо.
|
||||
TestEnv::resetLauncherRoot();
|
||||
QVERIFY(LauncherPaths::ensureRootExists());
|
||||
const QString game = LauncherPaths::defaultMinecraftDir();
|
||||
populateGameDir(game);
|
||||
Fixtures::write(LauncherPaths::customBuildsFile(), "[]");
|
||||
{
|
||||
auto backend = make();
|
||||
QTest::qWait(50);
|
||||
QVERIFY(backend->customBuildNames().isEmpty());
|
||||
}
|
||||
QDir(game).removeRecursively();
|
||||
}
|
||||
|
||||
void firstRunWithEmptyGameDirCreatesNothing()
|
||||
{
|
||||
QFile::remove(LauncherPaths::settingsFile());
|
||||
QDir(LauncherPaths::defaultMinecraftDir()).removeRecursively();
|
||||
auto backend = make();
|
||||
QSignalSpy imported(backend.get(), &LauncherBackend::gameDirImported);
|
||||
QTest::qWait(50);
|
||||
QVERIFY(imported.isEmpty());
|
||||
QCOMPARE(backend->activeBuildIndex(), -1);
|
||||
}
|
||||
|
||||
void profilesCrudAndPersistence()
|
||||
{
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user