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) } }