datawriter/internal/database/database_test.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)
}
}