com.socialize.test.unit.SocializeRequestFactoryTest.java Source code

Java tutorial

Introduction

Here is the source code for com.socialize.test.unit.SocializeRequestFactoryTest.java

Source

/*
 * Copyright (c) 2012 Socialize Inc. 
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy 
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
package com.socialize.test.unit;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.utils.URLEncodedUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import com.google.android.testing.mocking.AndroidMock;
import com.google.android.testing.mocking.UsesMocks;
import com.socialize.api.DefaultSocializeRequestFactory;
import com.socialize.api.SocializeRequestFactory;
import com.socialize.api.SocializeSession;
import com.socialize.auth.AuthProviderData;
import com.socialize.auth.AuthProviderInfo;
import com.socialize.auth.AuthProviderType;
import com.socialize.auth.UserProviderCredentials;
import com.socialize.auth.UserProviderCredentialsMap;
import com.socialize.config.SocializeConfig;
import com.socialize.entity.SocializeObject;
import com.socialize.entity.SocializeObjectFactory;
import com.socialize.error.SocializeException;
import com.socialize.oauth.OAuthRequestSigner;
import com.socialize.oauth.OAuthSignListener;
import com.socialize.test.SocializeActivityTest;
import com.socialize.util.UrlBuilder;

/**
 * @author Jason Polites
 */
@UsesMocks({ SocializeSession.class, OAuthRequestSigner.class })
public class SocializeRequestFactoryTest extends SocializeActivityTest {

    @UsesMocks({ UserProviderCredentialsMap.class, AuthProviderData.class, AuthProviderInfo.class,
            UserProviderCredentials.class })
    public void testAuthRequestCreate() throws Exception {

        SocializeSession session = AndroidMock.createMock(SocializeSession.class);
        UserProviderCredentialsMap userProviderCredentialsMap = AndroidMock
                .createMock(UserProviderCredentialsMap.class);
        AuthProviderData data = AndroidMock.createMock(AuthProviderData.class);
        AuthProviderInfo authProviderInfo = AndroidMock.createMock(AuthProviderInfo.class);
        UserProviderCredentials userProviderCredentials = AndroidMock.createMock(UserProviderCredentials.class);

        AuthProviderType type = AuthProviderType.SOCIALIZE;

        final String endpoint = "foobar/";
        final String udid = "testid";

        final String accessToken = "foobar_accessToken";
        final String tokenSecret = "foobar_tokenSecret";
        final String userId = "foobar_userId";

        OAuthRequestSigner signer = new OAuthRequestSigner() {

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request,
                    OAuthSignListener listener) throws SocializeException {
                assertTrue(request instanceof HttpPost);
                HttpPost post = (HttpPost) request;
                assertEquals(post.getURI().toString(), endpoint);
                assertNotNull(post.getEntity());
                addResult(true);
                return request;
            }

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request)
                    throws SocializeException {
                return sign(session, request, null);
            }

            @Override
            public <R extends HttpUriRequest> R sign(String consumerKey, String consumerSecret, String accessToken,
                    String accessTokenSecret, R request, OAuthSignListener listener) throws SocializeException {
                return null;
            }
        };

        SocializeRequestFactory<SocializeObject> factory = new DefaultSocializeRequestFactory<SocializeObject>(
                signer, null);

        AndroidMock.expect(session.getUserProviderCredentials()).andReturn(userProviderCredentialsMap);
        AndroidMock.expect(data.getAuthProviderInfo()).andReturn(authProviderInfo);
        AndroidMock.expect(authProviderInfo.getType()).andReturn(type).anyTimes();
        AndroidMock.expect(userProviderCredentialsMap.get(type)).andReturn(userProviderCredentials);
        AndroidMock.expect(userProviderCredentials.getAuthProviderInfo()).andReturn(authProviderInfo).anyTimes();
        AndroidMock.expect(userProviderCredentials.getAccessToken()).andReturn(accessToken).anyTimes();
        AndroidMock.expect(userProviderCredentials.getTokenSecret()).andReturn(tokenSecret).anyTimes();
        AndroidMock.expect(userProviderCredentials.getUserId()).andReturn(userId).anyTimes();

        AndroidMock.replay(session, data, authProviderInfo, userProviderCredentialsMap, userProviderCredentials);

        HttpUriRequest req = factory.getAuthRequest(session, endpoint, udid, data);

        assertTrue(req instanceof HttpPost);

        HttpPost post = (HttpPost) req;

        HttpEntity entity = post.getEntity();

        assertNotNull(entity);

        assertTrue(entity instanceof UrlEncodedFormEntity);

        List<NameValuePair> parsed = URLEncodedUtils.parse(entity);

        assertEquals(1, parsed.size());

        NameValuePair nvp = parsed.get(0);

        assertEquals("payload", nvp.getName());

        JSONObject jsonExpected = new JSONObject();
        jsonExpected.put("udid", udid);
        jsonExpected.put("auth_type", type.getId());
        jsonExpected.put("auth_token", accessToken);
        jsonExpected.put("auth_token_secret", tokenSecret);
        jsonExpected.put("auth_id", userId);

        assertEquals(jsonExpected.toString(), nvp.getValue());

        assertTrue((Boolean) getNextResult());

        AndroidMock.verify(session);
    }

    public void testGetRequestCreate() throws Exception {

        final String endpoint = "foobar/";
        final String id = "testid";

        OAuthRequestSigner signer = new OAuthRequestSigner() {

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request,
                    OAuthSignListener listener) throws SocializeException {
                assertTrue(request instanceof HttpGet);
                HttpGet get = (HttpGet) request;
                assertEquals(get.getURI().toString(), endpoint + id + "/");

                addResult(true);
                return request;
            }

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request)
                    throws SocializeException {
                return sign(session, request, null);
            }

            @Override
            public <R extends HttpUriRequest> R sign(String consumerKey, String consumerSecret, String accessToken,
                    String accessTokenSecret, R request, OAuthSignListener listener) throws SocializeException {
                return null;
            }
        };

        SocializeRequestFactory<SocializeObject> factory = new DefaultSocializeRequestFactory<SocializeObject>(
                signer, null);

        SocializeSession session = AndroidMock.createMock(SocializeSession.class);

        HttpUriRequest getRequest = factory.getGetRequest(session, endpoint, id);

        assertTrue((Boolean) getNextResult());
        assertTrue(getRequest instanceof HttpGet);
    }

    public void testDeleteRequestCreate() throws Exception {

        final String endpoint = "foobar/";
        final String id = "testid";

        OAuthRequestSigner signer = new OAuthRequestSigner() {

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request,
                    OAuthSignListener listener) throws SocializeException {
                assertTrue(request instanceof HttpDelete);
                HttpDelete get = (HttpDelete) request;
                assertEquals(get.getURI().toString(), endpoint + id + "/");
                addResult(true);
                return request;
            }

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request)
                    throws SocializeException {
                return sign(session, request, null);
            }

            @Override
            public <R extends HttpUriRequest> R sign(String consumerKey, String consumerSecret, String accessToken,
                    String accessTokenSecret, R request, OAuthSignListener listener) throws SocializeException {
                return null;
            }

        };

        SocializeRequestFactory<SocializeObject> factory = new DefaultSocializeRequestFactory<SocializeObject>(
                signer, null);

        SocializeSession session = AndroidMock.createMock(SocializeSession.class);

        HttpUriRequest getRequest = factory.getDeleteRequest(session, endpoint, id);

        assertTrue((Boolean) getNextResult());
        assertTrue(getRequest instanceof HttpDelete);
    }

    public void testListRequestCreate() throws Exception {

        final String endpoint = "foobar/";
        final String key = "testid";
        final String[] ids = { "foo", "bar" };

        OAuthRequestSigner signer = new OAuthRequestSigner() {

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request,
                    OAuthSignListener listener) throws SocializeException {
                assertTrue(request instanceof HttpGet);
                HttpGet list = (HttpGet) request;

                addResult(list.getURI().toString());
                return request;
            }

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request)
                    throws SocializeException {
                return sign(session, request, null);
            }

            @Override
            public <R extends HttpUriRequest> R sign(String consumerKey, String consumerSecret, String accessToken,
                    String accessTokenSecret, R request, OAuthSignListener listener) throws SocializeException {
                return null;
            }
        };

        SocializeRequestFactory<SocializeObject> factory = new DefaultSocializeRequestFactory<SocializeObject>(
                signer, null);

        SocializeSession session = AndroidMock.createMock(SocializeSession.class);

        HttpUriRequest req = factory.getListRequest(session, endpoint, key, ids);

        assertTrue(req instanceof HttpGet);

        String actual = getNextResult();

        UrlBuilder builder = new UrlBuilder();
        builder.start(endpoint);
        builder.addParam("entity_key", key);
        builder.addParams("id", ids);

        builder.addParam("first", "0");
        builder.addParam("last", String.valueOf(SocializeConfig.MAX_LIST_RESULTS));

        String expected = builder.toString();

        assertEquals(expected, actual);
    }

    public void testListRequestCreatePaginated() throws Exception {

        final String endpoint = "foobar/";
        final String key = "testid";
        final String[] ids = { "foo", "bar" };

        int start = 0, end = 10;

        OAuthRequestSigner signer = new OAuthRequestSigner() {

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request,
                    OAuthSignListener listener) throws SocializeException {
                assertTrue(request instanceof HttpGet);
                HttpGet list = (HttpGet) request;

                addResult(list.getURI().toString());
                return request;
            }

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request)
                    throws SocializeException {
                return sign(session, request, null);
            }

            @Override
            public <R extends HttpUriRequest> R sign(String consumerKey, String consumerSecret, String accessToken,
                    String accessTokenSecret, R request, OAuthSignListener listener) throws SocializeException {
                return null;
            }
        };

        SocializeRequestFactory<SocializeObject> factory = new DefaultSocializeRequestFactory<SocializeObject>(
                signer, null);

        SocializeSession session = AndroidMock.createMock(SocializeSession.class);

        HttpUriRequest req = factory.getListRequest(session, endpoint, key, ids, start, end);

        assertTrue(req instanceof HttpGet);

        String actual = getNextResult();

        UrlBuilder builder = new UrlBuilder();
        builder.start(endpoint);
        builder.addParam("entity_key", key);
        builder.addParams("id", ids);

        builder.addParam("first", String.valueOf(start));
        builder.addParam("last", String.valueOf(end));

        String expected = builder.toString();

        assertEquals(expected, actual);
    }

    @SuppressWarnings("unchecked")
    @UsesMocks({ SocializeObjectFactory.class, JSONObject.class, SocializeSession.class })
    public void testPostRequestCreate() throws Exception {

        SocializeObjectFactory<SocializeObject> factory = AndroidMock.createMock(SocializeObjectFactory.class);
        SocializeSession session = AndroidMock.createMock(SocializeSession.class);

        SocializeObject object = new SocializeObject();
        final String jsonData = "{ 'entity': 'http://www.example.com/interesting-story/', 'text': 'this was a great story' }";
        final String endpoint = "foobar/";

        /**
         * The toString() method can't be mocked by EasyMock (no idea why!) so
         * we can't use a mock for the JSON object. We'll have to do it
         * manually.
         */
        JSONObject json = new JSONObject() {
            @Override
            public String toString() {
                return jsonData;
            }
        };

        AndroidMock.expect(factory.toJSON(object)).andReturn(json);

        OAuthRequestSigner signer = new OAuthRequestSigner() {

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request,
                    OAuthSignListener listener) throws SocializeException {
                HttpPost.class.isInstance(request);
                assertEquals(request.getURI().toString(), endpoint);
                addResult(true);
                return request;
            }

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request)
                    throws SocializeException {
                return sign(session, request, null);
            }

            @Override
            public <R extends HttpUriRequest> R sign(String consumerKey, String consumerSecret, String accessToken,
                    String accessTokenSecret, R request, OAuthSignListener listener) throws SocializeException {
                return null;
            }
        };

        SocializeRequestFactory<SocializeObject> reqFactory = new DefaultSocializeRequestFactory<SocializeObject>(
                signer, factory);

        AndroidMock.replay(factory);

        HttpUriRequest req = reqFactory.getPostRequest(session, endpoint, object);

        assertTrue((Boolean) getNextResult());
        assertTrue(HttpPost.class.isInstance(req));
        assertTrue(HttpEntityEnclosingRequestBase.class.isAssignableFrom(req.getClass()));

        HttpEntityEnclosingRequestBase post = (HttpEntityEnclosingRequestBase) req;

        HttpEntity entity = post.getEntity();

        assertNotNull(entity);

        assertTrue(entity instanceof UrlEncodedFormEntity);

        List<NameValuePair> parsed = URLEncodedUtils.parse(entity);

        assertEquals(1, parsed.size());

        NameValuePair nvp = parsed.get(0);

        assertEquals("payload", nvp.getName());
        assertEquals(jsonData, nvp.getValue());

        AndroidMock.verify(factory);
    }

    @SuppressWarnings("unchecked")
    @UsesMocks({ SocializeObjectFactory.class, SocializeSession.class })
    public void testPostRequestCreateCollection() throws Exception {

        SocializeObjectFactory<SocializeObject> factory = AndroidMock.createMock(SocializeObjectFactory.class);
        SocializeSession session = AndroidMock.createMock(SocializeSession.class);

        SocializeObject object0 = new SocializeObject();
        SocializeObject object1 = new SocializeObject();
        final String jsonData = "foo";
        final String endpoint = "foobar/";

        /**
         * The toString() method can't be mocked by EasyMock (no idea why!) so
         * we can't use a mock for the JSON object. We'll have to do it
         * manually.
         */
        JSONArray jsonArray = new JSONArray() {
            @Override
            public String toString() {
                return jsonData;
            }
        };

        Collection<SocializeObject> objects = new ArrayList<SocializeObject>(1);
        objects.add(object0);
        objects.add(object1);

        AndroidMock.expect(factory.toJSON(objects)).andReturn(jsonArray);
        AndroidMock.replay(factory);

        OAuthRequestSigner signer = new OAuthRequestSigner() {

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request,
                    OAuthSignListener listener) throws SocializeException {
                HttpPost.class.isInstance(request);
                assertEquals(request.getURI().toString(), endpoint);
                addResult(true);
                return request;
            }

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request)
                    throws SocializeException {
                return sign(session, request, null);
            }

            @Override
            public <R extends HttpUriRequest> R sign(String consumerKey, String consumerSecret, String accessToken,
                    String accessTokenSecret, R request, OAuthSignListener listener) throws SocializeException {
                return null;
            }
        };

        SocializeRequestFactory<SocializeObject> reqFactory = new DefaultSocializeRequestFactory<SocializeObject>(
                signer, factory);

        HttpUriRequest req = reqFactory.getPostRequest(session, endpoint, objects);

        assertTrue((Boolean) getNextResult());
        assertTrue(HttpPost.class.isInstance(req));
        assertTrue(HttpEntityEnclosingRequestBase.class.isAssignableFrom(req.getClass()));

        HttpEntityEnclosingRequestBase post = (HttpEntityEnclosingRequestBase) req;

        HttpEntity entity = post.getEntity();

        assertNotNull(entity);

        assertTrue(entity instanceof UrlEncodedFormEntity);

        List<NameValuePair> parsed = URLEncodedUtils.parse(entity);

        assertEquals(1, parsed.size());

        NameValuePair nvp = parsed.get(0);

        assertEquals("payload", nvp.getName());
        assertEquals(jsonData, nvp.getValue());

        AndroidMock.verify(factory);
    }

    @SuppressWarnings("unchecked")
    @UsesMocks({ SocializeObjectFactory.class, SocializeSession.class })
    public void testPutRequestCreateCollection() throws Exception {

        SocializeObjectFactory<SocializeObject> factory = AndroidMock.createMock(SocializeObjectFactory.class);
        SocializeSession session = AndroidMock.createMock(SocializeSession.class);

        SocializeObject object0 = new SocializeObject();
        SocializeObject object1 = new SocializeObject();
        final String jsonData = "foo";
        final String endpoint = "foobar/";

        /**
         * The toString() method can't be mocked by EasyMock (no idea why!) so
         * we can't use a mock for the JSON object. We'll have to do it
         * manually.
         */
        JSONArray jsonArray = new JSONArray() {
            @Override
            public String toString() {
                return jsonData;
            }
        };

        Collection<SocializeObject> objects = new ArrayList<SocializeObject>(1);
        objects.add(object0);
        objects.add(object1);

        AndroidMock.expect(factory.toJSON(objects)).andReturn(jsonArray);
        AndroidMock.replay(factory);

        OAuthRequestSigner signer = new OAuthRequestSigner() {

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request,
                    OAuthSignListener listener) throws SocializeException {
                HttpPut.class.isInstance(request);
                assertEquals(request.getURI().toString(), endpoint);
                addResult(true);
                return request;
            }

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request)
                    throws SocializeException {
                return sign(session, request, null);
            }

            @Override
            public <R extends HttpUriRequest> R sign(String consumerKey, String consumerSecret, String accessToken,
                    String accessTokenSecret, R request, OAuthSignListener listener) throws SocializeException {
                return null;
            }
        };

        SocializeRequestFactory<SocializeObject> reqFactory = new DefaultSocializeRequestFactory<SocializeObject>(
                signer, factory);

        HttpUriRequest req = reqFactory.getPutRequest(session, endpoint, objects);

        assertTrue((Boolean) getNextResult());
        assertTrue(HttpPut.class.isInstance(req));
        assertTrue(HttpEntityEnclosingRequestBase.class.isAssignableFrom(req.getClass()));

        HttpEntityEnclosingRequestBase post = (HttpEntityEnclosingRequestBase) req;

        HttpEntity entity = post.getEntity();

        assertNotNull(entity);

        assertTrue(entity instanceof UrlEncodedFormEntity);

        List<NameValuePair> parsed = URLEncodedUtils.parse(entity);

        assertEquals(1, parsed.size());

        NameValuePair nvp = parsed.get(0);

        assertEquals("payload", nvp.getName());
        assertEquals(jsonData, nvp.getValue());

        AndroidMock.verify(factory);
    }

    @SuppressWarnings("unchecked")
    @UsesMocks({ SocializeObjectFactory.class, JSONObject.class, SocializeSession.class })
    public void testPutRequestCreate() throws Exception {

        SocializeObjectFactory<SocializeObject> factory = AndroidMock.createMock(SocializeObjectFactory.class);
        SocializeSession session = AndroidMock.createMock(SocializeSession.class);

        SocializeObject object = new SocializeObject();
        final String jsonData = "foobar";
        final String endpoint = "foobar/";

        /**
         * The toString() method can't be mocked by EasyMock (no idea why!) so
         * we can't use a mock for the JSON object. We'll have to do it
         * manually.
         */
        JSONObject json = new JSONObject() {
            @Override
            public String toString() {
                return jsonData;
            }
        };

        AndroidMock.expect(factory.toJSON(object)).andReturn(json);

        OAuthRequestSigner signer = new OAuthRequestSigner() {

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request,
                    OAuthSignListener listener) throws SocializeException {
                HttpPut.class.isInstance(request);
                assertEquals(request.getURI().toString(), endpoint);
                addResult(true);
                return request;
            }

            @Override
            public <R extends HttpUriRequest> R sign(SocializeSession session, R request)
                    throws SocializeException {
                return sign(session, request, null);
            }

            @Override
            public <R extends HttpUriRequest> R sign(String consumerKey, String consumerSecret, String accessToken,
                    String accessTokenSecret, R request, OAuthSignListener listener) throws SocializeException {
                return null;
            }
        };

        SocializeRequestFactory<SocializeObject> reqFactory = new DefaultSocializeRequestFactory<SocializeObject>(
                signer, factory);

        AndroidMock.replay(factory);

        HttpUriRequest req = reqFactory.getPutRequest(session, endpoint, object);

        assertTrue((Boolean) getNextResult());
        assertTrue(HttpPut.class.isInstance(req));
        assertTrue(HttpEntityEnclosingRequestBase.class.isAssignableFrom(req.getClass()));

        HttpEntityEnclosingRequestBase post = (HttpEntityEnclosingRequestBase) req;

        HttpEntity entity = post.getEntity();

        assertNotNull(entity);

        assertTrue(entity instanceof UrlEncodedFormEntity);

        List<NameValuePair> parsed = URLEncodedUtils.parse(entity);

        assertEquals(1, parsed.size());

        NameValuePair nvp = parsed.get(0);

        assertEquals("payload", nvp.getName());
        assertEquals(jsonData, nvp.getValue());

        AndroidMock.verify(factory);
    }
}