Support CommentAddedEvent and support the enabled config switch Change-Id: I9258ada0481aa42a5c7f7244855803fa9039088d (cherry picked from commit c929caafde4effeea904b0fb03e0b541182d46d8)
diff --git a/src/main/java/com/cisco/gerrit/plugins/slack/PublishEventListener.java b/src/main/java/com/cisco/gerrit/plugins/slack/PublishEventListener.java index 2c7dead..6dec3db 100644 --- a/src/main/java/com/cisco/gerrit/plugins/slack/PublishEventListener.java +++ b/src/main/java/com/cisco/gerrit/plugins/slack/PublishEventListener.java
@@ -25,6 +25,7 @@ import com.google.gerrit.extensions.annotations.Listen; import com.google.gerrit.server.config.PluginConfigFactory; import com.google.gerrit.server.events.ChangeMergedEvent; +import com.google.gerrit.server.events.CommentAddedEvent; import com.google.gerrit.server.events.Event; import com.google.gerrit.server.events.PatchSetCreatedEvent; import com.google.inject.Inject; @@ -77,6 +78,17 @@ messageGenerator = MessageGeneratorFactory.newInstance( changeMergedEvent, config); } + else if (event instanceof CommentAddedEvent) + { + CommentAddedEvent commentAddedEvent; + commentAddedEvent = (CommentAddedEvent) event; + + config = new ProjectConfig(configFactory, + commentAddedEvent.change.project); + + messageGenerator = MessageGeneratorFactory.newInstance( + commentAddedEvent, config); + } else { LOGGER.debug("Event " + event + " not currently supported");
diff --git a/src/main/java/com/cisco/gerrit/plugins/slack/message/ChangeMergedMessageGenerator.java b/src/main/java/com/cisco/gerrit/plugins/slack/message/ChangeMergedMessageGenerator.java index 4e0882f..bb6184a 100644 --- a/src/main/java/com/cisco/gerrit/plugins/slack/message/ChangeMergedMessageGenerator.java +++ b/src/main/java/com/cisco/gerrit/plugins/slack/message/ChangeMergedMessageGenerator.java
@@ -61,7 +61,7 @@ @Override public boolean shouldPublish() { - return true; + return config.isEnabled(); } @Override @@ -95,7 +95,7 @@ } catch (Exception e) { - LOGGER.error("Error generating message: " + e.getMessage()); + LOGGER.error("Error generating message: " + e.getMessage(), e); } return message;
diff --git a/src/main/java/com/cisco/gerrit/plugins/slack/message/CommentAddedMessageGenerator.java b/src/main/java/com/cisco/gerrit/plugins/slack/message/CommentAddedMessageGenerator.java new file mode 100644 index 0000000..6a477b9 --- /dev/null +++ b/src/main/java/com/cisco/gerrit/plugins/slack/message/CommentAddedMessageGenerator.java
@@ -0,0 +1,104 @@ +/* + * Copyright 2016 Cisco Systems, Inc. + * + * 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.cisco.gerrit.plugins.slack.message; + +import com.cisco.gerrit.plugins.slack.config.ProjectConfig; +import com.cisco.gerrit.plugins.slack.util.ResourceHelper; +import com.google.common.base.Ascii; +import com.google.gerrit.server.events.CommentAddedEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * A specific MessageGenerator implementation that can generate a message for + * a commend added event. + * + * @author Kenneth Pedersen + */ +public class CommentAddedMessageGenerator extends MessageGenerator +{ + /** + * The class logger instance. + */ + private static final Logger LOGGER = + LoggerFactory.getLogger(CommentAddedMessageGenerator.class); + + private ProjectConfig config; + private CommentAddedEvent event; + + /** + * Creates a new CommentAddedMessageGenerator instance using the provided + * CommentAddedEvent instance. + * + * @param event The CommentAddedEvent instance to generate a message for. + */ + protected CommentAddedMessageGenerator(CommentAddedEvent event, + ProjectConfig config) + { + if (event == null) + { + throw new NullPointerException("event cannot be null"); + } + + this.event = event; + this.config = config; + } + + @Override + public boolean shouldPublish() + { + return config.isEnabled(); + } + + @Override + public String generate() + { + String message; + message = ""; + + try + { + String template; + template = ResourceHelper.loadNamedResourceAsString( + "basic-message-template.json"); + + StringBuilder text; + text = new StringBuilder(); + + text.append(escape(event.author.name)); + text.append(" commented\\n>>>"); + text.append(escape(event.change.project)); + text.append(" ("); + text.append(escape(event.change.branch)); + text.append("): "); + text.append(escape(Ascii.truncate(event.comment, 200, "..."))); + text.append(" ("); + text.append(escape(event.change.url)); + text.append(")"); + + message = String.format(template, text, config.getChannel(), + config.getUsername()); + } + catch (Exception e) + { + LOGGER.error("Error generating message: " + e.getMessage(), e); + } + + return message; + } +}
diff --git a/src/main/java/com/cisco/gerrit/plugins/slack/message/MessageGeneratorFactory.java b/src/main/java/com/cisco/gerrit/plugins/slack/message/MessageGeneratorFactory.java index 1c168e6..a068c51 100644 --- a/src/main/java/com/cisco/gerrit/plugins/slack/message/MessageGeneratorFactory.java +++ b/src/main/java/com/cisco/gerrit/plugins/slack/message/MessageGeneratorFactory.java
@@ -19,6 +19,7 @@ import com.cisco.gerrit.plugins.slack.config.ProjectConfig; import com.google.gerrit.server.events.ChangeMergedEvent; +import com.google.gerrit.server.events.CommentAddedEvent; import com.google.gerrit.server.events.Event; import com.google.gerrit.server.events.PatchSetCreatedEvent; @@ -69,6 +70,25 @@ } /** + * Creates a new MessageGenerator for comment added events. + * + * @param event A CommendAddedEvent instance + * @param config A ProjectConfig instance for the given event + * + * @return A MessageGenerator instance capable of generating a message for + * a CommendAddedEvent. + */ + public static MessageGenerator newInstance(CommentAddedEvent event, + ProjectConfig config) + { + CommentAddedMessageGenerator messageGenerator; + messageGenerator = new CommentAddedMessageGenerator(event, config); + + return messageGenerator; + } + + + /** * Creates a new MessageGenerator for unsupported events. * * @param event An Event instance
diff --git a/src/main/java/com/cisco/gerrit/plugins/slack/message/PatchSetCreatedMessageGenerator.java b/src/main/java/com/cisco/gerrit/plugins/slack/message/PatchSetCreatedMessageGenerator.java index f10b7f9..774c622 100644 --- a/src/main/java/com/cisco/gerrit/plugins/slack/message/PatchSetCreatedMessageGenerator.java +++ b/src/main/java/com/cisco/gerrit/plugins/slack/message/PatchSetCreatedMessageGenerator.java
@@ -62,6 +62,8 @@ @Override public boolean shouldPublish() { + if(!config.isEnabled()) return false; + boolean result; result = true; @@ -115,7 +117,7 @@ } catch (Exception e) { - LOGGER.error("Error generating message: " + e.getMessage()); + LOGGER.error("Error generating message: " + e.getMessage(), e); } return message;
diff --git a/src/test/java/com/cisco/gerrit/plugins/slack/message/CommentAddedMessageGeneratorTest.java b/src/test/java/com/cisco/gerrit/plugins/slack/message/CommentAddedMessageGeneratorTest.java new file mode 100644 index 0000000..ce16c7f --- /dev/null +++ b/src/test/java/com/cisco/gerrit/plugins/slack/message/CommentAddedMessageGeneratorTest.java
@@ -0,0 +1,213 @@ +/* + * Copyright 2016 Cisco Systems, Inc. + * + * 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.cisco.gerrit.plugins.slack.message; + +import com.cisco.gerrit.plugins.slack.config.ProjectConfig; +import com.google.gerrit.reviewdb.client.Project; +import com.google.gerrit.server.config.PluginConfig; +import com.google.gerrit.server.config.PluginConfigFactory; +import com.google.gerrit.server.data.AccountAttribute; +import com.google.gerrit.server.data.ChangeAttribute; +import com.google.gerrit.server.events.CommentAddedEvent; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * Tests for the CommentAddedMessageGeneratorTest class. The expected behavior + * is that the CommentAddedMessageGeneratorTest should publish regardless of a + * configured ignore pattern. + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({Project.NameKey.class}) +public class CommentAddedMessageGeneratorTest +{ + private static final String PROJECT_NAME = "test-project"; + + private Project.NameKey mockNameKey = + mock(Project.NameKey.class); + + private PluginConfigFactory mockConfigFactory = + mock(PluginConfigFactory.class); + + private PluginConfig mockPluginConfig = + mock(PluginConfig.class); + + private CommentAddedEvent mockEvent = mock(CommentAddedEvent.class); + private AccountAttribute mockAccount = mock(AccountAttribute.class); + private ChangeAttribute mockChange = mock(ChangeAttribute.class); + + private ProjectConfig config; + + @Before + public void setup() throws Exception + { + PowerMockito.mockStatic(Project.NameKey.class); + when(Project.NameKey.parse(PROJECT_NAME)).thenReturn(mockNameKey); + + Project.NameKey projectNameKey; + projectNameKey = Project.NameKey.parse(PROJECT_NAME); + + // Setup mocks + when(mockConfigFactory.getFromProjectConfigWithInheritance( + projectNameKey, ProjectConfig.CONFIG_NAME)) + .thenReturn(mockPluginConfig); + + when(mockPluginConfig.getBoolean("enabled", false)) + .thenReturn(true); + when(mockPluginConfig.getString("webhookurl", "")) + .thenReturn("https://webook/"); + when(mockPluginConfig.getString("channel", "general")) + .thenReturn("testchannel"); + when(mockPluginConfig.getString("username", "gerrit")) + .thenReturn("testuser"); + when(mockPluginConfig.getString("ignore", "")) + .thenReturn("^WIP.*"); + + config = new ProjectConfig(mockConfigFactory, PROJECT_NAME); + } + + @Test + public void factoryCreatesExpectedType() throws Exception + { + MessageGenerator messageGenerator; + messageGenerator = MessageGeneratorFactory.newInstance( + mockEvent, config); + + assertThat(messageGenerator instanceof CommentAddedMessageGenerator, + is(true)); + } + + @Test + public void publishesWhenExpected() throws Exception + { + // Setup mocks + mockEvent.comment = "This is a title\nAnd a the body."; + + // Test + MessageGenerator messageGenerator; + messageGenerator = MessageGeneratorFactory.newInstance( + mockEvent, config); + + assertThat(messageGenerator.shouldPublish(), is(true)); + } + + @Test + public void doesNotPublishWhenExpected() throws Exception + { + // Setup mocks + mockEvent.comment = "WIP:This is a title\nAnd a the body."; + + // Test + MessageGenerator messageGenerator; + messageGenerator = MessageGeneratorFactory.newInstance( + mockEvent, config); + + assertThat(messageGenerator.shouldPublish(), is(true)); + } + + @Test + public void handlesInvalidIgnorePatterns() throws Exception + { + when(mockPluginConfig.getString("ignore", "")) + .thenReturn(null); + + // Test + MessageGenerator messageGenerator; + messageGenerator = MessageGeneratorFactory.newInstance( + mockEvent, config); + + assertThat(messageGenerator.shouldPublish(), is(true)); + } + + @Test + public void generatesExpectedMessage() throws Exception + { + // Setup mocks + mockEvent.change = mockChange; + mockEvent.author = mockAccount; + + mockEvent.comment = "This is the first line\nAnd the second line."; + + mockChange.project = "testproject"; + mockChange.branch = "master"; + mockChange.url = "https://change/"; + + mockAccount.name = "Unit Tester"; + + // Test + MessageGenerator messageGenerator; + messageGenerator = MessageGeneratorFactory.newInstance( + mockEvent, config); + + String expectedResult; + expectedResult = "{\"text\": \"Unit Tester commented\\n>>>" + + "testproject (master): This is the first line\n" + + "And the second line. (https://change/)\"," + + "\"channel\": \"#testchannel\",\"username\": \"testuser\"}\n"; + + String actualResult; + actualResult = messageGenerator.generate(); + + assertThat(actualResult, is(equalTo(expectedResult))); + } + + @Test + public void generatesExpectedMessageForLongComment() throws Exception + { + // Setup mocks + mockEvent.change = mockChange; + mockEvent.author = mockAccount; + + mockEvent.comment = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + + "Integer tristique ligula nec dapibus lobortis. Nulla venenatis, lacus quis vulputate volutpat, " + + "sem neque ornare eros, vel sodales magna risus et diam. Maecenas ultricies justo dictum orci " + + "scelerisque consequat a vel purus."; + + mockChange.project = "testproject"; + mockChange.branch = "master"; + mockChange.url = "https://change/"; + + mockAccount.name = "Unit Tester"; + + // Test + MessageGenerator messageGenerator; + messageGenerator = MessageGeneratorFactory.newInstance( + mockEvent, config); + + String expectedResult; + expectedResult = "{\"text\": \"Unit Tester commented\\n>>>" + + "testproject (master): " + mockEvent.comment.substring(0, 197) + "... (https://change/)\"," + + "\"channel\": \"#testchannel\",\"username\": \"testuser\"}\n"; + + String actualResult; + actualResult = messageGenerator.generate(); + + assertThat(actualResult, is(equalTo(expectedResult))); + } + +}