374 lines
12 KiB
Go
374 lines
12 KiB
Go
package database
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"log"
|
|
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
// Unit Tests sollten niemals auf der Produktivdatenbank stattfinden.
|
|
// Sie sollten nicht wie Unit Tests betrachtet werden.
|
|
const (
|
|
connectionString = "root:eliogeheim@tcp(127.0.0.1:3306)/elio_test?parseTime=true"
|
|
)
|
|
|
|
func Setup(dbr *DatabaseReader) error {
|
|
_, err := dbr.DatabaseWriter.db.Exec("drop table if exists elio_test.reservations")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = dbr.DatabaseWriter.db.Exec("drop table if exists elio_test.warehouseproducts")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = dbr.DatabaseWriter.db.Exec("drop table if exists elio_test.deliverytimes")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = dbr.DatabaseWriter.createDeliveryTableIfNotExist()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = dbr.DatabaseWriter.createWarehouseTableIfNotExist()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = dbr.DatabaseWriter.createReservationTableIfNotExist()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
statements := strings.Split(CreateInserts, ";")
|
|
statementsDlvry := strings.Split(CreateDeliveryInserts, ";")
|
|
statements = append(statements, statementsDlvry...)
|
|
|
|
tx, err := dbr.db.Begin()
|
|
defer func() error {
|
|
if r := recover(); r != nil {
|
|
tx.Rollback()
|
|
return fmt.Errorf("Scheiße passiert!")
|
|
} else if err != nil {
|
|
_:
|
|
tx.Rollback()
|
|
return fmt.Errorf("Scheiße passiert!")
|
|
} else {
|
|
err = tx.Commit()
|
|
if err != nil {
|
|
return fmt.Errorf("Scheiße passiert!")
|
|
}
|
|
}
|
|
return nil
|
|
}()
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, stmt := range statements {
|
|
_, err := tx.Exec(stmt)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func TestDatabaseConnection(t *testing.T) {
|
|
var dbr = NewDatabaseReader(connectionString)
|
|
err := dbr.db.Ping()
|
|
if err != nil {
|
|
t.Errorf("Datenbankverbindung fehlgeschlagen! %s", err)
|
|
}
|
|
}
|
|
|
|
func TestSelectStatementNoDatasetsAvailable(t *testing.T) {
|
|
var dbr = NewDatabaseReader(connectionString)
|
|
err := Setup(dbr)
|
|
if err != nil {
|
|
t.Errorf("Setup failed! %s", err)
|
|
}
|
|
_, err = dbr.GetProductByProductIdDeliveryCountryAndState("X9299", "EU", "")
|
|
if err != nil {
|
|
t.Errorf("Es dürfen keine Datensätze gefunden werden! %s", err)
|
|
}
|
|
}
|
|
|
|
func TestSelectStatement(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)
|
|
}
|
|
|
|
if len(data) != 3 {
|
|
t.Errorf("Es müssen drei Datensätze vorhanden sein. Stattdessen sind es %d", len(data))
|
|
}
|
|
|
|
compareStr := "[{7507 DE 23 2 34} {500 EU 1 2 60} {8508 AT 4 4 64}]"
|
|
dbResultStr := fmt.Sprintln(data)
|
|
dbResultStr = strings.Trim(dbResultStr, "\n")
|
|
if strings.Compare(compareStr, dbResultStr) != 0 {
|
|
t.Errorf("Error: die Datensätze sind ungleich. \nSoll sein :\n%s\n ist aber: \n%s", compareStr, dbResultStr)
|
|
}
|
|
}
|
|
|
|
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)
|
|
}
|
|
groupId := uuid.New().String()
|
|
for _, item := range data {
|
|
uuid, err := dbr.DatabaseWriter.ReserveReservationItem(item.DeliveryId, item.Id, item.Amount, UUID(groupId))
|
|
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)
|
|
}
|
|
groupId := uuid.New().String()
|
|
for _, item := range data {
|
|
uuid, err := dbr.DatabaseWriter.ReserveReservationItem(item.DeliveryId, item.Id, item.Amount, UUID(groupId))
|
|
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)
|
|
}
|
|
groupId := uuid.New().String()
|
|
for _, item := range data {
|
|
uuid, err := dbr.DatabaseWriter.ReserveReservationItem(item.DeliveryId, item.Id, item.Amount, UUID(groupId))
|
|
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)
|
|
}
|
|
groupId := uuid.New().String()
|
|
for _, item := range data {
|
|
uuid, err := dbr.DatabaseWriter.ReserveReservationItem(item.DeliveryId, item.Id, item.Amount, UUID(groupId))
|
|
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 TestFetchReservationData(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)
|
|
// groupId := uuid.New().String()
|
|
op, err := ps.FetchData(&payload)
|
|
log.Println(op)
|
|
}
|
|
|
|
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)
|
|
groupId := uuid.New().String()
|
|
op, err := ps.FetchReservationData(&payload, UUID(groupId))
|
|
if err != nil {
|
|
t.Errorf("Das Datafetchen und umwandeln in eine Map muss sauber funktionieren! %s", err)
|
|
}
|
|
valTocompare := `[{map[A6053:[{DE 23 2 7507 34} {EU 1 2 500 60} {AT 4 4 8508 64}]]}]`
|
|
if fmt.Sprint(op) != valTocompare {
|
|
t.Errorf("Mist, sollte sein %s ist aber %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 7507 34} {EU 1 2 500 60}]]}]`
|
|
if fmt.Sprint(op) != valTocompare {
|
|
t.Errorf("Mist, sollte sein %s ist aber %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 8508 63} {DE 1 2 7507 18}]]}]`
|
|
if fmt.Sprint(op) != valTocompare {
|
|
t.Errorf("Mist, sollte sein %s ist aber %s", valTocompare, fmt.Sprint(op))
|
|
}
|
|
}
|
|
|
|
func TestOutgoingJsonString(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 8508 63} {DE 1 2 7507 18}]]}]`
|
|
if fmt.Sprint(op) != valTocompare {
|
|
t.Errorf("Mist, sollte sein %s ist aber %s", valTocompare, fmt.Sprint(op))
|
|
}
|
|
jsonResult, err := json.Marshal(op)
|
|
jsonStrForApiResponse := `[{"products":{"A6053":[{"warehouse":"AT","quantity":4,"delivery_time":1},{"warehouse":"DE","quantity":1,"delivery_time":2}]}}]`
|
|
if string(jsonResult) != jsonStrForApiResponse {
|
|
t.Errorf("Mist, sollte sein %s ist aber %s", string(jsonResult), jsonStrForApiResponse)
|
|
}
|
|
}
|
|
|
|
func TestOutgoingReservationInDatabase(t *testing.T) {
|
|
//Löscht die Tabellen und erzeugt die Testdaten neu.
|
|
//Das Verbessert den Überblick
|
|
var dbr = NewDatabaseReader(connectionString)
|
|
err := Setup(dbr)
|
|
|
|
if err != nil {
|
|
t.Errorf("Setup failed! %s", err)
|
|
}
|
|
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
|
|
}
|
|
groupId := uuid.New().String()
|
|
ps := NewProductService(connectionString)
|
|
op, err := ps.FetchReservationData(&payload, UUID(groupId))
|
|
if err != nil {
|
|
t.Errorf("Das Datafetchen und umwandeln in eine Map muss sauber funktionieren! %s", err)
|
|
}
|
|
valTocompare := fmt.Sprintf(`[{%s map[A6053:[{AT 4 1 8508 63} {DE 1 2 7507 18}]]}]`, groupId)
|
|
if fmt.Sprint(op) != valTocompare {
|
|
t.Errorf("Mist, sollte sein %s ist aber %s", valTocompare, fmt.Sprint(op))
|
|
}
|
|
uuids, err := ps.ReserviereBestellungen(op, UUID(groupId))
|
|
if err != nil {
|
|
t.Errorf("Das Reservieren ist fehlgeschlagen! \n%s", err)
|
|
}
|
|
for _, uuid := range *uuids {
|
|
status, err := ps.dbr.GetReservationStateById(uuid)
|
|
if err != nil || status != "RESERVED" {
|
|
t.Errorf("Der Status muss RESERVED sein. Stattdessen ist er: %s", status)
|
|
}
|
|
|
|
}
|
|
ps.dbr.ReleaseReservationGroup(UUID(groupId))
|
|
for _, uuid := range *uuids {
|
|
status, err := ps.dbr.GetReservationStateById(uuid)
|
|
if err != nil || status != "RELEASED" {
|
|
t.Errorf("Der Status muss RELEASED sein. Stattdessen ist er: %s", status)
|
|
}
|
|
|
|
}
|
|
jsonResult, err := json.Marshal(op)
|
|
jsonGuid := fmt.Sprintf("\"id\":\"%s\"", UUID(groupId))
|
|
jsonStrForApiResponse := fmt.Sprintf(`[{%s,"products":{"A6053":[{"warehouse":"AT","quantity":4,"delivery_time":1},{"warehouse":"DE","quantity":1,"delivery_time":2}]}}]`, jsonGuid)
|
|
if string(jsonResult) != jsonStrForApiResponse {
|
|
t.Errorf("Mist, sollte sein %s ist aber %s", string(jsonResult), jsonStrForApiResponse)
|
|
}
|
|
|
|
}
|