From ac37cbfacdf0d9e99223866d6806ffb83d337f4a Mon Sep 17 00:00:00 2001 From: Marco Kittel Date: Fri, 18 Jul 2025 18:50:11 +0200 Subject: [PATCH] =?UTF-8?q?Added=20UnitTest=20for=20FetchData=20Service=20?= =?UTF-8?q?f=C3=BCr=20das=20Abholen=20von=20den=20jeweiligen=20Warenh?= =?UTF-8?q?=C3=A4usern?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/database/database.go | 16 ++-- internal/database/database_test.go | 147 ++++++++++++++++++++++++++++- 2 files changed, 153 insertions(+), 10 deletions(-) diff --git a/internal/database/database.go b/internal/database/database.go index c3726fc..ab244ed 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -10,6 +10,7 @@ import ( "time" _ "github.com/go-sql-driver/mysql" + "github.com/google/uuid" "gittea.marcokittel.de/elio/eliotools/eliofile" "gittea.marcokittel.de/elio/eliotools/logger" ) @@ -157,7 +158,7 @@ func (d *DatabaseWriter) UpdateOrInsertDelivery(fromcountry string, tocountry st } type ProductDelivery struct { - WhId int + Id int //Warehouse Id Warehouse string Amount int DeliveryDays int @@ -168,7 +169,7 @@ func (d *DatabaseReader) GetProductByProductIdDeliveryCountryAndState(prod_id, d stmt := ` SELECT whp.id, warehouse, amount, d.delivery, d.id deliveryId FROM warehouseproducts whp - join deliverytimes d + left join deliverytimes d on whp.warehouse = d.fromcountry where productid = ? and d.tocountry = ? @@ -184,7 +185,7 @@ func (d *DatabaseReader) GetProductByProductIdDeliveryCountryAndState(prod_id, d var products []ProductDelivery for rows.Next() { var pd ProductDelivery - if err := rows.Scan(&pd.WhId, &pd.Warehouse, &pd.Amount, &pd.DeliveryDays, &pd.DeliveryId); err != nil { + if err := rows.Scan(&pd.Id, &pd.Warehouse, &pd.Amount, &pd.DeliveryDays, &pd.DeliveryId); err != nil { return products, err } products = append(products, pd) @@ -230,12 +231,13 @@ func (d *DatabaseWriter) ReleaseReservation(Id UUID) error { return d.updateReservationState(Id, "RELEASED") } -func (d *DatabaseWriter) ReserveReservation(deliveryId, warehouseId, amount int) error { - _, err := d.db.Exec("INSERT INTO reservations (deliveryId, warehouseId, amount, status) VALUES (?,?,?,'RESERVED')") +func (d *DatabaseWriter) ReserveReservation(deliveryId, warehouseId, amount int) (UUID, error) { + newUUID := uuid.New().String() + _, err := d.db.Exec("INSERT INTO reservations (id, deliveryId, warehouseId, amount, status) VALUES (?,?,?,?,'RESERVED')", newUUID, deliveryId, warehouseId, amount) if err != nil { - return err + return "", err } - return nil + return UUID(newUUID), nil } func (db *DatabaseWriter) HandleData(ctx context.Context, data eliofile.CountryCsvData) error { diff --git a/internal/database/database_test.go b/internal/database/database_test.go index 6cb135c..9ef04d5 100644 --- a/internal/database/database_test.go +++ b/internal/database/database_test.go @@ -1,8 +1,8 @@ package database import ( + "encoding/json" "fmt" - "log" "strings" "testing" @@ -118,11 +118,152 @@ func TestSelectStatement(t *testing.T) { } func TestInsertStatement(t *testing.T) { - var dbr = NewDatabaseReader(connectionString) data, err := dbr.GetProductByProductIdDeliveryCountryAndState("A6053", "EU", "") if err != nil { t.Errorf("Es sollten Datensätze auffinbdar sein! %s", err) } - log.Println(data) + for _, item := range data { + uuid, err := dbr.DatabaseWriter.ReserveReservation(item.DeliveryId, item.Id, item.Amount) + if err != nil { + t.Errorf("Das Einfügen einer neuen Reservierung darf nicht fehlschlagen! %s", err) + } + status, err := dbr.GetReservationStateById(uuid) + if err != nil || status != "RESERVED" { + t.Errorf("Der Status muss RESERVED sein. Stattdessen ist er: %s", status) + } + } +} + +func TestAbortReservationStatement(t *testing.T) { + var dbr = NewDatabaseReader(connectionString) + data, err := dbr.GetProductByProductIdDeliveryCountryAndState("A6053", "EU", "") + if err != nil { + t.Errorf("Es sollten Datensätze auffinbdar sein! %s", err) + } + for _, item := range data { + uuid, err := dbr.DatabaseWriter.ReserveReservation(item.DeliveryId, item.Id, item.Amount) + if err != nil { + t.Errorf("Das Einfügen einer neuen Reservierung darf nicht fehlschlagen! %s", err) + } + err = dbr.AbortReservation(uuid) + if err != nil { + t.Errorf("Das Abbrechen einer Reservierung darf nicht fehlschlagen! %s", err) + } + status, err := dbr.GetReservationStateById(uuid) + if err != nil || status != "ABORTED" { + t.Errorf("Der Status muss ABORTED sein. Stattdessen ist er: %s", status) + } + if err != nil || status != "ABORTED" { + t.Errorf("Der Status muss ABORTED sein. Stattdessen ist er: %s", status) + } + } +} + +func TestConfirmReservationStatement(t *testing.T) { + var dbr = NewDatabaseReader(connectionString) + data, err := dbr.GetProductByProductIdDeliveryCountryAndState("A6053", "EU", "") + if err != nil { + t.Errorf("Es sollten Datensätze auffinbdar sein! %s", err) + } + for _, item := range data { + uuid, err := dbr.DatabaseWriter.ReserveReservation(item.DeliveryId, item.Id, item.Amount) + if err != nil { + t.Errorf("Das Einfügen einer neuen Reservierung darf nicht fehlschlagen! %s", err) + } + err = dbr.ConfirmReservation(uuid) + if err != nil { + t.Errorf("Das Abbrechen einer Reservierung darf nicht fehlschlagen! %s", err) + } + status, err := dbr.GetReservationStateById(uuid) + if err != nil || status != "CONFIRMED" { + t.Errorf("Der Status muss CONFIRMED sein. Stattdessen ist er: %s", status) + } + if err != nil || status != "CONFIRMED" { + t.Errorf("Der Status muss CONFIRMED sein. Stattdessen ist er: %s", status) + } + } +} + +func TestReleasedReservationStatement(t *testing.T) { + var dbr = NewDatabaseReader(connectionString) + data, err := dbr.GetProductByProductIdDeliveryCountryAndState("A6053", "EU", "") + if err != nil { + t.Errorf("Es sollten Datensätze auffinbdar sein! %s", err) + } + for _, item := range data { + uuid, err := dbr.DatabaseWriter.ReserveReservation(item.DeliveryId, item.Id, item.Amount) + if err != nil { + t.Errorf("Das Einfügen einer neuen Reservierung darf nicht fehlschlagen! %s", err) + } + err = dbr.ReleaseReservation(uuid) + if err != nil { + t.Errorf("Das Abbrechen einer Reservierung darf nicht fehlschlagen! %s", err) + } + status, err := dbr.GetReservationStateById(uuid) + if err != nil || status != "RELEASED" { + t.Errorf("Der Status muss RELEASED sein. Stattdessen ist er: %s", status) + } + if err != nil || status != "RELEASED" { + t.Errorf("Der Status muss RELEASED sein. Stattdessen ist er: %s", status) + } + } +} + +func TestFetchDataReservation(t *testing.T) { + payloadStr := `{ "products": { "A6053": 30 }, "context": { "country": "EU", "state": "" }}` + + var payload Container + err := json.Unmarshal([]byte(payloadStr), &payload) + if err != nil { + t.Errorf("Dieser Fehler beim Konvertieren der JSON Payload sollte nicht passieren! \n%s", err) + return + } + ps := NewProductService(connectionString) + op, err := ps.FetchData(&payload) + if err != nil { + t.Errorf("Das Datafetchen und umwandeln in eine Map muss sauber funktionieren! %s", err) + } + valTocompare := `[{map[A6053:[{DE 23 2} {EU 1 2} {AT 4 4}]]}]` + if fmt.Sprint(op) != valTocompare { + t.Errorf("Mist, sollte sein %s %s", valTocompare, fmt.Sprint(op)) + } +} +func TestFetchDataReservationVarition2(t *testing.T) { + payloadStr := `{ "products": { "A6053": 24 }, "context": { "country": "EU", "state": "" }}` + + var payload Container + err := json.Unmarshal([]byte(payloadStr), &payload) + if err != nil { + t.Errorf("Dieser Fehler beim Konvertieren der JSON Payload sollte nicht passieren! \n%s", err) + return + } + ps := NewProductService(connectionString) + op, err := ps.FetchData(&payload) + if err != nil { + t.Errorf("Das Datafetchen und umwandeln in eine Map muss sauber funktionieren! %s", err) + } + valTocompare := `[{map[A6053:[{DE 23 2} {EU 1 2}]]}]` + if fmt.Sprint(op) != valTocompare { + t.Errorf("Mist, sollte sein %s %s", valTocompare, fmt.Sprint(op)) + } +} +func TestFetchDataReservationVarition3(t *testing.T) { + payloadStr := `{ "products": { "A6053": 5 }, "context": { "country": "AT", "state": "" }}` + + var payload Container + err := json.Unmarshal([]byte(payloadStr), &payload) + if err != nil { + t.Errorf("Dieser Fehler beim Konvertieren der JSON Payload sollte nicht passieren! \n%s", err) + return + } + ps := NewProductService(connectionString) + op, err := ps.FetchData(&payload) + if err != nil { + t.Errorf("Das Datafetchen und umwandeln in eine Map muss sauber funktionieren! %s", err) + } + valTocompare := `[{map[A6053:[{AT 4 1} {DE 1 2}]]}]` + if fmt.Sprint(op) != valTocompare { + t.Errorf("Mist, sollte sein %s %s", valTocompare, fmt.Sprint(op)) + } }