| // Copyright (C) 2021 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package com.google.gerrit.server.notedb; |
| |
| import static com.google.common.truth.Truth.assertThat; |
| |
| import com.google.common.collect.ImmutableSet; |
| import com.google.errorprone.annotations.CanIgnoreReturnValue; |
| import com.google.gerrit.entities.Address; |
| import com.google.gerrit.entities.AttentionSetUpdate; |
| import com.google.gerrit.entities.Change; |
| import com.google.gerrit.entities.CommentRange; |
| import com.google.gerrit.entities.HumanComment; |
| import com.google.gerrit.server.IdentifiedUser; |
| import com.google.gerrit.server.util.time.TimeUtil; |
| import org.eclipse.jgit.revwalk.RevCommit; |
| import org.junit.Test; |
| |
| public class ChangeUpdateTest extends AbstractChangeNotesTest { |
| |
| @Test |
| public void bypassMaxUpdatesShouldBeTrueWhenChangingAttentionSetOnly() throws Exception { |
| Change c = newChange(); |
| ChangeUpdate update = newUpdate(c, changeOwner); |
| |
| addToAttentionSet(update); |
| update.commit(); |
| |
| assertThat(update.bypassMaxUpdates()).isTrue(); |
| } |
| |
| @Test |
| public void bypassMaxUpdatesShouldBeTrueWhenClosingChange() throws Exception { |
| Change c = newChange(); |
| ChangeUpdate update = newUpdate(c, changeOwner); |
| |
| update.setStatus(Change.Status.ABANDONED); |
| |
| update.commit(); |
| |
| assertThat(update.bypassMaxUpdates()).isTrue(); |
| } |
| |
| @Test |
| public void bypassMaxUpdatesShouldBeFalseWhenNotAbandoningChangeAndNotChangingAttentionSetOnly() |
| throws Exception { |
| Change c = newChange(); |
| ChangeUpdate update = newUpdate(c, changeOwner); |
| |
| update.commit(); |
| |
| assertThat(update.bypassMaxUpdates()).isFalse(); |
| } |
| |
| @Test |
| public void bypassMaxUpdatesShouldBeFalseWhenCommentsAndChangesToAttentionSetCoexist() |
| throws Exception { |
| Change c = newChange(); |
| ChangeUpdate update = newUpdate(c, changeOwner); |
| |
| addToAttentionSet(update); |
| // Add a comment |
| RevCommit commit = tr.commit().message("PS2").create(); |
| update.putComment( |
| HumanComment.Status.PUBLISHED, |
| newComment( |
| c.currentPatchSetId(), |
| "a.txt", |
| "uuid1", |
| new CommentRange(1, 2, 3, 4), |
| 1, |
| changeOwner, |
| null, |
| TimeUtil.now(), |
| "Comment", |
| (short) 1, |
| commit, |
| false)); |
| update.commit(); |
| |
| assertThat(update.bypassMaxUpdates()).isFalse(); |
| } |
| |
| @Test |
| public void bypassMaxUpdatesShouldBeFalseWhenReviewersAndChangesToAttentionSetCoexist() |
| throws Exception { |
| Change c = newChange(); |
| ChangeUpdate update = newUpdate(c, changeOwner); |
| |
| addToAttentionSet(update); |
| update.putReviewer(otherUserId, ReviewerStateInternal.REVIEWER); |
| update.commit(); |
| |
| assertThat(update.bypassMaxUpdates()).isFalse(); |
| } |
| |
| @Test |
| public void bypassMaxUpdatesShouldBeFalseWhenReviewersByEmailAndChangesToAttentionSetCoexist() |
| throws Exception { |
| Change c = newChange(); |
| ChangeUpdate update = newUpdate(c, changeOwner); |
| |
| addToAttentionSet(update); |
| update.putReviewerByEmail(Address.create("anyEmail@mail.com"), ReviewerStateInternal.REVIEWER); |
| update.commit(); |
| |
| assertThat(update.bypassMaxUpdates()).isFalse(); |
| } |
| |
| @Test |
| public void bypassMaxUpdatesShouldBeFalseWhenWIPAndChangesToAttentionSetCoexist() |
| throws Exception { |
| Change c = newChange(); |
| ChangeUpdate update = newUpdate(c, changeOwner); |
| |
| addToAttentionSet(update); |
| update.setWorkInProgress(true); |
| update.commit(); |
| |
| assertThat(update.bypassMaxUpdates()).isFalse(); |
| } |
| |
| @Test |
| public void bypassMaxUpdatesShouldBeFalseWhenNonWIPAndChangesToAttentionSetCoexist() |
| throws Exception { |
| Change c = newChange(); |
| ChangeUpdate update = newUpdate(c, changeOwner); |
| |
| addToAttentionSet(update); |
| update.setWorkInProgress(false); |
| update.commit(); |
| |
| assertThat(update.bypassMaxUpdates()).isFalse(); |
| } |
| |
| @Test |
| public void bypassMaxUpdatesShouldBeTrueWhenAbandoningAndChangesToAttentionSetCoexist() |
| throws Exception { |
| Change c = newChange(); |
| ChangeUpdate update = newUpdate(c, changeOwner); |
| |
| update.setStatus(Change.Status.ABANDONED); |
| addToAttentionSet(update); |
| update.commit(); |
| |
| assertThat(update.bypassMaxUpdates()).isTrue(); |
| } |
| |
| @Test |
| public void bypassMaxUpdatesShouldBeFalseWhenVotingAndChangesToAttentionSetCoexist() |
| throws Exception { |
| Change c = newChange(); |
| ChangeUpdate update = newUpdate(c, changeOwner); |
| |
| update.putApproval("Code-Review", (short) 1); |
| addToAttentionSet(update); |
| update.commit(); |
| |
| assertThat(update.bypassMaxUpdates()).isFalse(); |
| } |
| |
| @Test |
| public void bypassMaxUpdatesShouldBeFalseWhenDeletingVotesAndChangesToAttentionSetCoexist() |
| throws Exception { |
| Change c = newChange(); |
| ChangeUpdate updateWithVote = newUpdate(c, changeOwner); |
| updateWithVote.putApproval("Code-Review", (short) 1); |
| updateWithVote.commit(); |
| |
| updateWithVote.removeApproval("Code-Review"); |
| addToAttentionSet(updateWithVote); |
| |
| assertThat(updateWithVote.bypassMaxUpdates()).isFalse(); |
| } |
| |
| @Test |
| public void commitChangeUpdateWithoutTouchingAttentionSet() throws Exception { |
| Change c = newChangeWithEmptyAttentionSet(); |
| ChangeUpdate update = newUpdate(c, changeOwner); |
| update.putApproval("Code-Review", (short) 1); |
| update.commit(); |
| |
| assertThat(update.getAttentionSetUpdates()).isEmpty(); |
| } |
| |
| @Test |
| public void nonCommittedChangeUpdateReturnsEmptyAttentionSetUpdates() throws Exception { |
| Change c = newChangeWithEmptyAttentionSet(); |
| |
| ChangeUpdate update = newUpdate(c, changeOwner); |
| addToAttentionSet(update, otherUser); |
| |
| assertThat(update.getAttentionSetUpdates()).isEmpty(); |
| } |
| |
| @Test |
| public void committedChangeUpdateReturnsAttentionSetUpdates() throws Exception { |
| Change c = newChangeWithEmptyAttentionSet(); |
| ChangeUpdate update = newUpdate(c, changeOwner); |
| AttentionSetUpdate attentionSetUpdate = addToAttentionSet(update, otherUser); |
| update.commit(); |
| |
| assertThat(update.getAttentionSetUpdates()).containsExactly(attentionSetUpdate); |
| } |
| |
| @Test |
| public void committedChangeUpdateReturnsMultipleAttentionSetUpdates() throws Exception { |
| Change c = newChangeWithEmptyAttentionSet(); |
| ChangeUpdate update = newUpdate(c, changeOwner); |
| AttentionSetUpdate attentionSetUpdate1 = addToAttentionSet(update, otherUser); |
| AttentionSetUpdate attentionSetUpdate2 = addToAttentionSet(update, changeOwner); |
| update.commit(); |
| |
| assertThat(update.getAttentionSetUpdates()) |
| .containsExactly(attentionSetUpdate1, attentionSetUpdate2); |
| } |
| |
| @Test |
| public void changeUpdateDoesntReturnAttentionSetUpdateForUserAlreadyAddedInAttentionSet() |
| throws Exception { |
| Change c = newChangeWithEmptyAttentionSet(); |
| ChangeUpdate update1 = newUpdate(c, changeOwner); |
| addToAttentionSet(update1, otherUser); |
| update1.commit(); |
| |
| ChangeUpdate update2 = newUpdate(c, changeOwner); |
| addToAttentionSet(update2, otherUser); |
| update2.commit(); |
| |
| assertThat(update2.getAttentionSetUpdates()).isEmpty(); |
| } |
| |
| /** |
| * Creates a change with an empty attention set |
| * |
| * <p>Method ensures that changeOwner and otherUser can be added to the attention set later. (only |
| * users active on the change can be added to the attention set - see {@link |
| * ChangeUpdate#isActiveOnChange}) |
| */ |
| private Change newChangeWithEmptyAttentionSet() throws Exception { |
| Change c = newChange(); |
| ChangeUpdate update = newUpdate(c, changeOwner); |
| update.putReviewer(otherUser.getAccountId(), ReviewerStateInternal.CC); |
| update.commit(); |
| return c; |
| } |
| |
| @CanIgnoreReturnValue |
| private AttentionSetUpdate addToAttentionSet(ChangeUpdate update) { |
| return addToAttentionSet(update, otherUser); |
| } |
| |
| @CanIgnoreReturnValue |
| private AttentionSetUpdate addToAttentionSet(ChangeUpdate update, IdentifiedUser user) { |
| AttentionSetUpdate attentionSetUpdate = |
| AttentionSetUpdate.createForWrite( |
| user.getAccountId(), AttentionSetUpdate.Operation.ADD, "test"); |
| update.addToPlannedAttentionSetUpdates(ImmutableSet.of(attentionSetUpdate)); |
| return attentionSetUpdate; |
| } |
| } |