Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bessere Buchungsvalidierung #1275

Merged
merged 20 commits into from
Jun 23, 2023
Merged

Bessere Buchungsvalidierung #1275

merged 20 commits into from
Jun 23, 2023

Conversation

hansmorb
Copy link
Contributor

@hansmorb hansmorb commented May 24, 2023

Mit diesem PR sollten die Nutzenden nicht mehr einen Fatal Error sehen, wenn eine Buchung fehlschlägt.

closes #1248

@chriwen Schau mal bitte da rein und vielleicht kannst du ja auch sagen, wie und ob wir den alten Transient da herausnehmen können. Die Sache mit den unconfirmed Bookings würde ich auch noch auf diesem Branch machen.

@hansmorb hansmorb added the bug Something isn't working label May 24, 2023
@hansmorb hansmorb added this to the 2.8.1 milestone May 24, 2023
@hansmorb hansmorb requested a review from chriwen May 24, 2023 17:27
@hansmorb hansmorb removed this from the 2.8.1 milestone Jun 12, 2023
@hansmorb hansmorb changed the base branch from master to release/2.8.1 June 15, 2023 18:37
@hansmorb hansmorb marked this pull request as ready for review June 19, 2023 09:15
@hansmorb hansmorb mentioned this pull request Jun 19, 2023
@hansmorb hansmorb added this to the 2.8.1 milestone Jun 19, 2023
@hansmorb hansmorb linked an issue Jun 19, 2023 that may be closed by this pull request
…issue-1248

# Conflicts:
#	src/Model/Booking.php
#	src/Wordpress/CustomPostType/Booking.php
@codecov
Copy link

codecov bot commented Jun 19, 2023

Codecov Report

❗ No coverage uploaded for pull request base (release/2.8.1@7fb729b). Click here to learn what that means.
The diff coverage is n/a.

@@               Coverage Diff                @@
##             release/2.8.1    #1275   +/-   ##
================================================
  Coverage                 ?   25.75%           
  Complexity               ?     2054           
================================================
  Files                    ?       83           
  Lines                    ?     8382           
  Branches                 ?        0           
================================================
  Hits                     ?     2159           
  Misses                   ?     6223           
  Partials                 ?        0           

@hansmorb
Copy link
Contributor Author

hansmorb commented Jun 19, 2023

@chriwen @datengraben Ich hab doch nochmal einiges gebastelt, um die ganzen Methoden einerseits testbar zu machen und habe dann auch noch die Tests dazu ergänzt. Das sind vielleicht jetzt etwas mehr Änderungen aber ich glaube das macht das ganze etwas robuster. Kannst da einer von euch nochmal rüberschauen? Dann können wir das mergen und hätten die 2.8.1 fertig.

src/Model/Booking.php Outdated Show resolved Hide resolved
src/Wordpress/CustomPostType/Booking.php Show resolved Hide resolved
// checks if it's an edit, but ignores exact start/end time
$isEdit = count( $existingBookings ) === 1 &&
array_values( $existingBookings )[0]->getPost()->post_name === $requestedPostName &&
array_values( $existingBookings )[0]->getPost()->post_author === get_current_user_id();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wenn es ein Admin-Edit ist, ist $isEdit immer false, obwohl es true sein sollte. Da get_current_user_id nie gleich des post_author sein kann.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@hansmorb ist das vielleicht der Punkt aus den Tests (da wo der Test-Case fehlt).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hui, da bin ich überfragt @chriwen weißt du, was du damit erreichen wolltest?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Vielleicht weil die Validierung bei Admin Buchungen ausfällt?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TLDR: Ich würde den Change annehmen, aber die entsprechende Stelle mal überarbeiten.

Meine Vermutung ist, das der Code ab L292 eine Buchung auf unconfirmed setzen soll, wenn ein User seine Buchung bearbeitet. Aktuell verstehe ich aber nicht, (1) wieso dafür die Bedingung count( $existingBookings ) > 0 wahr sein muss und (2) wieso Zeile 299 wahr sein muss. Das ist doch ein Zustand der gar nicht eintreten darf. Also zwei Bookings zur selben Zeit. Denn die Buchung aus $booking kann ja nie in $existingBookings enthalten sein. Wenn ich es richtig verstehe.

Meiner Meinung nach gibt es auch nur einen (unwahrscheinlichen) Fall in dem sich der Code nicht wie erwartet verhält: Angenommen wir machen einen Admin-Edit. Es existiert genau eine andere Buchung, der PostName ist gleich dem requestedPostName und der PostAuthor ist aber ungleich unserem user, da wir der Admin sind. Dann ist isEdit false (obwohl es true sein müsste, es ist ja ein Edit). Damit wird die Bedingung in L298 wahr ausgewertet. $booking ist ebenfalls true (sonst wäre es ja wahrscheinlich auch kein Edit). Unser Booking Status wird damit unconfirmed, obwohl es ein Admin Edit ist (der ja ggf. gar nicht den Status ändern will).

/**
* This class tests the form request for the frontend booking process
*
* TODO: Test the case, where one user creates an unconfirmed booking and an admin creates a booking for the same item, location and timeframe.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wenn ich das TODO richtig verstehe, testen wir es nicht da es noch nicht korrekt implementiert ist?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exakt! Aktuell ist es so, dass wenn ein Nutzender eine unconfirmed Buchung an zb. Artikel A an Standort A von 10:00-12:00 erstellt, und gleichzeitig ein Admin für Artikel A an Standort A von 10:00-12:00 versucht eine Buchung zu erstellen, der Admin die Buchung von dem Nutzenden angezeigt bekommt.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@hansmorb ich finde es wirklich klasse, wie detailliert ihr den Code testet und auch die Cornercases berücksichtigt. Den von dir beschriebenen Fall müssen wir aber denke ich nicht wirklich absichern. Die Eintrittswahrscheinlichkeit ist schon sehr gering, oder?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@chriwen Das stimmt, ich hatte das auch nur in einem spezifischen Fall so! Hat auf jeden Fall keine Prio, deshalb habe ich auch nur diesen Kommentar geschrieben ;)

Copy link
Contributor

@datengraben datengraben left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wie im Comment beschrieben würde ich im Nachgang mal die eine Stelle refactoren oder besser beschreiben was dort der Sinn ist.

// checks if it's an edit, but ignores exact start/end time
$isEdit = count( $existingBookings ) === 1 &&
array_values( $existingBookings )[0]->getPost()->post_name === $requestedPostName &&
array_values( $existingBookings )[0]->getPost()->post_author === get_current_user_id();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TLDR: Ich würde den Change annehmen, aber die entsprechende Stelle mal überarbeiten.

Meine Vermutung ist, das der Code ab L292 eine Buchung auf unconfirmed setzen soll, wenn ein User seine Buchung bearbeitet. Aktuell verstehe ich aber nicht, (1) wieso dafür die Bedingung count( $existingBookings ) > 0 wahr sein muss und (2) wieso Zeile 299 wahr sein muss. Das ist doch ein Zustand der gar nicht eintreten darf. Also zwei Bookings zur selben Zeit. Denn die Buchung aus $booking kann ja nie in $existingBookings enthalten sein. Wenn ich es richtig verstehe.

Meiner Meinung nach gibt es auch nur einen (unwahrscheinlichen) Fall in dem sich der Code nicht wie erwartet verhält: Angenommen wir machen einen Admin-Edit. Es existiert genau eine andere Buchung, der PostName ist gleich dem requestedPostName und der PostAuthor ist aber ungleich unserem user, da wir der Admin sind. Dann ist isEdit false (obwohl es true sein müsste, es ist ja ein Edit). Damit wird die Bedingung in L298 wahr ausgewertet. $booking ist ebenfalls true (sonst wäre es ja wahrscheinlich auch kein Edit). Unser Booking Status wird damit unconfirmed, obwohl es ein Admin Edit ist (der ja ggf. gar nicht den Status ändern will).

@hansmorb hansmorb merged commit bf34bdf into release/2.8.1 Jun 23, 2023
3 checks passed
@hansmorb hansmorb deleted the enhancement/issue-1248 branch July 9, 2023 22:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
3 participants