/* * Copyright IBM Corp. 2014 * * 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 net.bluemix.todo.store; import static org.easymock.EasyMock.capture; import static org.easymock.EasyMock.createControl; import static org.easymock.EasyMock.eq; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.isA; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.ws.rs.client.Entity; import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Response; import net.bluemix.todo.model.CloudantAllDocs; import net.bluemix.todo.model.CloudantCount; import net.bluemix.todo.model.CloudantPostResponse; import net.bluemix.todo.model.CloudantReducedRow; import net.bluemix.todo.model.CloudantRow; import net.bluemix.todo.model.CloudantToDo; import net.bluemix.todo.model.ToDo; import org.easymock.Capture; import org.easymock.IMocksControl; import org.glassfish.jersey.filter.LoggingFilter; import org.junit.After; import org.junit.Before; import org.junit.Test; public class CloudantStoreTest { private CloudantAllDocs docs; private List<CloudantRow> rows; private CloudantRow row1; private CloudantRow row2; private CloudantRow row3; private CloudantToDo ctd1; private CloudantToDo ctd2; private CloudantToDo ctd3; private CloudantCount count; private List<CloudantReducedRow> reducedRows; private CloudantReducedRow reducedRow; private WebTarget createMockWebTarget() { IMocksControl control = createControl(); WebTarget wt = control.createMock(WebTarget.class); expect(wt.register(isA(LoggingFilter.class))).andReturn(wt).anyTimes(); return wt; } private Invocation.Builder createBuilder() { IMocksControl control = createControl(); return control.createMock(Invocation.Builder.class); } @Before public void setUp() throws Exception { docs = new CloudantAllDocs(); rows = new ArrayList<CloudantRow>(); ctd1 = new CloudantToDo(); count = new CloudantCount(); reducedRows = new ArrayList<CloudantReducedRow>(); reducedRow = new CloudantReducedRow(); reducedRow.setValue(123); reducedRows.add(reducedRow); count.setRows(reducedRows); ctd1.setTitle("title1"); ctd1.set_id("123"); ctd1.set_rev("abc"); ctd2 = new CloudantToDo(); ctd2.setTitle("title2"); ctd2.set_id("456"); ctd2.set_rev("def"); ctd3 = new CloudantToDo(); ctd3.setTitle("title3"); ctd3.set_id("789"); ctd3.set_rev("ghi"); row1 = new CloudantRow(); row1.setId(ctd1.get_id()); row1.setValue(ctd1.getToDo()); row2 = new CloudantRow(); row2.setId(ctd2.get_id()); row2.setValue(ctd2.getToDo()); row3 = new CloudantRow(); row3.setId(ctd3.get_id()); row3.setValue(ctd3.getToDo()); rows.add(row1); rows.add(row2); rows.add(row3); docs.setRows(rows); } @After public void tearDown() throws Exception { rows = null; row1 = null; row2 = null; row3 = null; ctd1 = null; ctd2 = null; ctd3 = null; docs = null; count = null; reducedRow = null; reducedRows = null; } @Test public void testGetAll() throws Exception { IMocksControl control = createControl(); Response resp = control.createMock(Response.class); expect(resp.getStatus()).andReturn(200).times(3); Capture<Class<CloudantAllDocs>> classCapture = new Capture<Class<CloudantAllDocs>>(); expect(resp.readEntity(capture(classCapture))).andReturn(docs); replay(resp); WebTarget wt = createMockWebTarget(); Invocation.Builder builder = createBuilder(); expect(builder.get()).andReturn(resp).times(3); replay(builder); expect(wt.path(eq("bluemix-todo"))).andReturn(wt).times(2); expect(wt.path(eq("todos"))).andReturn(wt).times(2); expect(wt.path(eq("_design"))).andReturn(wt).times(2); expect(wt.path(eq("_view"))).andReturn(wt); expect(wt.path(eq("allTodos"))).andReturn(wt); expect(wt.queryParam(eq("reduce"), eq(false))).andReturn(wt); //expect(wt.queryParam(eq("include_docs"), eq(true))).andReturn(wt); expect(wt.request(eq("application/json"))).andReturn(builder).anyTimes(); replay(wt); CloudantStore store = new CloudantStore(wt); Collection<ToDo> todos = store.getAll(); List<ToDo> testToDos = new ArrayList<ToDo>(); testToDos.add(ctd1.getToDo()); testToDos.add(ctd2.getToDo()); testToDos.add(ctd3.getToDo()); assertEquals(testToDos, todos); assertEquals(CloudantAllDocs.class, classCapture.getValue()); verify(resp); verify(wt); verify(builder); } @Test public void testGet() throws Exception { IMocksControl control = createControl(); Response resp = control.createMock(Response.class); expect(resp.getStatus()).andReturn(200).times(3); Capture<Class<CloudantToDo>> classCapture = new Capture<Class<CloudantToDo>>(); expect(resp.readEntity(capture(classCapture))).andReturn(ctd1); replay(resp); WebTarget wt = createMockWebTarget(); Invocation.Builder builder = createBuilder(); expect(builder.get()).andReturn(resp).times(3); replay(builder); expect(wt.path(eq("bluemix-todo"))).andReturn(wt).times(2); expect(wt.path(eq("todos"))).andReturn(wt); expect(wt.path(eq("_design"))).andReturn(wt).times(1); expect(wt.path(eq("123"))).andReturn(wt); expect(wt.request(eq("application/json"))).andReturn(builder).anyTimes(); replay(wt); CloudantStore store = new CloudantStore(wt); assertEquals(ctd1.getToDo(), store.get("123")); assertEquals(CloudantToDo.class, classCapture.getValue()); verify(resp); verify(wt); verify(builder); } @Test public void testPersist() throws Exception { IMocksControl control = createControl(); Response resp = control.createMock(Response.class); expect(resp.getStatus()).andReturn(200).times(2); expect(resp.getStatus()).andReturn(201); CloudantPostResponse postResp = new CloudantPostResponse(); postResp.setId("123"); postResp.setOk(true); postResp.setRev("abc"); Capture<Class<CloudantPostResponse>> classCapture = new Capture<Class<CloudantPostResponse>>(); expect(resp.readEntity(capture(classCapture))).andReturn(postResp); replay(resp); WebTarget wt = createMockWebTarget(); Invocation.Builder builder = createBuilder(); ToDo td = new ToDo(); td.setTitle("this is a test"); expect(builder.post(isA(Entity.class))).andReturn(resp); expect(builder.get()).andReturn(resp).times(2); replay(builder); expect(wt.path(eq("bluemix-todo"))).andReturn(wt).times(2); expect(wt.path(eq("todos"))).andReturn(wt); expect(wt.path(eq("_design"))).andReturn(wt).times(1); expect(wt.request(eq("application/json"))).andReturn(builder).anyTimes(); replay(wt); CloudantStore store = new CloudantStore(wt); ToDo testTd = new ToDo(); testTd.setTitle("this is a test"); testTd.setId("123"); assertEquals(testTd, store.persist(td)); assertEquals(CloudantPostResponse.class, classCapture.getValue()); verify(resp); verify(wt); verify(builder); } @Test public void testUpdate() throws Exception { IMocksControl control = createControl(); Response resp = control.createMock(Response.class); expect(resp.getStatus()).andReturn(200).times(3); expect(resp.getStatus()).andReturn(201); Capture<Class<CloudantToDo>> classToDoCapture = new Capture<Class<CloudantToDo>>(); expect(resp.readEntity(capture(classToDoCapture))).andReturn(ctd1); CloudantPostResponse postResp = new CloudantPostResponse(); postResp.setId("123"); postResp.setOk(true); postResp.setRev("def"); Capture<Class<CloudantPostResponse>> classCapture = new Capture<Class<CloudantPostResponse>>(); expect(resp.readEntity(capture(classCapture))).andReturn(postResp); replay(resp); WebTarget wt = createMockWebTarget(); Invocation.Builder builder = createBuilder(); ToDo td = new ToDo(); td.setTitle("new text"); td.setId("123"); expect(builder.put(isA(Entity.class))).andReturn(resp); expect(builder.get()).andReturn(resp).times(3); replay(builder); expect(wt.path(eq("bluemix-todo"))).andReturn(wt).times(2); expect(wt.path(eq("todos"))).andReturn(wt); expect(wt.path(eq("_design"))).andReturn(wt).times(1); expect(wt.queryParam(eq("rev"), eq("abc"))).andReturn(wt); expect(wt.path(eq("123"))).andReturn(wt).times(2); expect(wt.request(eq("application/json"))).andReturn(builder).anyTimes(); replay(wt); CloudantStore store = new CloudantStore(wt); ToDo testTd = new ToDo(); testTd.setTitle("new text"); testTd.setId("123"); assertEquals(testTd, store.update("123", td)); assertEquals(CloudantPostResponse.class, classCapture.getValue()); assertEquals(CloudantToDo.class, classToDoCapture.getValue()); verify(resp); verify(wt); verify(builder); } @Test public void testDelete() throws Exception { IMocksControl control = createControl(); Response resp = control.createMock(Response.class); expect(resp.getStatus()).andReturn(200).times(4); Capture<Class<CloudantToDo>> classCapture = new Capture<Class<CloudantToDo>>(); expect(resp.readEntity(capture(classCapture))).andReturn(ctd1); replay(resp); WebTarget wt = createMockWebTarget(); Invocation.Builder builder = createBuilder(); expect(builder.get()).andReturn(resp).times(3); expect(builder.delete()).andReturn(resp); replay(builder); expect(wt.path(eq("bluemix-todo"))).andReturn(wt).times(2); expect(wt.path(eq("todos"))).andReturn(wt); expect(wt.path(eq("_design"))).andReturn(wt).times(1); expect(wt.queryParam(eq("rev"), eq("abc"))).andReturn(wt); expect(wt.path(eq("123"))).andReturn(wt).times(2); expect(wt.request(eq("application/json"))).andReturn(builder).times(4); replay(wt); CloudantStore store = new CloudantStore(wt); store.delete("123"); assertEquals(CloudantToDo.class, classCapture.getValue()); verify(resp); verify(wt); verify(builder); } @Test public void testCount() throws Exception { IMocksControl control = createControl(); Response resp = control.createMock(Response.class); expect(resp.getStatus()).andReturn(200).times(3); Capture<Class<CloudantCount>> classCapture = new Capture<Class<CloudantCount>>(); expect(resp.readEntity(capture(classCapture))).andReturn(count); replay(resp); WebTarget wt = createMockWebTarget(); Invocation.Builder builder = createBuilder(); expect(builder.get()).andReturn(resp).times(3); replay(builder); expect(wt.path(eq("bluemix-todo"))).andReturn(wt).times(2); expect(wt.path(eq("todos"))).andReturn(wt).times(2); expect(wt.path(eq("_design"))).andReturn(wt).times(2); expect(wt.path(eq("_view"))).andReturn(wt); expect(wt.path(eq("allTodos"))).andReturn(wt); expect(wt.request(eq("application/json"))).andReturn(builder).anyTimes(); replay(wt); CloudantStore store = new CloudantStore(wt); assertEquals(123, store.count()); assertEquals(CloudantCount.class, classCapture.getValue()); verify(resp); verify(wt); verify(builder); } }