source: VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/test/java/eu/clarin/cmdi/virtualcollectionregistry/rest/VirtualCollectionResourceTest.java @ 5616

Last change on this file since 5616 was 5616, checked in by Twan Goosen, 10 years ago

Extracted interface from VirtualCollectionRegistry.
Created test for VirtualCollectionResource? of REST service that uses this interface for mocking.

File size: 9.9 KB
Line 
1/*
2 * Copyright (C) 2014 CLARIN
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17package eu.clarin.cmdi.virtualcollectionregistry.rest;
18
19import com.sun.jersey.api.uri.UriBuilderImpl;
20import eu.clarin.cmdi.virtualcollectionregistry.VirtualCollectionRegistry;
21import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection;
22import eu.clarin.cmdi.virtualcollectionregistry.pid.PersistentIdentifier;
23import eu.clarin.cmdi.virtualcollectionregistry.service.VirtualCollectionMarshaller;
24import java.io.ByteArrayInputStream;
25import java.io.InputStream;
26import java.net.URI;
27import java.security.Principal;
28import java.util.List;
29import javax.ws.rs.core.HttpHeaders;
30import javax.ws.rs.core.MediaType;
31import javax.ws.rs.core.Request;
32import javax.ws.rs.core.Response;
33import javax.ws.rs.core.SecurityContext;
34import javax.ws.rs.core.UriInfo;
35import javax.ws.rs.core.Variant;
36import static org.hamcrest.Matchers.*;
37import org.jmock.Expectations;
38import static org.jmock.Expectations.equal;
39import static org.jmock.Expectations.returnValue;
40import org.jmock.Mockery;
41import org.jmock.integration.junit4.JUnit4Mockery;
42import static org.junit.Assert.*;
43import org.junit.Before;
44import org.junit.Test;
45
46/**
47 *
48 * @author twagoo
49 */
50public class VirtualCollectionResourceTest {
51
52    private final static long ID = 123L;
53
54    private Mockery context = new JUnit4Mockery();
55
56    private VirtualCollectionResource instance;
57    private VirtualCollectionRegistry registry;
58    private VirtualCollectionMarshaller marshaller;
59
60    private UriInfo uriInfo;
61    private HttpHeaders headers;
62    private SecurityContext security;
63
64    @Before
65    public void setUp() throws Exception {
66        registry = context.mock(VirtualCollectionRegistry.class);
67        marshaller = context.mock(VirtualCollectionMarshaller.class);
68        uriInfo = context.mock(UriInfo.class);
69        headers = context.mock(HttpHeaders.class);
70        security = context.mock(SecurityContext.class);
71        instance = new VirtualCollectionResource(registry, marshaller, security, headers, uriInfo, ID);
72    }
73
74    /**
75     * Test of getVirtualCollection method, of class VirtualCollectionResource.
76     */
77    @Test
78    public void testGetPublicVirtualCollection() throws Exception {
79        final Request request = context.mock(Request.class);
80
81        // create a public VC to have returned by the registry service
82        final VirtualCollection vc = new VirtualCollection();
83        vc.setId(ID);
84        vc.setName("Test VC");
85        vc.setState(VirtualCollection.State.PUBLIC_PENDING);
86        // set PID and set state to public
87        vc.setPersistentIdentifier(new PersistentIdentifier(vc, PersistentIdentifier.Type.DUMMY, "PID"));
88
89        context.checking(new Expectations() {
90            {
91                oneOf(registry).retrieveVirtualCollection(ID);
92                will(returnValue(vc));
93            }
94        });
95        final Response response = instance.getVirtualCollection(request);
96        assertEquals(200, response.getStatus());
97        assertEquals(vc, response.getEntity());
98    }
99
100    /**
101     * Test of getVirtualCollection method, of class VirtualCollectionResource.
102     */
103    @Test
104    public void testGetPrivateVirtualCollection() throws Exception {
105        final Request request = context.mock(Request.class);
106
107        // create a public VC to have returned by the registry service
108        final VirtualCollection vc = new VirtualCollection();
109        vc.setId(ID);
110        vc.setName("Test VC");
111        vc.setState(VirtualCollection.State.PRIVATE);
112
113        // prepare variants for content negotiation
114        final List<Variant> variants = Variant.mediaTypes(MediaType.APPLICATION_XML_TYPE).add().build();
115
116        context.checking(new Expectations() {
117            {
118                oneOf(registry).retrieveVirtualCollection(ID);
119                will(returnValue(vc));
120                // it's private, so service will check whether non-CMDI XML is acceptable
121                exactly(1).of(equal(request))
122                        .method("selectVariant").with(hasItems(variants.toArray()));
123                // we will accept XML
124                will(returnValue(variants.get(0)));
125            }
126        });
127        final Response response = instance.getVirtualCollection(request);
128        assertEquals(200, response.getStatus());
129        assertEquals(vc, response.getEntity());
130    }
131
132    /**
133     * Test of getVirtualCollectionDetailsRedirect method, of class
134     * VirtualCollectionResource.
135     */
136    @Test
137    public void testGetVirtualCollectionDetailsRedirect() throws Exception {
138        context.checking(new Expectations() {
139            {
140                oneOf(uriInfo).getBaseUriBuilder();
141                will(returnValue(new UriBuilderImpl().path("http://server/vcr")));
142            }
143        });
144        final Response response = instance.getVirtualCollectionDetailsRedirect();
145        assertEquals(303, response.getStatus());
146        final List<Object> location = response.getMetadata().get("Location");
147        assertFalse(location.isEmpty());
148        assertEquals(URI.create("http://server/vcr/../app/details/" + ID), location.get(0));
149    }
150
151    /**
152     * Test of updateVirtualCollection method, of class
153     * VirtualCollectionResource.
154     */
155    @Test
156    public void testUpdateVirtualCollection() throws Exception {
157        // principal and input stream stubs (usually provided by client via Jersey)
158        final Principal principal = context.mock(Principal.class);
159        final InputStream input = new ByteArrayInputStream(new byte[0]);
160
161        // create a public VC to have returned by the marshaller
162        final VirtualCollection vc = new VirtualCollection();
163        vc.setId(ID);
164        vc.setName("Test VC");
165        vc.setState(VirtualCollection.State.PRIVATE);
166
167        context.checking(new Expectations() {
168            {
169                oneOf(security).getUserPrincipal();
170                will(returnValue(principal));
171                allowing(headers).getMediaType();
172                will(returnValue(MediaType.APPLICATION_XML_TYPE));
173                oneOf(marshaller).unmarshal(input, VirtualCollectionMarshaller.Format.XML, "utf-8");
174                will(returnValue(vc));
175                oneOf(registry).updateVirtualCollection(principal, ID, vc);
176                will(returnValue(ID));
177            }
178        });
179
180        final Response result = instance.updateVirtualCollection(input);
181        assertEquals(200, result.getStatus());
182    }
183
184    /**
185     * Test of deleteVirtualCollection method, of class
186     * VirtualCollectionResource.
187     */
188    @Test
189    public void testDeleteVirtualCollection() throws Exception {
190        // principal stream stub (usually provided by client via Jersey)
191        final Principal principal = context.mock(Principal.class);
192
193        context.checking(new Expectations() {
194            {
195                oneOf(security).getUserPrincipal();
196                will(returnValue(principal));
197                oneOf(registry).deleteVirtualCollection(principal, ID);
198                will(returnValue(ID));
199            }
200        });
201
202        final Response result = instance.deleteVirtualCollection();
203        assertEquals(200, result.getStatus());
204    }
205
206    /**
207     * Test of getVirtualCollectionState method, of class
208     * VirtualCollectionResource.
209     */
210    @Test
211    public void testGetVirtualCollectionState() throws Exception {
212        // private state
213        context.checking(new Expectations() {
214            {
215                oneOf(registry).getVirtualCollectionState(ID);
216                will(returnValue(VirtualCollection.State.PRIVATE));
217            }
218        });
219        Response result = instance.getVirtualCollectionState();
220        assertEquals(200, result.getStatus());
221        assertEquals(State.PRIVATE, result.getEntity());
222
223        // public state
224        context.checking(new Expectations() {
225            {
226                oneOf(registry).getVirtualCollectionState(ID);
227                will(returnValue(VirtualCollection.State.PUBLIC));
228            }
229        });
230        result = instance.getVirtualCollectionState();
231        assertEquals(200, result.getStatus());
232        assertEquals(State.PUBLIC, result.getEntity());
233    }
234
235    /**
236     * Test of setVirtualCollectionState method, of class
237     * VirtualCollectionResource.
238     */
239    @Test
240    public void testSetVirtualCollectionState() throws Exception {
241        // principal stream stub (usually provided by client via Jersey)
242        final Principal principal = context.mock(Principal.class);
243
244        // set to private
245        context.checking(new Expectations() {
246            {
247                allowing(security).getUserPrincipal();
248                will(returnValue(principal));
249
250                oneOf(registry).setVirtualCollectionState(principal, ID, VirtualCollection.State.PRIVATE);
251            }
252        });
253        Response result = instance.setVirtualCollectionState(ID, State.PRIVATE);
254        assertEquals(200, result.getStatus());
255
256        // set to public
257        context.checking(new Expectations() {
258            {
259                // setting public status will *mark* it for publication, so the
260                // actual status will be 'public pending' initially
261                oneOf(registry).setVirtualCollectionState(principal, ID, VirtualCollection.State.PUBLIC_PENDING);
262            }
263        });
264        result = instance.setVirtualCollectionState(ID, State.PUBLIC);
265        assertEquals(200, result.getStatus());
266    }
267
268}
Note: See TracBrowser for help on using the repository browser.