diff --git a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java index 488f9f97ec..e4b8a9fe83 100644 --- a/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java +++ b/gerrit-acceptance-framework/src/test/java/com/google/gerrit/acceptance/AbstractDaemonTest.java @@ -256,6 +256,11 @@ public abstract class AbstractDaemonTest { @Rule public TemporaryFolder tempSiteDir = new TemporaryFolder(); + @Before + public void clearSender() { + sender.clear(); + } + @Before public void startEventRecorder() { eventRecorder = eventRecorderFactory.create(admin); diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ProjectWatchIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ProjectWatchIT.java index f33c22381b..c999c9c1a2 100644 --- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ProjectWatchIT.java +++ b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/project/ProjectWatchIT.java @@ -19,14 +19,20 @@ import static com.google.common.truth.Truth.assertThat; import com.google.gerrit.acceptance.AbstractDaemonTest; import com.google.gerrit.acceptance.NoHttpd; import com.google.gerrit.acceptance.PushOneCommit; +import com.google.gerrit.extensions.client.ProjectWatchInfo; +import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.reviewdb.client.AccountProjectWatch.NotifyType; +import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.git.NotifyConfig; import com.google.gerrit.server.git.ProjectConfig; import com.google.gerrit.server.mail.Address; import com.google.gerrit.testutil.FakeEmailSender.Message; +import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository; +import org.eclipse.jgit.junit.TestRepository; import org.junit.Test; +import java.util.ArrayList; import java.util.EnumSet; import java.util.List; @@ -69,5 +75,81 @@ public class ProjectWatchIT extends AbstractDaemonTest { assertThat(m.body()).contains("Gerrit-PatchSet: 2\n"); } - // TODO(anybody reading this): More tests. + @Test + public void watchProject() throws Exception { + // watch project + String watchedProject = createProject("watchedProject").get(); + setApiUser(user); + watch(watchedProject, null); + + // push a change to watched project -> should trigger email notification + setApiUser(admin); + TestRepository watchedRepo = + cloneProject(new Project.NameKey(watchedProject), admin); + PushOneCommit.Result r = pushFactory + .create(db, admin.getIdent(), watchedRepo, "TRIGGER", "a", "a1") + .to("refs/for/master"); + r.assertOkStatus(); + + // push a change to non-watched project -> should not trigger email + // notification + String notWatchedProject = createProject("otherProject").get(); + TestRepository notWatchedRepo = + cloneProject(new Project.NameKey(notWatchedProject), admin); + r = pushFactory.create(db, admin.getIdent(), notWatchedRepo, + "DONT_TRIGGER", "a", "a1").to("refs/for/master"); + r.assertOkStatus(); + + // assert email notification + List messages = sender.getMessages(); + assertThat(messages).hasSize(1); + Message m = messages.get(0); + assertThat(m.rcpt()).containsExactly(user.emailAddress); + assertThat(m.body()).contains("Change subject: TRIGGER\n"); + assertThat(m.body()).contains("Gerrit-PatchSet: 1\n"); + } + + @Test + public void watchFile() throws Exception { + // watch file in project + String watchedProject = createProject("watchedProject").get(); + setApiUser(user); + watch(watchedProject, "file:a.txt"); + + // push a change to watched file -> should trigger email notification + setApiUser(admin); + TestRepository watchedRepo = + cloneProject(new Project.NameKey(watchedProject), admin); + PushOneCommit.Result r = pushFactory + .create(db, admin.getIdent(), watchedRepo, "TRIGGER", "a.txt", "a1") + .to("refs/for/master"); + r.assertOkStatus(); + + // push a change to non-watched file -> should not trigger email + // notification + r = pushFactory.create(db, admin.getIdent(), testRepo, + "DONT_TRIGGER", "b.txt", "b1").to("refs/for/master"); + r.assertOkStatus(); + + // assert email notification + List messages = sender.getMessages(); + assertThat(messages).hasSize(1); + Message m = messages.get(0); + assertThat(m.rcpt()).containsExactly(user.emailAddress); + assertThat(m.body()).contains("Change subject: TRIGGER\n"); + assertThat(m.body()).contains("Gerrit-PatchSet: 1\n"); + } + + private void watch(String project, String filter) + throws RestApiException { + List projectsToWatch = new ArrayList<>(); + ProjectWatchInfo pwi = new ProjectWatchInfo(); + pwi.project = project; + pwi.filter = filter; + pwi.notifyAbandonedChanges = true; + pwi.notifyNewChanges = true; + pwi.notifyAllComments = true; + projectsToWatch.add(pwi); + gApi.accounts().self().setWatchedProjects(projectsToWatch); + } }