diff --git a/build.gradle b/build.gradle index 10ce9ea0..6e2f5b73 100644 --- a/build.gradle +++ b/build.gradle @@ -54,6 +54,10 @@ dependencies { compile 'io.reactivex:rxjava:1.0.16' compile 'net.danlew:android.joda:2.8.2' + + testCompile 'junit:junit:4.12' + testCompile 'org.assertj:assertj-core:1.7.0' + testCompile "org.mockito:mockito-core:1.+" } publish { diff --git a/src/main/java/com/alorma/github/sdk/services/issues/story/IssueStoryLoader.java b/src/main/java/com/alorma/github/sdk/services/issues/story/IssueStoryLoader.java index 402896a1..629e764b 100644 --- a/src/main/java/com/alorma/github/sdk/services/issues/story/IssueStoryLoader.java +++ b/src/main/java/com/alorma/github/sdk/services/issues/story/IssueStoryLoader.java @@ -11,11 +11,11 @@ import com.alorma.github.sdk.bean.issue.IssueStoryEvent; import com.alorma.github.sdk.services.client.BaseInfiniteCallback; import com.alorma.github.sdk.services.client.GithubClient; +import com.alorma.gitskarios.core.util.DateParser; + import java.util.Collections; import java.util.List; -import org.joda.time.DateTime; -import org.joda.time.format.DateTimeFormat; -import org.joda.time.format.DateTimeFormatter; + import retrofit.RestAdapter; import rx.Observable; import rx.functions.Func1; @@ -45,17 +45,17 @@ protected Observable getApiObservable(RestAdapter restAdapter) { private Observable getIssueStory() { return Observable.zip(getIssueObservable(), getIssueDetailsObservable(), - new Func2, IssueStory>() { - @Override - public IssueStory call(Issue issue, List details) { - IssueStory issueStory = new IssueStory(); - issueStory.issue = issue; - issueStory.details = details; - Collections.sort(issueStory.details, - IssueStoryComparators.ISSUE_STORY_DETAIL_COMPARATOR); - return issueStory; - } - }); + new Func2, IssueStory>() { + @Override + public IssueStory call(Issue issue, List details) { + IssueStory issueStory = new IssueStory(); + issueStory.issue = issue; + issueStory.details = details; + Collections.sort(issueStory.details, + IssueStoryComparators.ISSUE_STORY_DETAIL_COMPARATOR); + return issueStory; + } + }); } private Observable getIssueObservable() { @@ -74,25 +74,25 @@ private Observable> getCommentsObs() { @Override public void execute() { issueStoryService.comments(issueInfo.repoInfo.owner, issueInfo.repoInfo.name, issueInfo.num, - this); + this); } @Override protected void executePaginated(int nextPage) { issueStoryService.comments(issueInfo.repoInfo.owner, issueInfo.repoInfo.name, issueInfo.num, - this); + this); } }); } private Observable getCommentsDetailsObs() { return getCommentsObs().flatMap(githubComments -> Observable.from(githubComments) - .map((Func1) githubComment -> { - long time = getMilisFromDateClearDay(githubComment.created_at); - IssueStoryComment detail = new IssueStoryComment(githubComment); - detail.created_at = time; - return detail; - })); + .map((Func1) githubComment -> { + long time = new DateParser().getMillisFromDateClearDay(githubComment.created_at); + IssueStoryComment detail = new IssueStoryComment(githubComment); + detail.created_at = time; + return detail; + })); } private Observable> getEventsObs() { @@ -100,34 +100,26 @@ private Observable> getEventsObs() { @Override public void execute() { issueStoryService.events(issueInfo.repoInfo.owner, issueInfo.repoInfo.name, issueInfo.num, - this); + this); } @Override protected void executePaginated(int nextPage) { issueStoryService.events(issueInfo.repoInfo.owner, issueInfo.repoInfo.name, issueInfo.num, - nextPage, this); + nextPage, this); } }); } private Observable getEventDetailsObs() { return getEventsObs().flatMap(issueEvents -> Observable.from(issueEvents) - .filter(issueEvent -> validEvent(issueEvent.event)) - .map((Func1) issueEvent -> { - long time = getMilisFromDateClearDay(issueEvent.created_at); - IssueStoryEvent detail = new IssueStoryEvent(issueEvent); - detail.created_at = time; - return detail; - })); - } - - private long getMilisFromDateClearDay(String createdAt) { - DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'"); - - DateTime dt = formatter.parseDateTime(createdAt); - - return dt.minuteOfDay().roundFloorCopy().getMillis(); + .filter(issueEvent -> validEvent(issueEvent.event)) + .map((Func1) issueEvent -> { + long time = new DateParser().getMillisFromDateClearDay(issueEvent.created_at); + IssueStoryEvent detail = new IssueStoryEvent(issueEvent); + detail.created_at = time; + return detail; + })); } private boolean validEvent(String event) { diff --git a/src/main/java/com/alorma/gitskarios/core/util/DateParser.java b/src/main/java/com/alorma/gitskarios/core/util/DateParser.java new file mode 100644 index 00000000..789826b7 --- /dev/null +++ b/src/main/java/com/alorma/gitskarios/core/util/DateParser.java @@ -0,0 +1,32 @@ +package com.alorma.gitskarios.core.util; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +public class DateParser { + + public static final String DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss'Z'"; + + public long getMillisFromDateClearDay(String date) { + if (date==null){ + throw new NullPointerException("Date cannot be null :("); + } + try { + SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN); + GregorianCalendar calendar = new GregorianCalendar(); + calendar.setTime(sdf.parse(date)); + + calendar.set(Calendar.YEAR, 1970); + calendar.set(Calendar.MONTH, 0); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + return calendar.getTimeInMillis(); + } catch (ParseException e) { + //TODO please, remove this clause :D + return 0; + } + } +} diff --git a/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java b/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java new file mode 100644 index 00000000..be305685 --- /dev/null +++ b/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java @@ -0,0 +1,30 @@ +package com.alorma.gitskarios.core.util; + +import org.junit.Before; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DateParserTest { + + DateParser dateParser = new DateParser(); + + @Before + public void init(){ + dateParser = new DateParser(); + } + + @Test(expected = NullPointerException.class) + public void shouldLaunchANPE_whenPassingNull() throws Exception { + dateParser.getMillisFromDateClearDay(null); + } + + @Test + public void shouldGiveGoodValue_whenPassingBerniesValue() throws Exception { + String berniesDate = "2016-02-21T18:22:06Z"; + + long result = dateParser.getMillisFromDateClearDay(berniesDate); + + assertThat(result).isEqualTo(62526000); + } +} \ No newline at end of file