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

Mutations

49

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_above_5_throws_exception()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::handleValidationExceptions → KILLED

68

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

84

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

88

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

119

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

122

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

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

123

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

127

1.1
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

2.2
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

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_above_5_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:test_rating_below_1_throws_exception()]
negated conditional → KILLED

131

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

136

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

138

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

139

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

142

1.1
Location : postReview
Killed by : edu.ucsb.cs156.dining.controllers.ReviewControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.ReviewControllerTests]/[method:test_no_string_on_creating_new_review()]
removed call to edu/ucsb/cs156/dining/entities/Review::setItem → 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_no_string_on_creating_new_review()]
removed call to edu/ucsb/cs156/dining/entities/Review::setReviewer → KILLED

147

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

162

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:a_logged_in_user_can_get_own_reviews_list()]
replaced return value with Collections.emptyList for edu/ucsb/cs156/dining/controllers/ReviewController::get_all_review_by_user_id → KILLED

181

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

183

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

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

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

187

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

198

1.1
Location : lambda$editReview$3
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$3 → KILLED

200

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

204

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

207

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::setItemsStars → KILLED

210

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

211

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()]
negated conditional → KILLED

212

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

213

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

215

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

216

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

219

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::setDateItemServed → KILLED

221

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

225

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()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/ReviewController::editReview → KILLED

235

1.1
Location : lambda$deleteReview$4
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$4 → KILLED

238

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

242

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

243

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

254

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

256

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

257

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

260

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

268

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

Active mutators

Tests examined


Report generated by PIT 1.17.0