erste Version Online-Nennen

This commit is contained in:
stefan
2025-06-05 12:57:07 +02:00
parent 8fcc279679
commit ef59fa35b1
27 changed files with 3081 additions and 207 deletions
@@ -14,11 +14,9 @@ class ApplicationTest {
fun testRootRouteShowsTournamentList() {
// Erstelle ein Beispiel-Turnier, das in der Datenbank sein würde
val mockTurnier = Turnier(
id = "dummy-01",
name = "Erstes DB Turnier",
datum = "19.04.2025",
logoUrl = null,
ausschreibungUrl = "/pdfs/ausschreibung_dummy.pdf"
number = 1
)
// Erstelle eine Liste von Turnieren, wie sie aus der Datenbank kommen würde
@@ -45,13 +43,7 @@ class ApplicationTest {
strong { +turnier.name }
+" (${turnier.datum})"
+" "
if (turnier.ausschreibungUrl != null) {
a(href = turnier.ausschreibungUrl, target = "_blank") {
button { +"Ausschreibung" }
}
+" "
}
a(href = "/nennung/${turnier.id}") {
a(href = "/nennung/${turnier.number}") {
button { +"Online Nennen" }
}
}
@@ -82,7 +74,7 @@ class ApplicationTest {
htmlContent.contains("(19.04.2025)"),
"Dummy tournament date missing or incorrect"
)
assertTrue(htmlContent.contains("/nennung/dummy-01"), "Link to dummy tournament '/nennung/dummy-01' missing")
assertTrue(htmlContent.contains("/nennung/1"), "Link to dummy tournament '/nennung/1' missing")
assertFalse(
htmlContent.contains("Keine Turniere in der Datenbank gefunden."),
"'No tournaments' message should not be present if dummy was inserted"
@@ -1,16 +1,23 @@
package at.mocode
import at.mocode.model.Bewerb
import at.mocode.model.Turnier
import at.mocode.tables.BewerbeTable
import at.mocode.tables.TurniereTable
import `import org`.jetbrains.exposed.sql.selectAll
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.html.*
import io.ktor.server.routing.*
import kotlinx.html.*
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.Op
import org.jetbrains.exposed.sql.SchemaUtils
import org.jetbrains.exposed.sql.SqlExpressionBuilder
import org.jetbrains.exposed.sql.insert
import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.select
import org.jetbrains.exposed.sql.selectAll
import org.jetbrains.exposed.sql.transactions.transaction
import org.slf4j.LoggerFactory
@@ -19,24 +26,40 @@ import org.slf4j.LoggerFactory
*/
fun configureTestDatabase() {
val log = LoggerFactory.getLogger("TestDatabaseInitialization")
log.info("Initializing in-memory H2 database for testing...")
log.info("Initializing in-memory SQLite database for testing...")
// Verbinde mit einer In-Memory-H2-Datenbank
Database.connect("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", driver = "org.h2.Driver")
// Verbinde mit einer In-Memory-SQLite-Datenbank
Database.connect("jdbc:sqlite::memory:", driver = "org.sqlite.JDBC")
// Initialisiere das Datenbankschema
transaction {
log.info("Creating test database schema...")
SchemaUtils.create(TurniereTable)
SchemaUtils.create(TurniereTable, BewerbeTable)
// Füge ein Test-Turnier hinzu
log.info("Inserting test tournament data...")
val turnierNumber = 1
TurniereTable.insert {
it[id] = "dummy-01"
it[name] = "Erstes DB Turnier"
it[datum] = "19.04.2025"
it[logoUrl] = null
it[ausschreibungUrl] = "/pdfs/ausschreibung_dummy.pdf"
it[TurniereTable.number] = turnierNumber
it[TurniereTable.name] = "CSN-C Edelhof April 2025"
it[TurniereTable.datum] = "14.04.2025 - 15.04.2025"
}
// Füge Test-Bewerbe hinzu
BewerbeTable.insert {
it[BewerbeTable.nummer] = 1
it[BewerbeTable.titel] = "Stilspringprüfung"
it[BewerbeTable.klasse] = "60 cm"
it[BewerbeTable.task] = null
it[BewerbeTable.turnierNumber] = turnierNumber
}
BewerbeTable.insert {
it[BewerbeTable.nummer] = 2
it[BewerbeTable.titel] = "Dressurprüfung"
it[BewerbeTable.klasse] = "Kl. A"
it[BewerbeTable.task] = "DRA 1"
it[BewerbeTable.turnierNumber] = turnierNumber
}
log.info("Test database initialized successfully!")
@@ -57,15 +80,30 @@ fun Application.testModule() {
// Lese Daten aus der Test-Datenbank
val turniereFromDb = transaction {
TurniereTable.selectAll().map { row ->
// Get all tournaments
val turniere = TurniereTable.selectAll().map { row ->
Turnier(
id = row[TurniereTable.id],
name = row[TurniereTable.name],
datum = row[TurniereTable.datum],
logoUrl = row[TurniereTable.logoUrl],
ausschreibungUrl = row[TurniereTable.ausschreibungUrl]
number = row[TurniereTable.number]
)
}
// For each tournament, get its competitions
turniere.forEach { turnier ->
val bewerbeList = BewerbeTable.selectAll().where { BewerbeTable.turnierNumber eq turnier.number }
.map { row ->
Bewerb(
nummer = row[BewerbeTable.nummer],
titel = row[BewerbeTable.titel],
klasse = row[BewerbeTable.klasse],
task = row[BewerbeTable.task]
)
}
turnier.bewerbe = bewerbeList
}
turniere
}
// HTML-Antwort generieren (wie in Application.kt)
@@ -88,13 +126,25 @@ fun Application.testModule() {
strong { +turnier.name }
+" (${turnier.datum})"
+" "
if (turnier.ausschreibungUrl != null) {
a(href = turnier.ausschreibungUrl, target = "_blank") {
button { +"Ausschreibung" }
div {
+"Bewerbe: "
if (turnier.bewerbe.isEmpty()) {
+"Keine"
} else {
ul {
turnier.bewerbe.forEach { bewerb ->
li {
+"${bewerb.nummer}. ${bewerb.titel} - ${bewerb.klasse}"
if (bewerb.task != null) {
+" (${bewerb.task})"
}
}
}
}
}
+" "
}
a(href = "/nennung/${turnier.id}") {
+" "
a(href = "/nennung/${turnier.number}") {
button { +"Online Nennen" }
}
}
@@ -0,0 +1,54 @@
package at.mocode.email
import at.mocode.config.EmailConfig
import org.slf4j.LoggerFactory
import kotlin.test.Test
import kotlin.test.assertTrue
/**
* Tests for the EmailService class.
* This test verifies that the email configuration is valid and that test emails can be sent.
*/
class EmailServiceTest {
private val log = LoggerFactory.getLogger(EmailServiceTest::class.java)
@Test
fun testEmailConfigurationIsValid() {
// Check if the email configuration is valid
val isValid = EmailConfig.isValid()
if (!isValid) {
log.warn("Email configuration is not valid: ${EmailConfig.getValidationErrors()}")
log.warn("Make sure the .env file contains the correct email configuration")
log.warn("SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD, RECIPIENT_EMAIL, and SMTP_SENDER_EMAIL must be set")
}
// We don't assert here because the test environment might not have valid email configuration
log.info("Email configuration valid: $isValid")
}
@Test
fun testSendTestEmail() {
// Only run this test if the email configuration is valid
if (!EmailConfig.isValid()) {
log.warn("Skipping test because email configuration is not valid")
return
}
// Get the EmailService instance
val emailService = EmailService.getInstance()
// Send a test email with debug enabled
val result = emailService.sendTestEmail(debug = true)
// Log the result
if (result) {
log.info("Test email sent successfully")
} else {
log.error("Failed to send test email")
}
// Assert that the email was sent successfully
assertTrue(result, "Test email should be sent successfully")
}
}