fix: functions migrations

This commit is contained in:
2019-08-02 20:39:30 +02:00
parent 56a141a34c
commit 88d581c529
7 changed files with 54 additions and 8 deletions

View File

@@ -37,7 +37,7 @@ data class Function(
connection.sendQuery(up.script) connection.sendQuery(up.script)
this::class.java.classLoader.getResource("sql/migration/insertFunction.sql")!!.readText().let { this::class.java.classLoader.getResource("sql/migration/insertFunction.sql")!!.readText().let {
connection.selectOne<MigrationEntity>(it, listOf(up))?.let { function -> connection.selectOne<MigrationEntity>(it, listOf(up.name, up.getDefinition(), up.script, down.script))?.let { function ->
executedAt = function.executedAt executedAt = function.executedAt
doExecute = Action.OK doExecute = Action.OK
} }

View File

@@ -37,10 +37,12 @@ data class Migrations private constructor(
private val queries: MutableMap<String, Query> = mutableMapOf(), private val queries: MutableMap<String, Query> = mutableMapOf(),
private val functions: MutableMap<String, Function> = mutableMapOf() private val functions: MutableMap<String, Function> = mutableMapOf()
) { ) {
constructor(directory: File, connection: Connection): this(connection) { constructor(directory: File, connection: Connection): this(listOf(directory), connection)
constructor(directories: List<File>, connection: Connection): this(connection) {
initDB() initDB()
getMigrationFromDB() getMigrationFromDB()
getMigrationFromDirectory(directory) getMigrationFromDirectory(directories)
queries.forEach { (_, query) -> queries.forEach { (_, query) ->
if (query.doExecute === null) { if (query.doExecute === null) {
query.doExecute = Action.DOWN query.doExecute = Action.DOWN
@@ -75,6 +77,15 @@ data class Migrations private constructor(
} }
} }
/**
* Get all migration from multiples Directories
*/
private fun getMigrationFromDirectory(directory: List<File>) {
directory.forEach {
getMigrationFromDirectory(it)
}
}
/** /**
* Get all migration from Directory * Get all migration from Directory
*/ */

View File

@@ -9,5 +9,3 @@ CREATE TABLE IF NOT EXISTS migration.functions
down text NOT NULL, down text NOT NULL,
version int NOT NULL version int NOT NULL
); );
CREATE SEQUENCE IF NOT EXISTS migration.version_seq;

View File

@@ -1 +0,0 @@
SELECT nextval('migration.version_seq');

View File

@@ -1,3 +1,7 @@
INSERT INTO migration.functions as f (filename, definition, executed_at, up, down, version) INSERT INTO migration.functions as f (filename, definition, executed_at, up, down, version)
VALUES (?, ?, now(), ?, ?, ?) VALUES (?, ?, now(), ?, ?, (
select coalesce(max(version), 0)+1
from migration.functions f2
where filename = f2.filename
))
RETURNING to_json(f); RETURNING to_json(f);

View File

@@ -1,3 +1,7 @@
INSERT INTO migration.history as h (filename, executed_at, up, down, version) INSERT INTO migration.history as h (filename, executed_at, up, down, version)
VALUES (?, now(), ?, ?, nextval('migration.version_seq')) VALUES (?, now(), ?, ?, (
select coalesce(max(version), 0)+1
from migration.history f2
where filename = f2.filename
))
RETURNING to_json(h); RETURNING to_json(h);

View File

@@ -1,11 +1,13 @@
package fr.postgresjson package fr.postgresjson
import fr.postgresjson.connexion.Requester
import fr.postgresjson.migration.Migration import fr.postgresjson.migration.Migration
import fr.postgresjson.migration.Migrations import fr.postgresjson.migration.Migrations
import org.amshove.kluent.`should be equal to` import org.amshove.kluent.`should be equal to`
import org.amshove.kluent.`should contain` import org.amshove.kluent.`should contain`
import org.amshove.kluent.invoking import org.amshove.kluent.invoking
import org.amshove.kluent.shouldThrow import org.amshove.kluent.shouldThrow
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance import org.junit.jupiter.api.TestInstance
import java.io.File import java.io.File
@@ -32,6 +34,18 @@ class MigrationTest(): TestAbstract() {
} shouldThrow Migrations.DownMigrationNotDefined::class } shouldThrow Migrations.DownMigrationNotDefined::class
} }
@Test
fun `run forced down query`() {
val resources = File(this::class.java.getResource("/sql/migrations").toURI())
val m = Migrations(resources, getConnextion())
repeat(3) {
m.down(true).apply {
this `should contain` Pair("1", Migration.Status.OK)
size `should be equal to` 1
}
}
}
@Test @Test
fun `run dry migrations`() { fun `run dry migrations`() {
val resources = File(this::class.java.getResource("/sql/real_migrations").toURI()) val resources = File(this::class.java.getResource("/sql/real_migrations").toURI())
@@ -76,4 +90,20 @@ class MigrationTest(): TestAbstract() {
} }
} }
} }
@Test
fun `run functions migrations`() {
val resources = File(this::class.java.getResource("/sql/function").toURI())
Migrations(resources, getConnextion()).apply {
run().size `should be equal to` 4
}
val objTest: RequesterTest.ObjTest? = Requester(getConnextion())
.addFunction(resources)
.getFunction("test_function")
.selectOne(listOf("test", "plip"))
Assertions.assertEquals(objTest!!.id, 3)
Assertions.assertEquals(objTest.name, "test")
}
} }