v1 finished. Gonna build a dockerfile later
This commit is contained in:
48
db_management/db_management.go
Normal file
48
db_management/db_management.go
Normal file
@@ -0,0 +1,48 @@
|
||||
package db_management
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"time"
|
||||
|
||||
_ "modernc.org/sqlite"
|
||||
)
|
||||
|
||||
var DB *sql.DB
|
||||
|
||||
func InitDB() {
|
||||
var err error
|
||||
// Öffnet bot.db im aktuellen Verzeichnis
|
||||
DB, err = sql.Open("sqlite", "./bot.db")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// Tabelle für einzelne Sessions
|
||||
statement := `
|
||||
CREATE TABLE IF NOT EXISTS voice_sessions (
|
||||
user_id TEXT,
|
||||
seconds INTEGER,
|
||||
created_at TIMESTAMP
|
||||
);`
|
||||
_, err = DB.Exec(statement)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func SaveSession(userID string, seconds int) {
|
||||
query := `INSERT INTO voice_sessions (user_id, seconds, created_at) VALUES (?, ?, ?)`
|
||||
DB.Exec(query, userID, seconds, time.Now())
|
||||
}
|
||||
|
||||
func GetUserStats(userID string) int {
|
||||
var total sql.NullInt64 // NullInt64 fängt NULL-Ergebnisse ab
|
||||
query := `SELECT SUM(seconds) FROM voice_sessions
|
||||
WHERE user_id = ? AND created_at > date('now', '-30 days')`
|
||||
|
||||
err := DB.QueryRow(query, userID).Scan(&total)
|
||||
if err != nil || !total.Valid {
|
||||
return 0
|
||||
}
|
||||
return int(total.Int64)
|
||||
}
|
||||
62
db_management/db_management_test.go
Normal file
62
db_management/db_management_test.go
Normal file
@@ -0,0 +1,62 @@
|
||||
package db_management
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
_ "modernc.org/sqlite"
|
||||
)
|
||||
|
||||
func setupTestDB(t *testing.T) {
|
||||
var err error
|
||||
// ":memory:" sorgt dafür, dass die DB nach dem Test gelöscht wird
|
||||
DB, err = sql.Open("sqlite", ":memory:")
|
||||
assert.NoError(t, err)
|
||||
|
||||
statement := `
|
||||
CREATE TABLE voice_sessions (
|
||||
user_id TEXT,
|
||||
seconds INTEGER,
|
||||
created_at TIMESTAMP
|
||||
);`
|
||||
_, err = DB.Exec(statement)
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
func TestSaveAndGetStats(t *testing.T) {
|
||||
setupTestDB(t)
|
||||
defer DB.Close()
|
||||
|
||||
userID := "123456789"
|
||||
|
||||
// Test 1: Neue Session speichern
|
||||
SaveSession(userID, 3600) // 1 Stunde
|
||||
stats := GetUserStats(userID)
|
||||
assert.Equal(t, 3600, stats, "User sollte 3600 Sekunden haben")
|
||||
|
||||
// Test 2: Zweite Session addieren
|
||||
SaveSession(userID, 600) // +10 Minuten
|
||||
stats = GetUserStats(userID)
|
||||
assert.Equal(t, 4200, stats, "Summe sollte 4200 sein")
|
||||
}
|
||||
|
||||
func TestTimeFiltering(t *testing.T) {
|
||||
setupTestDB(t)
|
||||
defer DB.Close()
|
||||
|
||||
userID := "999"
|
||||
|
||||
// Eine Session von heute
|
||||
SaveSession(userID, 1000)
|
||||
|
||||
// Eine "alte" Session manuell einfügen (31 Tage alt)
|
||||
oldDate := time.Now().AddDate(0, 0, -31)
|
||||
_, _ = DB.Exec("INSERT INTO voice_sessions (user_id, seconds, created_at) VALUES (?, ?, ?)",
|
||||
userID, 5000, oldDate)
|
||||
|
||||
// GetUserStats sollte NUR die 1000 Sekunden von heute zählen
|
||||
stats := GetUserStats(userID)
|
||||
assert.Equal(t, 1000, stats, "Alte Sessions dürfen nicht gezählt werden")
|
||||
}
|
||||
Reference in New Issue
Block a user