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();
}
}
}
}
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();
}
}
}
}