/* * Copyright 2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.springsource.greenhouse.events.load; import static org.junit.Assert.*; import static org.springframework.http.HttpMethod.*; import static org.springframework.http.MediaType.*; import static org.springframework.test.web.client.RequestMatchers.*; import java.util.Map; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.core.io.ClassPathResource; import org.springframework.jdbc.core.ColumnMapRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.test.web.client.ResponseCreators; import com.springsource.greenhouse.database.GreenhouseTestDatabaseBuilder; public class NFJSLoaderTest { private static final int SHOW_ID = 271; private EmbeddedDatabase db; private JdbcTemplate jdbcTemplate; private EventLoaderRepository eventLoaderRepository; private NFJSLoader loader; @Before public void setup() { db = new GreenhouseTestDatabaseBuilder() .member() .group() .activity() .invite() .venue() .event() .testData("com/springsource/greenhouse/events/load/JdbcEventLoaderRepositoryTest.sql").getDatabase(); jdbcTemplate = new JdbcTemplate(db); eventLoaderRepository = new JdbcEventLoaderRepository(jdbcTemplate); loader = new NFJSLoader(eventLoaderRepository); } @After public void tearDown() { jdbcTemplate.update("drop all objects"); } @Test public void loadOnce() { setupMockRestServiceServer(loader, 1); loader.loadEventData(SHOW_ID); assertRowCounts(1, 1, 85, 36, 112); assertEventData("SpringOne 2GX", "America/Chicago", "2011-10-25 00:00:00.0", "2011-10-28 23:59:59.0", "S2GX"); assertVenueData("Chicago Marriott Downtown Magnificent Mile", "540 North Michigan Avenue null Chicago, IL 60611", 41.8920052, -87.6247001, "Chicago, IL", 1L); assertLeaderData("Craig Walls", "Craig Walls is the Spring Social Project Lead.", "http://blog.springsource.com/author/cwalls/", "habuma"); assertEventTimeSlotData(16L, 1L, "DINNER", "2011-10-26 18:30:00.0", "2011-10-26 19:30:00.0"); } @Test public void loadOnceThenUpdateWithSameData() { setupMockRestServiceServer(loader, 3); loader.loadEventData(SHOW_ID); assertRowCounts(1, 1, 85, 36, 112); loader.loadEventData(SHOW_ID); assertRowCounts(1, 1, 85, 36, 112); assertEventData("SpringOne 2GX", "America/Chicago", "2011-10-25 00:00:00.0", "2011-10-28 23:59:59.0", "S2GX"); assertVenueData("Chicago Marriott Downtown Magnificent Mile", "540 North Michigan Avenue null Chicago, IL 60611", 41.8920052, -87.6247001, "Chicago, IL", 1L); assertLeaderData("Craig Walls", "Craig Walls is the Spring Social Project Lead.", "http://blog.springsource.com/author/cwalls/", "habuma"); assertEventTimeSlotData(16L, 1L, "DINNER", "2011-10-26 18:30:00.0", "2011-10-26 19:30:00.0"); } @Test public void loadOnceThenUpdateNewData() { setupMockRestServiceServerWithUpdates(loader); loader.loadEventData(SHOW_ID); assertRowCounts(1, 1, 85, 36, 112); assertEventData("SpringOne 2GX", "America/Chicago", "2011-10-25 00:00:00.0", "2011-10-28 23:59:59.0", "S2GX"); assertVenueData("Chicago Marriott Downtown Magnificent Mile", "540 North Michigan Avenue null Chicago, IL 60611", 41.8920052, -87.6247001, "Chicago, IL", 1L); assertLeaderData("Craig Walls", "Craig Walls is the Spring Social Project Lead.", "http://blog.springsource.com/author/cwalls/", "habuma"); assertEventTimeSlotData(16L, 1L, "DINNER", "2011-10-26 18:30:00.0", "2011-10-26 19:30:00.0"); loader.loadEventData(SHOW_ID); assertRowCounts(1, 1, 86, 37, 113); assertEventData("SpringOne/2GX", "America/Boise", "2012-06-09 00:00:00.0", "2012-06-12 23:59:59.0", "SGX"); assertVenueData("Pocatello Convention Center", "1234 South Arizona Drive null Pocatello, ID 83201", 41.8920052, -87.6247001, "Pocatello, ID", 1L); assertLeaderData("Mr. Craig Walls", "Craig Walls is the Spring Social Project Lead and an avid collector of American Way magazines.", "http://blog.springsource.com/author/craigwalls/", "habumadude"); assertEventTimeSlotData(16L, 1L, "SUPPER", "2012-06-10 18:30:00.0", "2012-06-10 19:30:00.0"); } private void assertRowCounts(int eventRows, int venueRows, int leaderRows, int timeSlotRows, int sessionRows) { assertRowCount("Event", eventRows); assertRowCount("ExternalEvent", eventRows); assertRowCount("Venue", venueRows); assertRowCount("Leader", leaderRows); assertRowCount("ExternalLeader", leaderRows); assertRowCount("EventTimeSlot", timeSlotRows); assertRowCount("ExternalEventTimeSlot", timeSlotRows); assertRowCount("EventSession", sessionRows); assertRowCount("ExternalEventSession", sessionRows); } private void assertRowCount(String tableName, int rowCount) { assertEquals(tableName, rowCount, jdbcTemplate.queryForInt("select count(*) from " + tableName)); } private void assertEventData(String title, String timeZone, String startTime, String endTime, String slug) { Map<String, Object> externalEventData = jdbcTemplate.queryForObject("select event, sourceId, source from ExternalEvent where sourceId=? and source='NFJS'", new ColumnMapRowMapper(), SHOW_ID); Long eventId = (Long) externalEventData.get("event"); assertEquals(Long.valueOf(1), eventId); assertEquals(Long.valueOf(SHOW_ID), externalEventData.get("sourceId")); assertEquals("NFJS", externalEventData.get("source")); Map<String, Object> eventData = jdbcTemplate.queryForObject("select id, title, timeZone, startTime, endTime, slug, description, memberGroup from Event where id=?", new ColumnMapRowMapper(), eventId); assertEquals(eventId, eventData.get("id")); assertEquals(title, eventData.get("title")); assertEquals(timeZone, eventData.get("timeZone")); assertEquals(startTime, eventData.get("startTime").toString()); assertEquals(endTime, eventData.get("endTime").toString()); assertEquals(slug, eventData.get("slug")); assertNull(eventData.get("description")); assertEquals(1L, eventData.get("memberGroup")); } private void assertVenueData(String name, String postalAddress, double latitude, double longitude, String locationHint, long createdBy) { Map<String, Object> eventVenueData = jdbcTemplate.queryForObject("select event, venue from EventVenue where event=?", new ColumnMapRowMapper(), 1); assertEquals(Long.valueOf(1), eventVenueData.get("event")); Long venueId = (Long) eventVenueData.get("venue"); assertEquals(Long.valueOf(1), venueId); Map<String, Object> venueData = jdbcTemplate.queryForObject("select id, name, postalAddress, latitude, longitude, locationHint, createdBy from Venue where id=?", new ColumnMapRowMapper(), venueId); assertEquals(Long.valueOf(1), venueData.get("id")); assertEquals(name, venueData.get("name")); assertEquals(postalAddress, venueData.get("postalAddress")); assertEquals(latitude, venueData.get("latitude")); assertEquals(longitude, venueData.get("longitude")); assertEquals(locationHint, venueData.get("locationHint")); assertEquals(createdBy, venueData.get("createdBy")); } private void assertLeaderData(String name, String bio, String personalUrl, String twitterUsername) { Map<String, Object> externalLeaderData = jdbcTemplate.queryForObject("select leader, sourceId, source from ExternalLeader where source='NFJS' and sourceId=?", new ColumnMapRowMapper(), 38); Long leaderId = (Long) externalLeaderData.get("leader"); assertEquals(Long.valueOf(15), leaderId); assertEquals(38L, externalLeaderData.get("sourceId")); assertEquals("NFJS", externalLeaderData.get("source")); Map<String, Object> leaderData = jdbcTemplate.queryForObject("select id, name, company, title, location, bio, personalUrl, companyUrl, twitterUsername, member from Leader where id=?", new ColumnMapRowMapper(), leaderId); assertEquals(leaderId, leaderData.get("id")); assertEquals(name, leaderData.get("name")); assertNull(leaderData.get("company")); assertNull(leaderData.get("title")); assertNull(leaderData.get("location")); assertEquals(bio, leaderData.get("bio").toString().trim()); assertEquals(personalUrl, leaderData.get("personalUrl")); assertNull(leaderData.get("companyUrl")); assertEquals(twitterUsername, leaderData.get("twitterUsername")); assertNull(leaderData.get("member")); // TODO: Might want to figure out how to associate this with GH member table } private void assertEventTimeSlotData(long id, long eventId, String label, String startTime, String endTime) { Map<String, Object> externalEventTimeSlotData = jdbcTemplate.queryForObject("select timeSlot, sourceId, source from ExternalEventTimeSlot where timeSlot=?", new ColumnMapRowMapper(), id); assertEquals(id, externalEventTimeSlotData.get("timeSlot")); assertEquals(6311L, externalEventTimeSlotData.get("sourceId")); assertEquals("NFJS", externalEventTimeSlotData.get("source")); Map<String, Object> eventTimeSlotData = jdbcTemplate.queryForObject("select id, event, label, startTime, endTime from EventTimeSlot where id=?", new ColumnMapRowMapper(), 16); assertEquals(id, eventTimeSlotData.get("id")); assertEquals(eventId, eventTimeSlotData.get("event")); assertEquals(label, eventTimeSlotData.get("label")); assertEquals(startTime, eventTimeSlotData.get("startTime").toString()); assertEquals(endTime, eventTimeSlotData.get("endTime").toString()); } private MockRestServiceServer setupMockRestServiceServer(NFJSLoader loader, int numberOfLoads) { MockRestServiceServer mockServer = MockRestServiceServer.createServer(loader.getRestTemplate()); for (int i=0; i < numberOfLoads; i++) { mockServer.expect( requestTo("https://springone2gx.com/m/data/show_short.json?showId=" + SHOW_ID)) .andExpect(method(GET)) .andRespond(ResponseCreators.withSuccess(new ClassPathResource("show_short.json", NFJSLoaderTest.class), APPLICATION_JSON)); mockServer.expect( requestTo("https://springone2gx.com/m/data/show_schedule.json?showId=" + SHOW_ID)) .andExpect(method(GET)) .andRespond(ResponseCreators.withSuccess(new ClassPathResource("show_schedule.json", NFJSLoaderTest.class), APPLICATION_JSON)); mockServer.expect( requestTo("https://springone2gx.com/m/data/show_speakers.json?showId=" + SHOW_ID)) .andExpect(method(GET)) .andRespond(ResponseCreators.withSuccess(new ClassPathResource("show_speakers.json", NFJSLoaderTest.class), APPLICATION_JSON)); mockServer.expect( requestTo("https://springone2gx.com/m/data/show_topics.json?showId=" + SHOW_ID)) .andExpect(method(GET)) .andRespond(ResponseCreators.withSuccess(new ClassPathResource("show_topics.json", NFJSLoaderTest.class), APPLICATION_JSON)); } return mockServer; } private void setupMockRestServiceServerWithUpdates(NFJSLoader loader) { MockRestServiceServer mockServer = setupMockRestServiceServer(loader, 1); // setup initial load mockServer.expect( requestTo("https://springone2gx.com/m/data/show_short.json?showId=" + SHOW_ID)) .andExpect(method(GET)) .andRespond(ResponseCreators.withSuccess(new ClassPathResource("show_short_updated.json", NFJSLoaderTest.class), APPLICATION_JSON)); mockServer.expect( requestTo("https://springone2gx.com/m/data/show_schedule.json?showId=" + SHOW_ID)) .andExpect(method(GET)) .andRespond(ResponseCreators.withSuccess(new ClassPathResource("show_schedule_updated.json", NFJSLoaderTest.class), APPLICATION_JSON)); mockServer.expect( requestTo("https://springone2gx.com/m/data/show_speakers.json?showId=" + SHOW_ID)) .andExpect(method(GET)) .andRespond(ResponseCreators.withSuccess(new ClassPathResource("show_speakers_updated.json", NFJSLoaderTest.class), APPLICATION_JSON)); mockServer.expect( requestTo("https://springone2gx.com/m/data/show_topics.json?showId=" + SHOW_ID)) .andExpect(method(GET)) .andRespond(ResponseCreators.withSuccess(new ClassPathResource("show_topics_updated.json", NFJSLoaderTest.class), APPLICATION_JSON)); } }