diff --git a/src/main/java/com/github/peggybrown/speechrank/InMemoryConferencesRepository.java b/src/main/java/com/github/peggybrown/speechrank/InMemoryConferencesRepository.java index 228ab8b..297919b 100644 --- a/src/main/java/com/github/peggybrown/speechrank/InMemoryConferencesRepository.java +++ b/src/main/java/com/github/peggybrown/speechrank/InMemoryConferencesRepository.java @@ -17,18 +17,17 @@ public class InMemoryConferencesRepository implements ConferencesRepository { private Importer importer; private List conferences; - private List years; + private static final List YEARS = initYears(); @Inject InMemoryConferencesRepository(Importer importer) { this.importer = importer; conferences = List.empty(); - initYears(); importAllConferences(); } @Override - public void add(Rate rate) { + public void add(Rate rate){ log.info("Rate added: " + rate.toString()); Presentation presentation = conferences .flatMap(Conference::getPresentations) @@ -37,7 +36,7 @@ public void add(Rate rate) { } @Override - public void add(Comment comment) { + public void add(Comment comment){ log.info("Comment added: " + comment.toString()); conferences .flatMap(Conference::getPresentations) @@ -46,31 +45,31 @@ public void add(Comment comment) { } - private void add(String year, Conference conf) { + private void add(String year, Conference conf){ log.info("Conference added: " + conf.toString()); conferences = conferences.append(conf); - years.filter(y -> y.getYear().equals(year)) + YEARS.filter(y -> y.getYear().equals(year)) .map(y -> y.addConference(conf)); } @Override - public java.util.List getConferences() { + public java.util.List getConferences(){ return conferences.toJavaList(); } @Override - public java.util.List getYears() { - return years.toJavaStream().map(YearDto::new).collect(Collectors.toList()); + public java.util.List getYears(){ + return YEARS.toJavaStream().map(YearDto::new).collect(Collectors.toList()); } @Override - public ConferenceDto getConference(String id) { + public ConferenceDto getConference(String id){ //TODO what to return whe conference not found? return new ConferenceDto(conferences.find(conf -> conf.getId().equals(id)).get()); } @Override - public void importAllConferences() { + public void importAllConferences(){ add("2017", new Conference("11", "DevConf", importer.importDevConf2017().map(Presentation::new))); add("2019", new Conference("12", "DevConf", importer.importDevConf2019().map(Presentation::new))); add("2018", new Conference("21", "Boiling Frogs", importer.importBoilingFrogs2018().map(Presentation::new))); @@ -80,12 +79,12 @@ public void importAllConferences() { add("2019", new Conference("51", "Confitura", importer.importConfitura2019().map(Presentation::new))); } - private void initYears() { - years = List.of(new Year("2019"), new Year("2018"), new Year("2017")); + private static List initYears(){ + return List.of(new Year("2019"), new Year("2018"), new Year("2017")); } @Override - public String importConference(ConferenceImportDto conf) { + public String importConference(ConferenceImportDto conf){ String id = UUID.randomUUID().toString(); Conference conference = new Conference(id, conf.getName(), importer.importFromYouTubePlaylist(conf.getPlaylistId()).map( Presentation::new)); diff --git a/src/main/java/com/github/peggybrown/speechrank/gateway/Importer.java b/src/main/java/com/github/peggybrown/speechrank/gateway/Importer.java index 9fcb690..19c2121 100644 --- a/src/main/java/com/github/peggybrown/speechrank/gateway/Importer.java +++ b/src/main/java/com/github/peggybrown/speechrank/gateway/Importer.java @@ -46,7 +46,7 @@ public Importer() { } - public javaslang.collection.List importFromYouTubePlaylist(String playlistId) { + public javaslang.collection.List importFromYouTubePlaylist(String playlistId){ javaslang.collection.List videos = javaslang.collection.List.empty(); try { // This object is used to make YouTube Data API requests. The last @@ -85,31 +85,31 @@ public javaslang.collection.List importFromYouTubePlaylist(String pla } - public javaslang.collection.List importConfitura2019() { + public javaslang.collection.List importConfitura2019(){ return importFromYouTubePlaylist("PLVbNBx5Phg3AwVti8rYNqx7965pgfMZWO"); } - public javaslang.collection.List importConfitura2018() { + public javaslang.collection.List importConfitura2018(){ return importFromYouTubePlaylist("PLVbNBx5Phg3DkJO00oMB2ETHFmG7RUujm"); } - public javaslang.collection.List importBoilingFrogs2019() { + public javaslang.collection.List importBoilingFrogs2019(){ return importFromYouTubePlaylist("PLVT0blg4rCWCUv3oEMQ12haQkMQ1drefo"); } - public javaslang.collection.List importBoilingFrogs2018() { + public javaslang.collection.List importBoilingFrogs2018(){ return importFromYouTubePlaylist("PLVT0blg4rCWCEPTY20ZrZeGNQUD_2khrE"); } - public javaslang.collection.List importScalar2019() { + public javaslang.collection.List importScalar2019(){ return importFromYouTubePlaylist("PL8NC5lCgGs6MYG0hR_ZOhQLvtoyThURka"); } - public javaslang.collection.List importDevConf2019() { + public javaslang.collection.List importDevConf2019(){ return importFromYouTubePlaylist("PL8BUDiR2Y8Ys3DHzQhws4BZng8DjvEwib"); } - public javaslang.collection.List importDevConf2017() { + public javaslang.collection.List importDevConf2017(){ return importFromYouTubePlaylist("PL8BUDiR2Y8Yu3SFzqhRWqDrF9OdejbeV0"); } diff --git a/src/test/java/com/github/peggybrown/speechrank/InMemoryConferencesRepositoryTest.java b/src/test/java/com/github/peggybrown/speechrank/InMemoryConferencesRepositoryTest.java new file mode 100644 index 0000000..7ecfb1e --- /dev/null +++ b/src/test/java/com/github/peggybrown/speechrank/InMemoryConferencesRepositoryTest.java @@ -0,0 +1,143 @@ +package com.github.peggybrown.speechrank; + +import com.github.peggybrown.speechrank.dto.ConferenceImportDto; +import com.github.peggybrown.speechrank.entity.Comment; +import com.github.peggybrown.speechrank.entity.Conference; +import com.github.peggybrown.speechrank.entity.Presentation; +import com.github.peggybrown.speechrank.entity.Rate; +import com.github.peggybrown.speechrank.gateway.Importer; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +public class InMemoryConferencesRepositoryTest { + private InMemoryConferencesRepository conferencesRepository; + private Importer importerMock; + + @Before + public void setUp() { + importerMock = mock(Importer.class); + when(importerMock.importDevConf2017()).thenReturn(javaslang.collection.List.empty()); + when(importerMock.importDevConf2019()).thenReturn(javaslang.collection.List.empty()); + when(importerMock.importBoilingFrogs2018()).thenReturn(javaslang.collection.List.empty()); + when(importerMock.importBoilingFrogs2019()).thenReturn(javaslang.collection.List.empty()); + when(importerMock.importScalar2019()).thenReturn(javaslang.collection.List.empty()); + when(importerMock.importConfitura2018()).thenReturn(javaslang.collection.List.empty()); + when(importerMock.importConfitura2019()).thenReturn(javaslang.collection.List.empty()); + when(importerMock.importFromYouTubePlaylist(any())).thenReturn(javaslang.collection.List.empty()); + conferencesRepository = new InMemoryConferencesRepository(importerMock); + } + + @Test + public void importAllConferencesShouldAddAnyConference() { + //when: + conferencesRepository.importAllConferences(); + List conferences = conferencesRepository.getConferences(); + + //then: + assertThat(conferences) + .isNotNull() + .isNotEmpty(); + } + + private ConferenceImportDto prepareConference() { + String conferenceName = "conference name"; + ConferenceImportDto conference = new ConferenceImportDto(); + conference.setYear("1990"); + conference.setName(conferenceName); + conference.setPlaylistId("https://www.test.com"); + return conference; + } + + @Test + public void addAndGetConference() { + //given: + ConferenceImportDto conference = prepareConference(); + + //when: + conferencesRepository.importConference(conference); + List conferences = conferencesRepository.getConferences(); + + //then: + assertThat(conferences) + .isNotNull() + .extracting(Conference::getName) + .contains(conference.getName()); + } + + @Test + public void addRateToPresentationTest() { + //given: + Importer.VideoData videoData = new Importer.VideoData("videoId", "videoTitle", "videoDescription"); + ConferenceImportDto conference = prepareConference(); + when(importerMock.importFromYouTubePlaylist(conference.getPlaylistId())) + .thenReturn(javaslang.collection.List.of(videoData)); + conferencesRepository = new InMemoryConferencesRepository(importerMock); + conferencesRepository.importConference(conference); + Presentation presentation = getPresentation(conference.getName(), videoData.getTitle()); + Rate rate = prepareRate(presentation); + + //when: + conferencesRepository.add(rate); + Presentation downloadedPresentation = getPresentation(conference.getName(), videoData.getTitle()); + + //then: + assertThat(downloadedPresentation.getRates()) + .isNotNull() + .contains(rate); + } + + private Rate prepareRate(Presentation presentation) { + Rate rate = new Rate(); + rate.setUserId("user id"); + rate.setRate(4); + rate.setPresentationId(presentation.getId()); + return rate; + } + + @Test + public void addCommentToPresentationTest() { + //given: + Importer.VideoData videoData = new Importer.VideoData("videoId", "videoTitle", "videoDescription"); + ConferenceImportDto conference = prepareConference(); + when(importerMock.importFromYouTubePlaylist(conference.getPlaylistId())) + .thenReturn(javaslang.collection.List.of(videoData)); + conferencesRepository = new InMemoryConferencesRepository(importerMock); + conferencesRepository.importConference(conference); + Presentation presentation = getPresentation(conference.getName(), videoData.getTitle()); + Comment comment = prepareComment(presentation); + + //when: + conferencesRepository.add(comment); + Presentation downloadedPresentation = getPresentation(conference.getName(), videoData.getTitle()); + + //then: + assertThat(downloadedPresentation.getComments()) + .extracting(Comment::getComment) + .contains(comment.getComment()); + } + + private Comment prepareComment(Presentation presentation) { + Comment comment = new Comment(); + comment.setComment("comment content"); + comment.setPresentationId(presentation.getId()); + comment.setUserId("user id"); + comment.setUsername("user name"); + return comment; + } + + private Presentation getPresentation(String conferenceName, String videoDataTitle) { + return conferencesRepository.getConferences() + .stream() + .filter(conf -> conferenceName.equals(conf.getName())) + .map(Conference::getPresentations) + .flatMap(javaslang.collection.List::toJavaStream) + .filter(prez -> videoDataTitle.equals(prez.getTitle())) + .findAny() + .get(); + } +}