added tests for db and user
Some checks reported errors
arbeitszeitmessung/pipeline/head Something is wrong with the build of this commit

This commit is contained in:
2025-08-13 15:50:11 +02:00
parent ba885357c2
commit b614049d03
14 changed files with 126 additions and 36 deletions

View File

@@ -30,7 +30,12 @@ type Booking struct {
CounterId int `json:"counter_id"`
}
var DB *sql.DB
type IDatabase interface {
Prepare(query string) (*sql.Stmt, error)
Exec(query string, args ...any) (sql.Result, error)
}
var DB IDatabase
func (b *Booking) New(card_uid string, geraet_id int16, check_in_out int16) Booking {
return Booking{

38
Backend/models/db_test.go Normal file
View File

@@ -0,0 +1,38 @@
package models_test
import (
"arbeitszeitmessung/models"
"database/sql"
"testing"
_ "github.com/lib/pq"
)
type DBFixture struct {
Database models.IDatabase
TX *sql.Tx
}
func SetupDBFixture(t *testing.T) *DBFixture {
t.Helper()
db, err := sql.Open("postgres", "postgres://postgres:password@localhost:5433/arbeitszeitmessung?sslmode=disable")
if err != nil {
t.Fatalf("failed to connect to database: %v", err)
}
tx, err := db.Begin()
if err != nil {
t.Fatalf("Failed to start transaction: %v", err)
}
t.Cleanup(func() {
tx.Rollback()
db.Close()
})
return &DBFixture{
Database: tx,
TX: tx,
}
}

View File

@@ -24,13 +24,13 @@ func (u *User) GetUserFromSession(Session *scs.SessionManager, ctx context.Conte
var user User
var err error
if helper.GetEnv("GO_ENV", "production") == "debug" {
user, err = (*User).GetByPersonalNummer(nil, 123)
user, err = GetUserByPersonalNr(123)
} else {
if !Session.Exists(ctx, "user") {
log.Println("No user in session storage!")
return user, errors.New("No user in session storage!")
}
user, err = (*User).GetByPersonalNummer(nil, Session.GetInt(ctx, "user"))
user, err = GetUserByPersonalNr(Session.GetInt(ctx, "user"))
}
if err != nil {
log.Println("Cannot get user from session!")
@@ -95,7 +95,7 @@ func (u *User) CheckOut() error {
return nil
}
func (u *User) GetByPersonalNummer(personalNummer int) (User, error) {
func GetUserByPersonalNr(personalNummer int) (User, error) {
var user User
qStr, err := DB.Prepare((`SELECT personal_nummer, card_uid, vorname, nachname, arbeitszeit_per_tag FROM s_personal_daten WHERE personal_nummer = $1;`))

View File

@@ -0,0 +1,56 @@
package models_test
import (
"arbeitszeitmessung/models"
"database/sql"
"testing"
)
var testUser models.User = models.User{Vorname: "Kim", Name: "Mustermensch", PersonalNummer: 456, CardUID: "aaaa-aaaa", ArbeitszeitPerTag: 8}
func SetupUserFixture(t *testing.T, db models.IDatabase) {
t.Helper()
db.Exec(`INSERT INTO "s_personal_daten" ("personal_nummer", "aktiv_beschaeftigt", "vorname", "nachname", "geburtsdatum", "plz", "adresse", "geschlecht", "card_uid", "hauptbeschaeftigungs_ort", "arbeitszeit_per_tag", "arbeitszeit_min_start", "arbeitszeit_max_ende", "vorgesetzter_pers_nr") VALUES
(456, 't', 'Kim', 'Mustermensch', '2003-02-01', '08963', 'Altenburger Str. 44A', 1, 'aaaa-aaaa', 1, 8, '07:00:00', '20:00:00', 0);`)
}
func TestGetUserByPersonalNr(t *testing.T) {
tc := SetupDBFixture(t)
SetupUserFixture(t, tc.Database)
models.DB = tc.Database
user, err := models.GetUserByPersonalNr(testUser.PersonalNummer)
if err != nil {
t.Fatal(err)
}
if user != testUser {
t.Error("Retrieved user not the same as testUser!")
}
_, err = models.GetUserByPersonalNr(000)
if err != sql.ErrNoRows {
t.Error("Wrong error handling, when retrieving wrong personalnummer")
}
}
func TestCheckAnwesenheit(t *testing.T) {
tc := SetupDBFixture(t)
models.DB = tc.Database
SetupUserFixture(t, tc.Database)
var actual bool
if actual = testUser.CheckAnwesenheit(); actual != false {
t.Errorf("Checkabwesenheit with no booking should be false but is %t", actual)
}
tc.Database.Exec("INSERT INTO anwesenheit (timestamp, card_uid, check_in_out, geraet_id) VALUES (NOW() - INTERVAL '2 hour', 'aaaa-aaaa', 1, 1);")
if actual = testUser.CheckAnwesenheit(); actual != true {
t.Errorf("Checkabwesenheit with 'kommen' booking should be true but is %t", actual)
}
tc.Database.Exec("INSERT INTO anwesenheit (timestamp, card_uid, check_in_out, geraet_id) VALUES (NOW() - INTERVAL '1 hour', 'aaaa-aaaa', 2, 1);")
if actual = testUser.CheckAnwesenheit(); actual != false {
t.Errorf("Checkabwesenheit with 'gehen' booking should be false but is %t", actual)
}
}