Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade to Spring Boot 2.0.1 & Polish #95

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 10 additions & 17 deletions jbot-example/src/main/java/example/jbot/facebook/FbBot.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,52 +4,45 @@
import me.ramswaroop.jbot.core.common.EventType;
import me.ramswaroop.jbot.core.common.JBot;
import me.ramswaroop.jbot.core.facebook.Bot;
import me.ramswaroop.jbot.core.facebook.FacebookProperties;
import me.ramswaroop.jbot.core.facebook.models.Attachment;
import me.ramswaroop.jbot.core.facebook.models.Button;
import me.ramswaroop.jbot.core.facebook.models.Element;
import me.ramswaroop.jbot.core.facebook.models.Event;
import me.ramswaroop.jbot.core.facebook.models.Message;
import me.ramswaroop.jbot.core.facebook.models.Payload;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.web.client.RestTemplate;

/**
* A simple Facebook Bot. You can create multiple bots by just
* extending {@link Bot} class like this one. Though it is
* recommended to create only bot per jbot instance.
*
*
* @author ramswaroop
* @version 17/09/2016
*/
@JBot
@Profile("facebook")
public class FbBot extends Bot {

/**
* Set this property in {@code application.properties}.
*/
@Value("${fbBotToken}")
private String fbToken;

/**
* Set this property in {@code application.properties}.
*/
@Value("${fbPageAccessToken}")
private String pageAccessToken;
FbBot(FacebookProperties facebookProperties, RestTemplate restTemplate) {
super(facebookProperties, restTemplate);
}

@Override
public String getFbToken() {
return fbToken;
return facebookProperties.getBotToken();
}

@Override
public String getPageAccessToken() {
return pageAccessToken;
return facebookProperties.getPageAccessToken();
}

/**
* Sets the "Get Started" button with a payload "hi". It also set the "Greeting Text" which the user sees when it
* opens up the chat window. Uncomment the {@code @PostConstruct} annotation only after you have verified your
* opens up the chat window. Uncomment the {@code @PostConstruct} annotation only after you have verified your
* webhook.
*/
//@PostConstruct
Expand Down Expand Up @@ -185,7 +178,7 @@ public void confirmTiming(Event event) {
public void askTimeForMeeting(Event event) {
if (event.getMessage().getText().contains("yes")) {
reply(event, "Okay. Would you like me to set a reminder for you?");
nextConversation(event); // jump to next question in conversation
nextConversation(event); // jump to next question in conversation
} else {
reply(event, "No problem. You can always schedule one with 'setup meeting' command.");
stopConversation(event); // stop conversation only if user says no
Expand Down
19 changes: 10 additions & 9 deletions jbot-example/src/main/java/example/jbot/slack/SlackBot.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@
import me.ramswaroop.jbot.core.common.EventType;
import me.ramswaroop.jbot.core.common.JBot;
import me.ramswaroop.jbot.core.slack.Bot;
import me.ramswaroop.jbot.core.slack.SlackProperties;
import me.ramswaroop.jbot.core.slack.SlackService;
import me.ramswaroop.jbot.core.slack.models.Event;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.web.socket.WebSocketSession;

Expand All @@ -27,12 +28,12 @@ public class SlackBot extends Bot {

private static final Logger logger = LoggerFactory.getLogger(SlackBot.class);

/**
* Slack token from application.properties file. You can get your slack token
* next <a href="https://my.slack.com/services/new/bot">creating a new bot</a>.
*/
@Value("${slackBotToken}")
private String slackToken;
private final String slackToken;

SlackBot(SlackService slackService, SlackProperties slackProperties) {
super(slackService);
this.slackToken = slackProperties.getSlackBotToken();
}

@Override
public String getSlackToken() {
Expand Down Expand Up @@ -139,7 +140,7 @@ public void confirmTiming(WebSocketSession session, Event event) {
public void askTimeForMeeting(WebSocketSession session, Event event) {
if (event.getText().contains("yes")) {
reply(session, event, "Okay. Would you like me to set a reminder for you?");
nextConversation(event); // jump to next question in conversation
nextConversation(event); // jump to next question in conversation
} else {
reply(session, event, "No problem. You can always schedule one with 'setup meeting' command.");
stopConversation(event); // stop conversation only if user says no
Expand All @@ -161,4 +162,4 @@ public void askWhetherToRepeat(WebSocketSession session, Event event) {
}
stopConversation(event); // stop conversation
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import me.ramswaroop.jbot.core.slack.SlackProperties;
import me.ramswaroop.jbot.core.slack.models.Attachment;
import me.ramswaroop.jbot.core.slack.models.RichMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
Expand All @@ -26,13 +27,11 @@ public class SlackSlashCommand {

private static final Logger logger = LoggerFactory.getLogger(SlackSlashCommand.class);

/**
* The token you get while creating a new Slash Command. You
* should paste the token in application.properties file.
*/
@Value("${slashCommandToken}")
private String slackToken;
private final SlackProperties slackProperties;

SlackSlashCommand(SlackProperties slackProperties) {
this.slackProperties = slackProperties;
}

/**
* Slash Command handler. When a user types for example "/app help"
Expand Down Expand Up @@ -65,7 +64,7 @@ public RichMessage onReceiveSlashCommand(@RequestParam("token") String token,
@RequestParam("text") String text,
@RequestParam("response_url") String responseUrl) {
// validate token
if (!token.equals(slackToken)) {
if (!token.equals(slackProperties.getSlashCommandToken())) {
return new RichMessage("Sorry! You're not lucky enough to use our slack command.");
}

Expand All @@ -77,7 +76,7 @@ public RichMessage onReceiveSlashCommand(@RequestParam("token") String token,
attachments[0] = new Attachment();
attachments[0].setText("I will perform all tasks for you.");
richMessage.setAttachments(attachments);

// For debugging purpose only
if (logger.isDebugEnabled()) {
try {
Expand All @@ -86,7 +85,7 @@ public RichMessage onReceiveSlashCommand(@RequestParam("token") String token,
logger.debug("Error parsing RichMessage: ", e);
}
}

return richMessage.encodedMessage(); // don't forget to send the encoded message to Slack
}
}
17 changes: 8 additions & 9 deletions jbot-example/src/main/java/example/jbot/slack/SlackWebhooks.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import me.ramswaroop.jbot.core.slack.SlackProperties;
import me.ramswaroop.jbot.core.slack.models.Attachment;
import me.ramswaroop.jbot.core.slack.models.RichMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClientException;
Expand All @@ -30,13 +31,11 @@ public class SlackWebhooks {

private static final Logger logger = LoggerFactory.getLogger(SlackWebhooks.class);

/**
* The Url you get while configuring a new incoming webhook
* on Slack. You can setup a new incoming webhook
* <a href="https://my.slack.com/services/new/incoming-webhook/">here</a>.
*/
@Value("${slackIncomingWebhookUrl}")
private String slackIncomingWebhookUrl;
private final SlackProperties slackProperties;

SlackWebhooks(SlackProperties slackProperties) {
this.slackProperties = slackProperties;
}

/**
* Make a POST call to the incoming webhook url.
Expand All @@ -60,7 +59,7 @@ public void invokeSlackWebhook() {

// Always remember to send the encoded message to Slack
try {
restTemplate.postForEntity(slackIncomingWebhookUrl, richMessage.encodedMessage(), String.class);
restTemplate.postForEntity(slackProperties.getSlackIncomingWebhookUrl(), richMessage.encodedMessage(), String.class);
} catch (RestClientException e) {
logger.error("Error posting to Slack Incoming Webhook: ", e);
}
Expand Down
18 changes: 9 additions & 9 deletions jbot-example/src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ logging.level.me.ramswaroop=DEBUG
server.port=8080

# slack integrations
rtmUrl=https://slack.com/api/rtm.start?token={token}&simple_latest&no_unreads
slackBotToken=<paste your slack bot token>
slashCommandToken=<paste your slash command token>
slackIncomingWebhookUrl=<paste your slack incoming webhook url>
jbot.slack.rtmUrl=https://slack.com/api/rtm.start?token={token}&simple_latest&no_unreads
jbot.slack.slackBotToken=<paste your slack bot token>
jbot.slack.slashCommandToken=<paste your slash command token>
jbot.slack.slackIncomingWebhookUrl=<paste your slack incoming webhook url>

# fb bot
fbSubscribeUrl=https://graph.facebook.com/v2.7/me/subscribed_apps
fbSendUrl=https://graph.facebook.com/v2.6/me/messages?access_token={PAGE_ACCESS_TOKEN}
fbMessengerProfileUrl=https://graph.facebook.com/v2.6/me/messenger_profile?access_token={PAGE_ACCESS_TOKEN}
fbBotToken=fb_token_for_jbot
fbPageAccessToken=<paste your page access token>
jbot.facebook.subscribeUrl=https://graph.facebook.com/v2.7/me/subscribed_apps
jbot.facebook.sendUrl=https://graph.facebook.com/v2.6/me/messages?access_token={PAGE_ACCESS_TOKEN}
jbot.facebook.messengerProfileUrl=https://graph.facebook.com/v2.6/me/messenger_profile?access_token={PAGE_ACCESS_TOKEN}
jbot.facebook.botToken=fb_token_for_jbot
jbot.facebook.pageAccessToken=<paste your page access token>
15 changes: 8 additions & 7 deletions jbot-example/src/test/java/example/jbot/facebook/FbBotTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,16 @@
import me.ramswaroop.jbot.core.common.Controller;
import me.ramswaroop.jbot.core.common.EventType;
import me.ramswaroop.jbot.core.facebook.Bot;
import me.ramswaroop.jbot.core.facebook.FacebookProperties;
import me.ramswaroop.jbot.core.facebook.models.Callback;
import me.ramswaroop.jbot.core.facebook.models.Event;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.boot.test.context.SpringBootTest;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.boot.test.rule.OutputCapture;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.web.client.RestTemplate;

import java.io.IOException;
Expand All @@ -26,8 +25,6 @@
* @author ramswaroop
* @version 11/03/2018
*/
@SpringBootTest
@ActiveProfiles("facebook")
@RunWith(MockitoJUnitRunner.class)
public class FbBotTest {

Expand All @@ -39,7 +36,7 @@ public class FbBotTest {

@Rule
public OutputCapture capture = new OutputCapture();

@Test
public void When_PostbackInCallback_Then_InvokeOnReceivePostback() throws IOException {
Callback callback = new ObjectMapper().readValue("{\"object\":\"page\",\"entry\":[{\"id\":" +
Expand Down Expand Up @@ -128,6 +125,10 @@ public void Given_InConversation_When_AnswerNoInCallback_Then_StopConversation()
* Facebook Bot for unit tests.
*/
public static class TestBot extends Bot {
public TestBot(FacebookProperties facebookProperties, RestTemplate restTemplate) {
super(facebookProperties, restTemplate);
}

@Override
public String getFbToken() {
return "fb_token";
Expand All @@ -142,7 +143,7 @@ public String getPageAccessToken() {
public void onReceivePostback(Event event) {
reply(event, "Postback with payload `hi|hello|hey` received from facebook.");
}

@Controller(events = EventType.QUICK_REPLY, pattern = "(yes|no)")
public void onReceiveQuickReply(Event event) {
if ("yes".equals(event.getMessage().getQuickReply().getPayload())) {
Expand Down
13 changes: 6 additions & 7 deletions jbot-example/src/test/java/example/jbot/slack/SlackBotTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,8 @@
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.boot.test.context.SpringBootTest;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.boot.test.rule.OutputCapture;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;

Expand All @@ -31,8 +29,6 @@
* @author ramswaroop
* @version 20/06/2016
*/
@SpringBootTest
@ActiveProfiles("slack")
@RunWith(MockitoJUnitRunner.class)
public class SlackBotTest {

Expand All @@ -57,7 +53,6 @@ public void init() {
// set rtm
when(slackService.getDmChannels()).thenReturn(Arrays.asList("D1E79BACV", "C0NDSV5B8"));
when(slackService.getCurrentUser()).thenReturn(user);
when(slackService.getWebSocketUrl()).thenReturn("");
}

@Test
Expand Down Expand Up @@ -201,6 +196,10 @@ public void Given_InConversation_When_AnswerNo_Then_StopConversation() {
*/
public static class TestBot extends Bot {

protected TestBot(SlackService slackService) {
super(slackService);
}

@Override
public String getSlackToken() {
return "slackToken";
Expand Down Expand Up @@ -277,4 +276,4 @@ public void askWhetherToRepeat(WebSocketSession session, Event event) {
stopConversation(event); // stop conversation
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

import me.ramswaroop.jbot.core.slack.SlackProperties;

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

Expand All @@ -25,6 +28,9 @@ public class SlackSlashCommandTest {
@Autowired
private MockMvc mvc;

@MockBean
private SlackProperties slackProperties;

@Test
public void onReceiveSlashCommand_When_IncorrectToken_Should_ReturnSorryRichMessage() throws Exception {
mvc.perform(MockMvcRequestBuilders.post("/slash-command?" +
Expand Down
Loading