XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEServerManager

【Java】我的世界XFE服务器管理器

公开
关注 0 Fork 0 Star 0
UTF-8
package com.xfestudio.xfeservermanager.infra.persistence;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import java.nio.file.Path;
import java.time.Clock;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;

class SqliteDatabaseTest {
    @TempDir
    Path temporaryDirectory;

    @Test
    void appliesMigrationsIdempotentlyAndCheckpoints() throws Exception {
        var database = new SqliteDatabase(temporaryDirectory.resolve("control.db"), Clock.systemUTC());

        database.migrate();
        database.migrate();
        database.checkpoint();

        try (var connection = database.openConnection();
                var query = connection.createStatement().executeQuery(
                        "SELECT COUNT(*) FROM schema_migrations")) {
            assertThat(query.next()).isTrue();
            assertThat(query.getInt(1)).isEqualTo(13);
        }
    }

    @Test
    void statementSplitterKeepsSemicolonInsideString() {
        assertThat(SqliteDatabase.splitStatements(
                "INSERT INTO x VALUES('a;b', '', 'it''s safe'); SELECT 1;"))
                .containsExactly("INSERT INTO x VALUES('a;b', '', 'it''s safe')", "SELECT 1");
    }

    @Test
    void reportsAnIncompleteCheckpointInsteadOfBackingUpOnlyTheMainFile() throws Exception {
        var database = new SqliteDatabase(temporaryDirectory.resolve("busy.db"), Clock.systemUTC());
        database.migrate();

        try (var reader = database.openConnection()) {
            reader.setAutoCommit(false);
            try (var snapshot = reader.createStatement().executeQuery(
                    "SELECT version FROM schema_migrations ORDER BY version")) {
                assertThat(snapshot.next()).isTrue();
                try (var writer = database.openConnection(); var statement = writer.createStatement()) {
                    statement.executeUpdate(
                            "INSERT INTO schema_migrations(version, description, applied_at) "
                                    + "VALUES(999, 'checkpoint probe', 0)");
                }

                assertThatThrownBy(database::checkpoint)
                        .isInstanceOf(PersistenceException.class)
                        .hasMessageContaining("checkpoint");
            } finally {
                reader.rollback();
            }
        }
    }
}