ReviewController.java

1
package edu.ucsb.cs156.dining.controllers;
2
3
import com.fasterxml.jackson.core.JsonProcessingException;
4
import edu.ucsb.cs156.dining.entities.MenuItem;
5
import edu.ucsb.cs156.dining.entities.Review;
6
import edu.ucsb.cs156.dining.entities.User;
7
import edu.ucsb.cs156.dining.errors.EntityNotFoundException;
8
import edu.ucsb.cs156.dining.models.CurrentUser;
9
import edu.ucsb.cs156.dining.models.EditedReview;
10
import edu.ucsb.cs156.dining.repositories.MenuItemRepository;
11
import edu.ucsb.cs156.dining.repositories.ReviewRepository;
12
import edu.ucsb.cs156.dining.statuses.ModerationStatus;
13
import io.swagger.v3.oas.annotations.Operation;
14
import io.swagger.v3.oas.annotations.Parameter;
15
import io.swagger.v3.oas.annotations.tags.Tag;
16
import jakarta.validation.Valid;
17
import java.time.LocalDateTime;
18
import java.util.HashMap;
19
import java.util.Map;
20
import lombok.extern.slf4j.Slf4j;
21
import org.springframework.beans.factory.annotation.Autowired;
22
import org.springframework.format.annotation.DateTimeFormat;
23
import org.springframework.http.ResponseEntity;
24
import org.springframework.security.access.AccessDeniedException;
25
import org.springframework.security.access.prepost.PreAuthorize;
26
import org.springframework.security.core.GrantedAuthority;
27
import org.springframework.web.bind.annotation.DeleteMapping;
28
import org.springframework.web.bind.annotation.ExceptionHandler;
29
import org.springframework.web.bind.annotation.GetMapping;
30
import org.springframework.web.bind.annotation.PathVariable;
31
import org.springframework.web.bind.annotation.PostMapping;
32
import org.springframework.web.bind.annotation.PutMapping;
33
import org.springframework.web.bind.annotation.RequestBody;
34
import org.springframework.web.bind.annotation.RequestMapping;
35
import org.springframework.web.bind.annotation.RequestParam;
36
import org.springframework.web.bind.annotation.RestController;
37
38
/** This is a REST controller for Reviews */
39
@Tag(name = "Review")
40
@RequestMapping("/api/reviews")
41
@RestController
42
@Slf4j
43
public class ReviewController extends ApiController {
44
45
  private boolean hasReviewerComments(String reviewerComments) {
46 3 1. hasReviewerComments : replaced boolean return with true for edu/ucsb/cs156/dining/controllers/ReviewController::hasReviewerComments → KILLED
2. hasReviewerComments : negated conditional → KILLED
3. hasReviewerComments : negated conditional → KILLED
    return reviewerComments != null && !reviewerComments.trim().isEmpty();
47
  }
48
49
  @ExceptionHandler(IllegalArgumentException.class)
50
  public ResponseEntity<Map<String, String>> handleValidationExceptions(
51
      IllegalArgumentException ex) {
52
    Map<String, String> errors = new HashMap<>();
53
    errors.put("error", ex.getMessage());
54 1 1. handleValidationExceptions : replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::handleValidationExceptions → KILLED
    return ResponseEntity.badRequest().body(errors);
55
  }
56
57
  @Autowired ReviewRepository reviewRepository;
58
59
  @Autowired MenuItemRepository menuItemRepository;
60
61
  /**
62
   * This method returns a list of all Reviews.
63
   *
64
   * @return a list of all Reviews
65
   */
66
  @Operation(summary = "List all Reviews")
67
  @PreAuthorize("hasRole('ROLE_ADMIN')")
68
  @GetMapping("/all")
69
  public Iterable<Review> allReviews() {
70
    log.info("Attempting to log all reviews");
71
    Iterable<Review> reviews = reviewRepository.findAll();
72
    log.info("all reviews found, ", reviews);
73 1 1. allReviews : replaced return value with Collections.emptyList for edu/ucsb/cs156/dining/controllers/ReviewController::allReviews → KILLED
    return reviews;
74
  }
75
76
  /**
77
   * This method returns a list of all Reviews.
78
   *
79
   * @return a list of all Reviews
80
   */
81
  @Operation(summary = "List all approved reviews for a specific item")
82
  @GetMapping("/approved/forItem/{itemId}")
83
  public Iterable<Review> allApprovedReviewsForItem(
84
      @Parameter(name = "itemId") @PathVariable("itemId") long itemId) {
85
    log.info("Attempting to log all approved reviews for item with id: {}", itemId);
86
    MenuItem item =
87
        menuItemRepository
88
            .findById(itemId)
89 1 1. lambda$allApprovedReviewsForItem$0 : replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$allApprovedReviewsForItem$0 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(MenuItem.class, itemId));
90
    Iterable<Review> reviews =
91
        reviewRepository.findByItemAndStatus(item, ModerationStatus.APPROVED);
92
    log.info("all approved reviews for item found, ", reviews);
93 1 1. allApprovedReviewsForItem : replaced return value with Collections.emptyList for edu/ucsb/cs156/dining/controllers/ReviewController::allApprovedReviewsForItem → KILLED
    return reviews;
94
  }
95
96
  /**
97
   * This method allows a user to submit a review
98
   *
99
   * @return message that says an review was added to the database
100
   * @param itemId id of the item
101
   * @param dateItemServed localDataTime All others params must not be parameters and instead
102
   *     derived from data sources that are dynamic (Date), or set to be null or some other
103
   *     signifier
104
   */
105
  @Operation(summary = "Create a new review")
106
  @PreAuthorize("hasRole('ROLE_USER')")
107
  @PostMapping("/post")
108
  public Review postReview(
109
      @Parameter(name = "itemId") @RequestParam long itemId,
110
      @Parameter(description = "Comments by the reviewer, can be blank")
111
          @RequestParam(required = false)
112
          String reviewerComments,
113
      @Parameter(name = "itemsStars") @RequestParam Long itemsStars,
114
      @Parameter(
115
              name = "dateItemServed",
116
              description =
117
                  "date (in iso format, e.g. YYYY-mm-ddTHH:MM:SS; see https://en.wikipedia.org/wiki/ISO_8601)")
118
          @RequestParam("dateItemServed")
119
          @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
120
          LocalDateTime dateItemServed) // For
121
      throws JsonProcessingException {
122
    LocalDateTime now = LocalDateTime.now();
123
    Review review = new Review();
124 1 1. postReview : removed call to edu/ucsb/cs156/dining/entities/Review::setDateItemServed → KILLED
    review.setDateItemServed(dateItemServed);
125
126 1 1. postReview : negated conditional → KILLED
    if (hasReviewerComments(reviewerComments)) {
127 1 1. postReview : removed call to edu/ucsb/cs156/dining/entities/Review::setReviewerComments → KILLED
      review.setReviewerComments(reviewerComments);
128
    } else {
129 1 1. postReview : removed call to edu/ucsb/cs156/dining/entities/Review::setStatus → KILLED
      review.setStatus(ModerationStatus.APPROVED);
130
    }
131
132
    // Ensure user inputs rating 1-5
133 4 1. postReview : negated conditional → KILLED
2. postReview : changed conditional boundary → KILLED
3. postReview : negated conditional → KILLED
4. postReview : changed conditional boundary → KILLED
    if (itemsStars < 1 || itemsStars > 5) {
134
      throw new IllegalArgumentException("Items stars must be between 1 and 5.");
135
    }
136
137 1 1. postReview : removed call to edu/ucsb/cs156/dining/entities/Review::setItemsStars → KILLED
    review.setItemsStars(itemsStars);
138
139
    MenuItem reviewedItem =
140
        menuItemRepository
141
            .findById(itemId)
142 1 1. lambda$postReview$1 : replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$postReview$1 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(MenuItem.class, itemId));
143
144 1 1. postReview : removed call to edu/ucsb/cs156/dining/entities/Review::setItem → KILLED
    review.setItem(reviewedItem);
145
    CurrentUser user = getCurrentUser();
146 1 1. postReview : removed call to edu/ucsb/cs156/dining/entities/Review::setReviewer → KILLED
    review.setReviewer(user.getUser());
147
    log.info("reviews={}", review);
148
    review = reviewRepository.save(review);
149 1 1. postReview : replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::postReview → KILLED
    return review;
150
  }
151
152
  /**
153
   * This method allows a user to get a list of reviews that they have previously made. Only user
154
   * can only get a list of their own reviews, and you cant request another persons reviews
155
   *
156
   * @return a list of reviews sent by a given user
157
   */
158
  @Operation(summary = "Get all reviews a user has sent: only callable by the user")
159
  @PreAuthorize("hasRole('ROLE_USER')")
160
  @GetMapping("/userReviews")
161
  public Iterable<Review> get_all_review_by_user_id() {
162
    CurrentUser user = getCurrentUser();
163
    Iterable<Review> reviews = reviewRepository.findByReviewer(user.getUser());
164 1 1. get_all_review_by_user_id : replaced return value with Collections.emptyList for edu/ucsb/cs156/dining/controllers/ReviewController::get_all_review_by_user_id → KILLED
    return reviews;
165
  }
166
167
  @Operation(summary = "Edit a review")
168
  @PreAuthorize("hasRole('ROLE_USER')")
169
  @PutMapping("/reviewer")
170
  public Review editReview(@Parameter Long id, @RequestBody @Valid EditedReview incoming) {
171
172
    Review oldReview =
173
        reviewRepository
174
            .findById(id)
175 1 1. lambda$editReview$2 : replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$editReview$2 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(Review.class, id));
176
    User current = getCurrentUser().getUser();
177 1 1. editReview : negated conditional → KILLED
    if (current.getId() != oldReview.getReviewer().getId()) {
178
      throw new AccessDeniedException("No permission to edit review");
179
    }
180
181 4 1. editReview : negated conditional → KILLED
2. editReview : changed conditional boundary → KILLED
3. editReview : negated conditional → KILLED
4. editReview : changed conditional boundary → KILLED
    if (incoming.getItemStars() < 1 || incoming.getItemStars() > 5) {
182
      throw new IllegalArgumentException("Items stars must be between 1 and 5.");
183
    } else {
184 1 1. editReview : removed call to edu/ucsb/cs156/dining/entities/Review::setItemsStars → KILLED
      oldReview.setItemsStars(incoming.getItemStars());
185
    }
186
187 1 1. editReview : negated conditional → KILLED
    if (hasReviewerComments(incoming.getReviewerComments())) {
188 1 1. editReview : removed call to edu/ucsb/cs156/dining/entities/Review::setReviewerComments → KILLED
      oldReview.setReviewerComments(incoming.getReviewerComments());
189 1 1. editReview : removed call to edu/ucsb/cs156/dining/entities/Review::setStatus → KILLED
      oldReview.setStatus(ModerationStatus.AWAITING_REVIEW);
190
    } else {
191 1 1. editReview : removed call to edu/ucsb/cs156/dining/entities/Review::setReviewerComments → KILLED
      oldReview.setReviewerComments(null);
192 1 1. editReview : removed call to edu/ucsb/cs156/dining/entities/Review::setStatus → KILLED
      oldReview.setStatus(ModerationStatus.APPROVED);
193
    }
194
195 1 1. editReview : removed call to edu/ucsb/cs156/dining/entities/Review::setDateItemServed → KILLED
    oldReview.setDateItemServed(incoming.getDateItemServed());
196
197 1 1. editReview : removed call to edu/ucsb/cs156/dining/entities/Review::setModeratorComments → KILLED
    oldReview.setModeratorComments(null);
198
199
    Review review = reviewRepository.save(oldReview);
200
201 1 1. editReview : replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::editReview → KILLED
    return review;
202
  }
203
204
  @Operation(summary = "Delete a review")
205
  @PreAuthorize("hasRole('ROLE_USER')")
206
  @DeleteMapping("/reviewer")
207
  public Object deleteReview(@Parameter Long id) {
208
    Review review =
209
        reviewRepository
210
            .findById(id)
211 1 1. lambda$deleteReview$3 : replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$deleteReview$3 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(Review.class, id));
212
213
    CurrentUser currentUser = getCurrentUser();
214
    User current = currentUser.getUser();
215
    boolean currentUserIsAdmin =
216
        currentUser.getRoles().stream()
217
            .map(GrantedAuthority::getAuthority)
218
            .anyMatch("ROLE_ADMIN"::equals);
219 2 1. deleteReview : negated conditional → KILLED
2. deleteReview : negated conditional → KILLED
    if (current.getId() != review.getReviewer().getId() && !currentUserIsAdmin) {
220
      throw new AccessDeniedException("No permission to delete review");
221
    }
222
223 1 1. deleteReview : removed call to edu/ucsb/cs156/dining/repositories/ReviewRepository::delete → KILLED
    reviewRepository.delete(review);
224 1 1. deleteReview : replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::deleteReview → KILLED
    return genericMessage("Review with id %s deleted".formatted(id));
225
  }
226
227
  @Operation(summary = "Moderate a review")
228
  @PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_MODERATOR')")
229
  @PutMapping("/moderate")
230
  public Review moderateReview(
231
      @Parameter Long id, @Parameter ModerationStatus status, @Parameter String moderatorComments) {
232
    Review review =
233
        reviewRepository
234
            .findById(id)
235 1 1. lambda$moderateReview$4 : replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$moderateReview$4 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(Review.class, id));
236
237 1 1. moderateReview : removed call to edu/ucsb/cs156/dining/entities/Review::setModeratorComments → KILLED
    review.setModeratorComments(moderatorComments);
238 1 1. moderateReview : removed call to edu/ucsb/cs156/dining/entities/Review::setStatus → KILLED
    review.setStatus(status);
239
240
    review = reviewRepository.save(review);
241 1 1. moderateReview : replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::moderateReview → KILLED
    return review;
242
  }
243
244
  @Operation(summary = "See reviews that need moderation")
245
  @PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_MODERATOR')")
246
  @GetMapping("/needsmoderation")
247
  public Iterable<Review> needsmoderation() {
248
    Iterable<Review> reviewsList = reviewRepository.findByStatus(ModerationStatus.AWAITING_REVIEW);
249 1 1. needsmoderation : replaced return value with Collections.emptyList for edu/ucsb/cs156/dining/controllers/ReviewController::needsmoderation → KILLED
    return reviewsList;
250
  }
251
252
  @PreAuthorize("hasRole('ROLE_USER')")
253
  @GetMapping("/{id}")
254
  public Review getReviewById(@PathVariable Long id) {
255
256
    // 1. Look up the review or 404
257
    Review review =
258
        reviewRepository
259
            .findById(id)
260 1 1. lambda$getReviewById$5 : replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$getReviewById$5 → KILLED
            .orElseThrow(() -> new EntityNotFoundException(Review.class, id));
261
262
    // 2. Get current requester
263
    User requester = getCurrentUser().getUser();
264
265
    // 3. Evaluate permissions
266 1 1. getReviewById : negated conditional → KILLED
    boolean isOwner = (review.getReviewer().getId() == requester.getId());
267
    boolean isAdmin =
268 2 1. lambda$getReviewById$6 : replaced boolean return with true for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$getReviewById$6 → KILLED
2. lambda$getReviewById$6 : replaced boolean return with false for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$getReviewById$6 → KILLED
        getCurrentUser().getRoles().stream().anyMatch(r -> r.getAuthority().equals("ROLE_ADMIN"));
269
    boolean isModerator =
270
        getCurrentUser().getRoles().stream()
271 2 1. lambda$getReviewById$7 : replaced boolean return with true for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$getReviewById$7 → KILLED
2. lambda$getReviewById$7 : replaced boolean return with false for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$getReviewById$7 → KILLED
            .anyMatch(r -> r.getAuthority().equals("ROLE_MODERATOR"));
272
273
    // 4. Enforce access rules
274 3 1. getReviewById : negated conditional → KILLED
2. getReviewById : negated conditional → KILLED
3. getReviewById : negated conditional → KILLED
    if (!(isOwner || isAdmin || isModerator)) {
275
      throw new AccessDeniedException("No permission to view this review");
276
    }
277
278
    // 5. Return the review
279 1 1. getReviewById : replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::getReviewById → KILLED
    return review;
280
  }
281
}

Mutations

46

1.1
Location : hasReviewerComments
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:trim_works_correctly()]
replaced boolean return with true for edu/ucsb/cs156/dining/controllers/ReviewController::hasReviewerComments → KILLED

2.2
Location : hasReviewerComments
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:edit_works_correctly()]
negated conditional → KILLED

3.3
Location : hasReviewerComments
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:edit_works_correctly()]
negated conditional → KILLED

54

1.1
Location : handleValidationExceptions
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:test_rating_below_1_throws_exception()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::handleValidationExceptions → KILLED

73

1.1
Location : allReviews
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:a_logged_in_admin_can_get_all()]
replaced return value with Collections.emptyList for edu/ucsb/cs156/dining/controllers/ReviewController::allReviews → KILLED

89

1.1
Location : lambda$allApprovedReviewsForItem$0
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:allApprovedReviewsForItem_returns_not_found_for_nonexistent_item()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$allApprovedReviewsForItem$0 → KILLED

93

1.1
Location : allApprovedReviewsForItem
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:allApprovedReviewsForItem_returns_approved_reviews_for_existing_item()]
replaced return value with Collections.emptyList for edu/ucsb/cs156/dining/controllers/ReviewController::allApprovedReviewsForItem → KILLED

124

1.1
Location : postReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:test_emptyString_on_creating_new_review()]
removed call to edu/ucsb/cs156/dining/entities/Review::setDateItemServed → KILLED

126

1.1
Location : postReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:test_emptyString_on_creating_new_review()]
negated conditional → KILLED

127

1.1
Location : postReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:a_user_can_post_a_new_review()]
removed call to edu/ucsb/cs156/dining/entities/Review::setReviewerComments → KILLED

129

1.1
Location : postReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:test_emptyString_on_creating_new_review()]
removed call to edu/ucsb/cs156/dining/entities/Review::setStatus → KILLED

133

1.1
Location : postReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:test_rating_above_5_throws_exception()]
negated conditional → KILLED

2.2
Location : postReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:testItemIdIsInvalid_NotFound()]
changed conditional boundary → KILLED

3.3
Location : postReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:test_rating_below_1_throws_exception()]
negated conditional → KILLED

4.4
Location : postReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:postReview_ShouldAcceptRatingAtBoundaries()]
changed conditional boundary → KILLED

137

1.1
Location : postReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:test_emptyString_on_creating_new_review()]
removed call to edu/ucsb/cs156/dining/entities/Review::setItemsStars → KILLED

142

1.1
Location : lambda$postReview$1
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:testItemIdIsInvalid_NotFound()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$postReview$1 → KILLED

144

1.1
Location : postReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:test_emptyString_on_creating_new_review()]
removed call to edu/ucsb/cs156/dining/entities/Review::setItem → KILLED

146

1.1
Location : postReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:test_emptyString_on_creating_new_review()]
removed call to edu/ucsb/cs156/dining/entities/Review::setReviewer → KILLED

149

1.1
Location : postReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:test_emptyString_on_creating_new_review()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::postReview → KILLED

164

1.1
Location : get_all_review_by_user_id
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:user_reviews_response_includes_item_field()]
replaced return value with Collections.emptyList for edu/ucsb/cs156/dining/controllers/ReviewController::get_all_review_by_user_id → KILLED

175

1.1
Location : lambda$editReview$2
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:not_found_throws_exception()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$editReview$2 → KILLED

177

1.1
Location : editReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:wrong_user_cannot_edit()]
negated conditional → KILLED

181

1.1
Location : editReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:can_set_stars_at_high_boundary()]
negated conditional → KILLED

2.2
Location : editReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:can_set_stars_at_low_boundary()]
changed conditional boundary → KILLED

3.3
Location : editReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:can_set_stars_at_high_boundary()]
negated conditional → KILLED

4.4
Location : editReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:can_set_stars_at_high_boundary()]
changed conditional boundary → KILLED

184

1.1
Location : editReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:edit_works_correctly()]
removed call to edu/ucsb/cs156/dining/entities/Review::setItemsStars → KILLED

187

1.1
Location : editReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:edit_works_correctly()]
negated conditional → KILLED

188

1.1
Location : editReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:edit_works_correctly()]
removed call to edu/ucsb/cs156/dining/entities/Review::setReviewerComments → KILLED

189

1.1
Location : editReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:edit_works_correctly()]
removed call to edu/ucsb/cs156/dining/entities/Review::setStatus → KILLED

191

1.1
Location : editReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:null_works_correctly()]
removed call to edu/ucsb/cs156/dining/entities/Review::setReviewerComments → KILLED

192

1.1
Location : editReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:trim_works_correctly()]
removed call to edu/ucsb/cs156/dining/entities/Review::setStatus → KILLED

195

1.1
Location : editReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:edit_works_correctly()]
removed call to edu/ucsb/cs156/dining/entities/Review::setDateItemServed → KILLED

197

1.1
Location : editReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:edit_works_correctly()]
removed call to edu/ucsb/cs156/dining/entities/Review::setModeratorComments → KILLED

201

1.1
Location : editReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:edit_works_correctly()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::editReview → KILLED

211

1.1
Location : lambda$deleteReview$3
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:nonexistent_cannot_delete()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$deleteReview$3 → KILLED

219

1.1
Location : deleteReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:wrong_user_cannot_delete()]
negated conditional → KILLED

2.2
Location : deleteReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:wrong_user_cannot_delete()]
negated conditional → KILLED

223

1.1
Location : deleteReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:user_can_delete()]
removed call to edu/ucsb/cs156/dining/repositories/ReviewRepository::delete → KILLED

224

1.1
Location : deleteReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:user_can_delete()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::deleteReview → KILLED

235

1.1
Location : lambda$moderateReview$4
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:admin_nonexistent_cannot_approve()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$moderateReview$4 → KILLED

237

1.1
Location : moderateReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:admin_can_moderate_a_review()]
removed call to edu/ucsb/cs156/dining/entities/Review::setModeratorComments → KILLED

238

1.1
Location : moderateReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:admin_can_moderate_a_review()]
removed call to edu/ucsb/cs156/dining/entities/Review::setStatus → KILLED

241

1.1
Location : moderateReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:admin_can_moderate_a_review()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::moderateReview → KILLED

249

1.1
Location : needsmoderation
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:admin_get_needs_moderation_returns_moderation_needed()]
replaced return value with Collections.emptyList for edu/ucsb/cs156/dining/controllers/ReviewController::needsmoderation → KILLED

260

1.1
Location : lambda$getReviewById$5
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:getReviewById_not_found_returns_404()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$getReviewById$5 → KILLED

266

1.1
Location : getReviewById
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:getReviewById_owner_can_view()]
negated conditional → KILLED

268

1.1
Location : lambda$getReviewById$6
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:getReviewById_non_owner_user_forbidden()]
replaced boolean return with true for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$getReviewById$6 → KILLED

2.2
Location : lambda$getReviewById$6
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:getReviewById_admin_can_view()]
replaced boolean return with false for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$getReviewById$6 → KILLED

271

1.1
Location : lambda$getReviewById$7
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:getReviewById_non_owner_user_forbidden()]
replaced boolean return with true for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$getReviewById$7 → KILLED

2.2
Location : lambda$getReviewById$7
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:getReviewById_moderator_can_view()]
replaced boolean return with false for edu/ucsb/cs156/dining/controllers/ReviewController::lambda$getReviewById$7 → KILLED

274

1.1
Location : getReviewById
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:getReviewById_owner_can_view()]
negated conditional → KILLED

2.2
Location : getReviewById
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:getReviewById_moderator_can_view()]
negated conditional → KILLED

3.3
Location : getReviewById
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:getReviewById_admin_can_view()]
negated conditional → KILLED

279

1.1
Location : getReviewById
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:getReviewById_owner_can_view()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::getReviewById → KILLED

Active mutators

Tests examined


Report generated by PIT 1.17.0