From 3de59c2d1a5e9b43e65d866e935221febc48e127 Mon Sep 17 00:00:00 2001 From: Roc Boronat Date: Sun, 21 Feb 2016 19:38:20 +0100 Subject: [PATCH 1/8] Adding JUnit to the project --- build.gradle | 4 ++++ 1 file changed, 4 insertions(+) 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 { From 052a684553ecad83f37461bcdff4c35e6baedf14 Mon Sep 17 00:00:00 2001 From: Roc Boronat Date: Sun, 21 Feb 2016 19:39:25 +0100 Subject: [PATCH 2/8] Extract IssueStoryLoader.getMilisFromDateClearDay() to a new class called DateParser --- .../issues/story/IssueStoryLoader.java | 66 +++++++++---------- .../gitskarios/core/util/DateParser.java | 18 +++++ .../gitskarios/core/util/DateParserTest.java | 13 ++++ 3 files changed, 61 insertions(+), 36 deletions(-) create mode 100644 src/main/java/com/alorma/gitskarios/core/util/DateParser.java create mode 100644 src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java 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..d5a509e7 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,6 +11,8 @@ 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; @@ -45,17 +47,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 +76,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().getMilisFromDateClearDay(githubComment.created_at); + IssueStoryComment detail = new IssueStoryComment(githubComment); + detail.created_at = time; + return detail; + })); } private Observable> getEventsObs() { @@ -100,34 +102,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().getMilisFromDateClearDay(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..c0d66973 --- /dev/null +++ b/src/main/java/com/alorma/gitskarios/core/util/DateParser.java @@ -0,0 +1,18 @@ +package com.alorma.gitskarios.core.util; + +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; + +public class DateParser { + + public static final String DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss'Z'"; + + public long getMilisFromDateClearDay(String createdAt) { + DateTimeFormatter formatter = DateTimeFormat.forPattern(DATE_PATTERN); + + DateTime dt = formatter.parseDateTime(createdAt); + + return dt.minuteOfDay().roundFloorCopy().getMillis(); + } +} 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..05557112 --- /dev/null +++ b/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java @@ -0,0 +1,13 @@ +package com.alorma.gitskarios.core.util; + +import org.junit.Test; + +public class DateParserTest { + + @Test(expected = NullPointerException.class) + public void testGetMilisFromDateClearDay() throws Exception { + DateParser dateParser = new DateParser(); + + long result = dateParser.getMilisFromDateClearDay(null); + } +} \ No newline at end of file From 884895e46e98ec81681bc31ed14e5bb67b7c10c4 Mon Sep 17 00:00:00 2001 From: Roc Boronat Date: Sun, 21 Feb 2016 19:50:50 +0100 Subject: [PATCH 3/8] Refactoring getMilisFromDateClearDay() to avoid using JodaTimeAndroid, that uses a Context --- .../gitskarios/core/util/DateParser.java | 24 ++++++++++++++----- .../gitskarios/core/util/DateParserTest.java | 19 +++++++++++++-- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/alorma/gitskarios/core/util/DateParser.java b/src/main/java/com/alorma/gitskarios/core/util/DateParser.java index c0d66973..a5b491d4 100644 --- a/src/main/java/com/alorma/gitskarios/core/util/DateParser.java +++ b/src/main/java/com/alorma/gitskarios/core/util/DateParser.java @@ -1,18 +1,30 @@ package com.alorma.gitskarios.core.util; -import org.joda.time.DateTime; -import org.joda.time.format.DateTimeFormat; -import org.joda.time.format.DateTimeFormatter; +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 getMilisFromDateClearDay(String createdAt) { - DateTimeFormatter formatter = DateTimeFormat.forPattern(DATE_PATTERN); + try { + SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN); + Date date = sdf.parse(createdAt); - DateTime dt = formatter.parseDateTime(createdAt); + GregorianCalendar calendar = new GregorianCalendar(); + calendar.setTime(date); - return dt.minuteOfDay().roundFloorCopy().getMillis(); + calendar.set(Calendar.YEAR, 1970); + calendar.set(Calendar.MONTH, 0); + calendar.set(Calendar.DAY_OF_MONTH, 1); + + return calendar.getTimeInMillis(); + } catch (Exception 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 index 05557112..7f4984d7 100644 --- a/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java +++ b/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java @@ -1,13 +1,28 @@ package com.alorma.gitskarios.core.util; +import net.danlew.android.joda.JodaTimeAndroid; + +import org.junit.Before; import org.junit.Test; +import static org.assertj.core.api.Assertions.assertThat; + public class DateParserTest { @Test(expected = NullPointerException.class) - public void testGetMilisFromDateClearDay() throws Exception { + public void shouldLaunchANPE_whenPassingNull() throws Exception { DateParser dateParser = new DateParser(); - long result = dateParser.getMilisFromDateClearDay(null); + dateParser.getMilisFromDateClearDay(null); + } + + @Test + public void shouldLaunchANPE_whenPassingBerniesValue() throws Exception { + DateParser dateParser = new DateParser(); + String gitHubDate = "2016-02-21T18:22:06Z"; + + long result = dateParser.getMilisFromDateClearDay(gitHubDate); + + assertThat(result).isEqualTo(62526000); } } \ No newline at end of file From 429034a7a5cc0ad8b1f38ec355f4670e9f4021d5 Mon Sep 17 00:00:00 2001 From: Roc Boronat Date: Sun, 21 Feb 2016 19:51:43 +0100 Subject: [PATCH 4/8] Moving the initialization of the DateParser to the @Before --- .../alorma/gitskarios/core/util/DateParserTest.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java b/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java index 7f4984d7..e3f7938f 100644 --- a/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java +++ b/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java @@ -9,16 +9,20 @@ 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 dateParser = new DateParser(); - dateParser.getMilisFromDateClearDay(null); } @Test public void shouldLaunchANPE_whenPassingBerniesValue() throws Exception { - DateParser dateParser = new DateParser(); String gitHubDate = "2016-02-21T18:22:06Z"; long result = dateParser.getMilisFromDateClearDay(gitHubDate); From 937747a70ba80e718955f6fae0637136b8dc97b2 Mon Sep 17 00:00:00 2001 From: Roc Boronat Date: Sun, 21 Feb 2016 19:53:49 +0100 Subject: [PATCH 5/8] Fixing test method name and var name --- .../com/alorma/gitskarios/core/util/DateParserTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java b/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java index e3f7938f..f3b1ef23 100644 --- a/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java +++ b/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java @@ -22,10 +22,10 @@ public void shouldLaunchANPE_whenPassingNull() throws Exception { } @Test - public void shouldLaunchANPE_whenPassingBerniesValue() throws Exception { - String gitHubDate = "2016-02-21T18:22:06Z"; + public void shouldGiveGoodValue_whenPassingBerniesValue() throws Exception { + String berniesDate = "2016-02-21T18:22:06Z"; - long result = dateParser.getMilisFromDateClearDay(gitHubDate); + long result = dateParser.getMilisFromDateClearDay(berniesDate); assertThat(result).isEqualTo(62526000); } From 05665cd4680bedfc05375510410cbb829f070b80 Mon Sep 17 00:00:00 2001 From: Roc Boronat Date: Sun, 21 Feb 2016 19:54:25 +0100 Subject: [PATCH 6/8] Fixing a typo: "milis" instead of "millis" --- .../sdk/services/issues/story/IssueStoryLoader.java | 8 +++----- .../java/com/alorma/gitskarios/core/util/DateParser.java | 2 +- .../com/alorma/gitskarios/core/util/DateParserTest.java | 6 ++---- 3 files changed, 6 insertions(+), 10 deletions(-) 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 d5a509e7..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 @@ -15,9 +15,7 @@ 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; @@ -90,7 +88,7 @@ protected void executePaginated(int nextPage) { private Observable getCommentsDetailsObs() { return getCommentsObs().flatMap(githubComments -> Observable.from(githubComments) .map((Func1) githubComment -> { - long time = new DateParser().getMilisFromDateClearDay(githubComment.created_at); + long time = new DateParser().getMillisFromDateClearDay(githubComment.created_at); IssueStoryComment detail = new IssueStoryComment(githubComment); detail.created_at = time; return detail; @@ -117,7 +115,7 @@ private Observable getEventDetailsObs() { return getEventsObs().flatMap(issueEvents -> Observable.from(issueEvents) .filter(issueEvent -> validEvent(issueEvent.event)) .map((Func1) issueEvent -> { - long time = new DateParser().getMilisFromDateClearDay(issueEvent.created_at); + long time = new DateParser().getMillisFromDateClearDay(issueEvent.created_at); IssueStoryEvent detail = new IssueStoryEvent(issueEvent); detail.created_at = time; return detail; diff --git a/src/main/java/com/alorma/gitskarios/core/util/DateParser.java b/src/main/java/com/alorma/gitskarios/core/util/DateParser.java index a5b491d4..3e058293 100644 --- a/src/main/java/com/alorma/gitskarios/core/util/DateParser.java +++ b/src/main/java/com/alorma/gitskarios/core/util/DateParser.java @@ -9,7 +9,7 @@ public class DateParser { public static final String DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss'Z'"; - public long getMilisFromDateClearDay(String createdAt) { + public long getMillisFromDateClearDay(String createdAt) { try { SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN); Date date = sdf.parse(createdAt); diff --git a/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java b/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java index f3b1ef23..be305685 100644 --- a/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java +++ b/src/test/java/com/alorma/gitskarios/core/util/DateParserTest.java @@ -1,7 +1,5 @@ package com.alorma.gitskarios.core.util; -import net.danlew.android.joda.JodaTimeAndroid; - import org.junit.Before; import org.junit.Test; @@ -18,14 +16,14 @@ public void init(){ @Test(expected = NullPointerException.class) public void shouldLaunchANPE_whenPassingNull() throws Exception { - dateParser.getMilisFromDateClearDay(null); + dateParser.getMillisFromDateClearDay(null); } @Test public void shouldGiveGoodValue_whenPassingBerniesValue() throws Exception { String berniesDate = "2016-02-21T18:22:06Z"; - long result = dateParser.getMilisFromDateClearDay(berniesDate); + long result = dateParser.getMillisFromDateClearDay(berniesDate); assertThat(result).isEqualTo(62526000); } From 8360efbe8cbbd9bbcea0bbef0ed5ef0eb4976274 Mon Sep 17 00:00:00 2001 From: Roc Boronat Date: Sun, 21 Feb 2016 19:59:27 +0100 Subject: [PATCH 7/8] Throwing NPE when recieving a null value --- .../java/com/alorma/gitskarios/core/util/DateParser.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/alorma/gitskarios/core/util/DateParser.java b/src/main/java/com/alorma/gitskarios/core/util/DateParser.java index 3e058293..0e83eeed 100644 --- a/src/main/java/com/alorma/gitskarios/core/util/DateParser.java +++ b/src/main/java/com/alorma/gitskarios/core/util/DateParser.java @@ -9,13 +9,14 @@ public class DateParser { public static final String DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss'Z'"; - public long getMillisFromDateClearDay(String createdAt) { + public long getMillisFromDateClearDay(String date) { + if (date==null){ + throw new NullPointerException("Date cannot be null :("); + } try { SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN); - Date date = sdf.parse(createdAt); - GregorianCalendar calendar = new GregorianCalendar(); - calendar.setTime(date); + calendar.setTime(sdf.parse(date)); calendar.set(Calendar.YEAR, 1970); calendar.set(Calendar.MONTH, 0); From 12c1bd9cf593666527a163534b98560ea34ee34e Mon Sep 17 00:00:00 2001 From: Roc Boronat Date: Sun, 21 Feb 2016 20:00:54 +0100 Subject: [PATCH 8/8] Catching ParseException instead of all Exceptions --- src/main/java/com/alorma/gitskarios/core/util/DateParser.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/alorma/gitskarios/core/util/DateParser.java b/src/main/java/com/alorma/gitskarios/core/util/DateParser.java index 0e83eeed..789826b7 100644 --- a/src/main/java/com/alorma/gitskarios/core/util/DateParser.java +++ b/src/main/java/com/alorma/gitskarios/core/util/DateParser.java @@ -1,5 +1,6 @@ package com.alorma.gitskarios.core.util; +import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; @@ -23,7 +24,7 @@ public long getMillisFromDateClearDay(String date) { calendar.set(Calendar.DAY_OF_MONTH, 1); return calendar.getTimeInMillis(); - } catch (Exception e) { + } catch (ParseException e) { //TODO please, remove this clause :D return 0; }