diff --git a/src/main/java/com/rultor/agents/twitter/Tweets.java b/src/main/java/com/rultor/agents/twitter/Tweets.java index 10904c080b..82a5cbbb1a 100644 --- a/src/main/java/com/rultor/agents/twitter/Tweets.java +++ b/src/main/java/com/rultor/agents/twitter/Tweets.java @@ -33,6 +33,7 @@ import com.jcabi.aspects.Tv; import com.jcabi.github.Github; import com.jcabi.github.Issue; +import com.jcabi.github.Language; import com.jcabi.github.Repo; import com.jcabi.log.Logger; import com.jcabi.xml.XML; @@ -107,6 +108,7 @@ public Iterable process(final XML xml) throws IOException { * @return Tweet text * @throws IOException If fails */ + @SuppressWarnings("PMD.InsufficientStringBufferDeclaration") private static String tweet(final Repo.Smart repo, final String tag) throws IOException { final StringBuilder text = new StringBuilder(2 * Tv.HUNDRED); @@ -120,10 +122,13 @@ private static String tweet(final Repo.Smart repo, final String tag) ) ); } - return text.append(", ").append(tag) + text.append(", ").append(tag) .append(" released https://github.com/") - .append(repo.coordinates()) - .toString(); + .append(repo.coordinates()); + for (final Language lang : repo.languages()) { + text.append(String.format(" #%s", lang)); + } + return text.toString(); } } diff --git a/src/test/java/com/rultor/agents/twitter/TweetsTest.java b/src/test/java/com/rultor/agents/twitter/TweetsTest.java index 3a649e720f..2e8c44ecdb 100644 --- a/src/test/java/com/rultor/agents/twitter/TweetsTest.java +++ b/src/test/java/com/rultor/agents/twitter/TweetsTest.java @@ -29,11 +29,21 @@ */ package com.rultor.agents.twitter; +import com.google.common.collect.Lists; +import com.jcabi.github.Coordinates; +import com.jcabi.github.Github; import com.jcabi.github.Issue; +import com.jcabi.github.Issues; +import com.jcabi.github.Language; import com.jcabi.github.Repo; +import com.jcabi.github.Repos; import com.jcabi.github.mock.MkGithub; import com.rultor.spi.Agent; import com.rultor.spi.Talk; +import java.io.IOException; +import java.util.List; +import javax.json.Json; +import javax.json.JsonObject; import org.junit.Ignore; import org.junit.Test; import org.mockito.Matchers; @@ -46,6 +56,10 @@ * @author Yegor Bugayenko (yegor@tpc2.com) * @version $Id$ * @since 1.30 + * @todo #561 When all the puzzles from + * https://github.com/jcabi/jcabi-github/issues/923 are implemented, remove + * repo, issue, lang methods, and use MkGithub family in all the tests. Also + * enable postsTweet method. */ public final class TweetsTest { @@ -60,6 +74,78 @@ public void postsTweet() throws Exception { final Issue issue = repo.issues().create("", ""); final Twitter twitter = Mockito.mock(Twitter.class); final Agent agent = new Tweets(repo.github(), twitter); + final Talk talk = this.talk(repo, issue); + agent.execute(talk); + Mockito.verify(twitter).post( + Matchers.contains("test") + ); + } + + /** + * Tweets can post a tweet with language tags. + * @throws Exception In case of error. + */ + @Test + public void postsTweetWithLanguages() throws Exception { + final Repo repo = this.repo(); + final List langs = Lists.newArrayList( + this.lang("Java"), this.lang("Python") + ); + Mockito.when(repo.languages()).thenReturn(langs); + final Twitter twitter = Mockito.mock(Twitter.class); + final Agent agent = new Tweets(repo.github(), twitter); + final Talk talk = this.talk(repo, this.issue(repo)); + agent.execute(talk); + Mockito.verify(twitter).post( + Matchers.contains( + String.format("#%s #%s", langs.get(0), langs.get(1)) + ) + ); + } + + /** + * Create mock issue. + * @param repo Repo to use + * @return Mocked issue. + */ + private Issue issue(final Repo repo) { + final Issues issues = Mockito.mock(Issues.class); + final Issue issue = Mockito.mock(Issue.class); + Mockito.when(issue.repo()).thenReturn(repo); + Mockito.when(issues.get(Mockito.anyInt())).thenReturn(issue); + Mockito.when(repo.issues()).thenReturn(issues); + return issue; + } + + /** + * Create mock repo. + * @return Mocked repo + * @throws IOException In case of error + */ + private Repo repo() throws IOException { + final Github github = Mockito.mock(Github.class); + final Repo repo = Mockito.mock(Repo.class); + final JsonObject rjson = Json.createObjectBuilder() + .add("description", "something").build(); + Mockito.when(repo.json()).thenReturn(rjson); + Mockito.when(repo.github()).thenReturn(github); + final Repos repos = Mockito.mock(Repos.class); + Mockito.when(github.repos()).thenReturn(repos); + final Coordinates coords = new Coordinates.Simple("foo/bar"); + Mockito.when(repo.coordinates()).thenReturn(coords); + Mockito.when(repos.get(Mockito.any(Coordinates.class))) + .thenReturn(repo); + return repo; + } + + /** + * Creates a talk with repo and issue. + * @param repo Repo to use + * @param issue Issue to use + * @return Created Talk + * @throws IOException In case of error + */ + private Talk talk(final Repo repo, final Issue issue) throws IOException { final Talk talk = new Talk.InFile(); talk.modify( new Directives().xpath("/talk").add("wire") @@ -73,10 +159,24 @@ public void postsTweet() throws Exception { .add("type").set("release").up() .add("args").add("arg").attr("name", "tag").set("1.7") ); - agent.execute(talk); - Mockito.verify(twitter).post( - Matchers.contains("test") - ); + return talk; } + /** + * Create mock language. + * @param name Name of the language + * @return Language created. + */ + private Language lang(final String name) { + return new Language() { + @Override + public String name() { + return name; + } + @Override + public long bytes() { + return 0; + } + }; + } }