/*
* 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.integration.services.a;
import android.app.Activity;
import android.content.Context;
import android.widget.CompoundButton;
import android.widget.ToggleButton;
import com.socialize.LikeUtils;
import com.socialize.SocializeAccess;
import com.socialize.SocializeService;
import com.socialize.UserUtils;
import com.socialize.api.SocializeSession;
import com.socialize.api.action.ActionOptions;
import com.socialize.api.action.ShareableActionOptions;
import com.socialize.api.action.like.LikeOptions;
import com.socialize.api.action.like.SocializeLikeSystem;
import com.socialize.api.action.like.SocializeLikeUtils;
import com.socialize.api.action.user.SocializeUserUtils;
import com.socialize.entity.Entity;
import com.socialize.entity.Like;
import com.socialize.entity.SocializeAction;
import com.socialize.entity.User;
import com.socialize.error.SocializeException;
import com.socialize.listener.like.IsLikedListener;
import com.socialize.listener.like.LikeAddListener;
import com.socialize.listener.like.LikeDeleteListener;
import com.socialize.listener.like.LikeGetListener;
import com.socialize.listener.like.LikeListListener;
import com.socialize.listener.like.LikeListener;
import com.socialize.listener.user.UserSaveListener;
import com.socialize.networks.SocialNetwork;
import com.socialize.networks.SocialNetworkListener;
import com.socialize.test.SocializeActivityTest;
import com.socialize.test.util.TestUtils;
import com.socialize.ui.actionbutton.LikeButtonListener;
import com.socialize.ui.profile.UserSettings;
import com.socialize.ui.share.IShareDialogFactory;
import com.socialize.ui.share.ShareDialogListener;
import org.mockito.Mockito;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
* @author Jason Polites
*
*/
public class LikeUtilsTest extends SocializeActivityTest {
public void testAddLike() throws InterruptedException {
final Entity entityKey = Entity.newInstance("testAddLike", "testAddLike");
final CountDownLatch latch = new CountDownLatch(1);
final LikeOptions options = LikeUtils.getUserLikeOptions(getContext());
options.setShowAuthDialog(false);
options.setShowShareDialog(false);
LikeUtils.like(TestUtils.getActivity(this), entityKey, options, new LikeAddListener() {
@Override
public void onError(SocializeException error) {
error.printStackTrace();
addResult(0, error);
latch.countDown();
}
@Override
public void onCreate(Like like) {
addResult(0, like);
latch.countDown();
}
});
latch.await(20, TimeUnit.SECONDS);
Object result = getResult(0);
assertNotNull(result);
assertTrue("Result is not a like object", (result instanceof Like));
Like like = (Like) result;
assertTrue("Like ID is not greater than 0", like.getId() > 0);
// Now use the normal UI to retrieve the like
clearResults();
final CountDownLatch latch2 = new CountDownLatch(1);
LikeUtils.getLike(TestUtils.getActivity(this), like.getId(), new LikeGetListener() {
@Override
public void onGet(Like entity) {
addResult(0, entity);
latch2.countDown();
}
@Override
public void onError(SocializeException error) {
error.printStackTrace();
latch2.countDown();
}
});
latch2.await(20, TimeUnit.SECONDS);
Like after = getResult(0);
assertNotNull(after);
assertEquals(like.getId(), after.getId());
assertEquals(entityKey.getKey(), after.getEntityKey());
}
public void testGetLikeExists() throws InterruptedException {
final Entity entityKey = Entity.newInstance("testGetLikeExists", "testGetLikeExists");
final CountDownLatch latch = new CountDownLatch(1);
final LikeOptions options = LikeUtils.getUserLikeOptions(getContext());
options.setShowAuthDialog(false);
options.setShowShareDialog(false);
LikeUtils.like(TestUtils.getActivity(this), entityKey, options, new LikeAddListener() {
@Override
public void onError(SocializeException error) {
error.printStackTrace();
latch.countDown();
}
@Override
public void onCreate(Like like) {
LikeUtils.getLike(TestUtils.getActivity(LikeUtilsTest.this), entityKey.getKey(), new LikeGetListener() {
@Override
public void onGet(Like entity) {
addResult(0, entity);
latch.countDown();
}
@Override
public void onError(SocializeException error) {
error.printStackTrace();
latch.countDown();
}
});
}
});
latch.await(20, TimeUnit.SECONDS);
Like like = getResult(0);
assertNotNull(like);
assertEquals(entityKey.getKey(), like.getEntityKey());
}
public void testGetLikeDoesNotExist() throws InterruptedException {
final CountDownLatch latch = new CountDownLatch(1);
final String entityKey = "testGetLikeDoesNotExist";
LikeUtils.isLiked(TestUtils.getActivity(this), entityKey, new IsLikedListener() {
@Override
public void onLiked(Like like) {
fail();
}
@Override
public void onNotLiked() {
addResult("success");
latch.countDown();
}
});
latch.await(20, TimeUnit.SECONDS);
String success = getResult(0);
assertNotNull(success);
assertEquals("success", success);
}
public void testUnlike() throws InterruptedException {
final Entity entityKey = Entity.newInstance("testUnlike", "testUnlike");
final CountDownLatch latch = new CountDownLatch(1);
// Force no config
final LikeOptions options = LikeUtils.getUserLikeOptions(getContext());
options.setShowAuthDialog(false);
options.setShowShareDialog(false);
LikeUtils.like(TestUtils.getActivity(this), entityKey, options, new LikeAddListener() {
@Override
public void onError(SocializeException error) {
error.printStackTrace();
latch.countDown();
}
@Override
public void onCreate(Like like) {
LikeUtils.unlike(TestUtils.getActivity(LikeUtilsTest.this), entityKey.getKey(), new LikeDeleteListener() {
@Override
public void onError(SocializeException error) {
error.printStackTrace();
fail();
}
@Override
public void onDelete() {
addResult("success");
latch.countDown();
}
});
}
});
latch.await(20, TimeUnit.SECONDS);
String success = getResult(0);
assertNotNull(success);
assertEquals("success", success);
}
public void testGetLikesByUser() throws SocializeException, InterruptedException {
final User user = UserUtils.getCurrentUser(TestUtils.getActivity(this));
final Entity entityKey = Entity.newInstance("testGetLikesByUser", "testGetLikesByUser");
final CountDownLatch latch = new CountDownLatch(1);
// Force no config
final LikeOptions options = LikeUtils.getUserLikeOptions(getContext());
options.setShowAuthDialog(false);
options.setShowShareDialog(false);
LikeUtils.like(TestUtils.getActivity(this), entityKey, options, new LikeAddListener() {
@Override
public void onError(SocializeException error) {
error.printStackTrace();
latch.countDown();
}
@Override
public void onCreate(Like like) {
LikeUtils.getLikesByUser(TestUtils.getActivity(LikeUtilsTest.this), user, 0, 100, new LikeListListener() {
@Override
public void onList(List<Like> items, int totalSize) {
addResult(items);
latch.countDown();
}
@Override
public void onError(SocializeException error) {
error.printStackTrace();
fail();
}
});
}
});
latch.await(20, TimeUnit.SECONDS);
List<Like> items = getResult(0);
assertNotNull(items);
assertTrue(items.size() >= 1);
}
public void testGetLikesByEntity() throws SocializeException, InterruptedException {
final Entity entityKey = Entity.newInstance("testGetLikesByEntity", "testGetLikesByEntity");
final CountDownLatch latch = new CountDownLatch(1);
// Force no config
final LikeOptions options = LikeUtils.getUserLikeOptions(getContext());
options.setShowAuthDialog(false);
options.setShowShareDialog(false);
LikeUtils.like(TestUtils.getActivity(this), entityKey, options, new LikeAddListener() {
@Override
public void onError(SocializeException error) {
error.printStackTrace();
latch.countDown();
}
@Override
public void onCreate(Like like) {
LikeUtils.getLikesByEntity(TestUtils.getActivity(LikeUtilsTest.this), entityKey.getKey(), 0, 100, new LikeListListener() {
@Override
public void onList(List<Like> items, int totalSize) {
addResult(items);
latch.countDown();
}
@Override
public void onError(SocializeException error) {
error.printStackTrace();
fail();
}
});
}
});
latch.await(20, TimeUnit.SECONDS);
List<Like> items = getResult(0);
assertNotNull(items);
assertTrue(items.size() >= 1);
}
public void testGetLikesByApplication() throws SocializeException, InterruptedException {
final Activity context = TestUtils.getActivity(this);
final Entity entityKey = Entity.newInstance("testGetLikesByApplication", "testGetLikesByApplication");
final CountDownLatch latch = new CountDownLatch(1);
// Force no config
final LikeOptions options = LikeUtils.getUserLikeOptions(getContext());
options.setShowAuthDialog(false);
options.setShowShareDialog(false);
LikeUtils.like(context, entityKey, options, new LikeAddListener() {
@Override
public void onError(SocializeException error) {
error.printStackTrace();
latch.countDown();
}
@Override
public void onCreate(Like like) {
LikeUtils.getLikesByApplication(context, 0, 100, new LikeListListener() {
@Override
public void onList(List<Like> items, int totalSize) {
addResult(items);
latch.countDown();
}
@Override
public void onError(SocializeException error) {
error.printStackTrace();
fail();
}
});
}
});
latch.await(20, TimeUnit.SECONDS);
List<Like> items = getResult(0);
assertNotNull(items);
assertTrue(items.size() >= 1);
}
public void testMakeLikeButtonDoLike() throws Throwable {
final Activity context = TestUtils.getActivity(this);
final Entity entity = Entity.newInstance("testMakeLikeButton", "testMakeLikeButton");
final Like like = new Like();
like.setId(0L);
like.setEntity(entity);
SocializeLikeUtils mockLikeUtils = new SocializeLikeUtils() {
public void like (Activity context, Entity entity, LikeOptions likeOptions, LikeAddListener listener, SocialNetwork...shareTo){
addResult(0, "like");
listener.onCreate(like);
}
public void unlike (Activity context, String entityKey, LikeDeleteListener listener) {
addResult(1, "unlike");
listener.onDelete();
}
public void getLike (Activity context, String entityKey, LikeGetListener listener) {
listener.onGet(null);
}
};
final LikeButtonListener listener = new LikeButtonListener(){
public void onClick(CompoundButton button) {
addResult(4, "onClick");
}
public void onError(CompoundButton button, Exception error) {
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
addResult(5, isChecked);
}
};
SocializeAccess.setLikeUtilsProxy(mockLikeUtils);
final CountDownLatch latch = new CountDownLatch(1);
runTestOnUiThread(new Runnable() {
@Override
public void run() {
ToggleButton button = new ToggleButton(context);
LikeUtils.makeLikeButton(context, button, entity, listener);
button.performClick();
addResult(3, button);
latch.countDown();
}
});
assertTrue(latch.await(10, TimeUnit.SECONDS));
ToggleButton button = getResult(3);
String result = getResult(0);
assertTrue(button.isChecked());
assertNotNull(result);
assertEquals("like", result);
assertNotNull(getResult(4));
assertTrue((Boolean) getResult(5));
}
public void testMakeLikeButtonDoUnLike() throws Throwable {
final Activity context = TestUtils.getActivity(this);
final Entity entity = Entity.newInstance("testMakeLikeButton", "testMakeLikeButton");
final Like like = new Like();
like.setId(0L);
like.setEntity(entity);
SocializeLikeUtils mockLikeUtils = new SocializeLikeUtils() {
public void like (Activity context, Entity entity, LikeOptions likeOptions, LikeAddListener listener, SocialNetwork...shareTo){
addResult(0, "like");
listener.onCreate(like);
}
public void unlike (Activity context, String entityKey, LikeDeleteListener listener) {
addResult(1, "unlike");
listener.onDelete();
}
public void getLike (Activity context, String entityKey, LikeGetListener listener) {
listener.onGet(like);
}
};
final LikeButtonListener listener = new LikeButtonListener(){
public void onClick(CompoundButton button) {
addResult(4, "onClick");
}
public void onError(CompoundButton button, Exception error) {
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
addResult(5, isChecked);
}
};
SocializeAccess.setLikeUtilsProxy(mockLikeUtils);
final CountDownLatch latch = new CountDownLatch(1);
runTestOnUiThread(new Runnable() {
@Override
public void run() {
ToggleButton button = new ToggleButton(context);
button.setChecked(true);
LikeUtils.makeLikeButton(context, button, entity, listener);
button.performClick();
addResult(3, button);
latch.countDown();
}
});
assertTrue(latch.await(10, TimeUnit.SECONDS));
ToggleButton button = getResult(3);
String result = getResult(1);
assertFalse(button.isChecked());
assertNotNull(result);
assertEquals("unlike", result);
assertNotNull(getResult(4));
assertFalse((Boolean) getResult(5));
}
public void testDoLikeWithShare() {
final Activity context = TestUtils.getActivity(this);
final Entity entity = Entity.newInstance("testMakeLikeButton", "testMakeLikeButton");
final Like like = new Like();
like.setId(0L);
like.setEntity(entity);
final SocializeService socialize = Mockito.mock(SocializeService.class);
final SocializeSession session = Mockito.mock(SocializeSession.class);
final UserSettings settings = Mockito.mock(UserSettings.class);
final SocialNetwork[] network = new SocialNetwork[]{SocialNetwork.TWITTER};
Mockito.when(socialize.getSession()).thenReturn(session);
Mockito.when(session.getUserSettings()).thenReturn(settings);
Mockito.when(settings.setAutoPostPreferences(network)).thenReturn(true);
final SocializeUserUtils mockUserUtils = new SocializeUserUtils() {
@Override
public void saveUserSettings(Context context, UserSettings userSettings, UserSaveListener listener) {
addResult(0, userSettings);
}
};
final IShareDialogFactory mockShareDialogFactory = new IShareDialogFactory() {
@Override
public void preload(Context context) {}
@Override
public void show(Context context, Entity entity, SocialNetworkListener socialNetworkListener, ShareDialogListener shareDialoglistener, int displayOptions) {
shareDialoglistener.onContinue(null, true, network);
}
};
final SocializeLikeSystem mockLikeSystem = new SocializeLikeSystem(null) {
public void addLike(SocializeSession session, Entity entity, LikeOptions shareOptions, LikeListener listener, SocialNetwork... networks) {
listener.onCreate(like);
}
};
final LikeAddListener listener = new LikeAddListener() {
@Override
public void onError(SocializeException error) {}
@Override
public void onCreate(Like result) {
addResult(2, result);
}
};
SocializeLikeUtils mockLikeUtils = new SocializeLikeUtils() {
@Override
protected boolean isDisplayAuthDialog(Context context, SocializeSession session, ActionOptions options, SocialNetwork... networks) {
return false;
}
@Override
protected boolean isDisplayShareDialog(Context context, ShareableActionOptions options) {
return true;
}
@Override
protected void doActionShare(Activity context, SocializeAction action, String text, SocialNetworkListener listener, SocialNetwork... networks) {
addResult(1, action);
}
@Override
protected SocializeService getSocialize() {
return socialize;
}
};
mockLikeUtils.setLikeSystem(mockLikeSystem);
mockLikeUtils.setShareDialogFactory(mockShareDialogFactory);
SocializeAccess.setLikeUtilsProxy(mockLikeUtils);
SocializeAccess.setUserUtilsProxy(mockUserUtils);
LikeUtils.like(context, entity, null, listener, network);
UserSettings settingsAfter = getResult(0);
Like likeAfter0 = getResult(1);
Like likeAfter1 = getResult(2);
assertNotNull(settingsAfter);
assertNotNull(likeAfter0);
assertNotNull(likeAfter1);
assertSame(settings, settingsAfter);
assertSame(like, likeAfter0);
assertSame(like, likeAfter1);
}
public void testLikeIsSharedWithAutoPost() {
final Entity entity = Entity.newInstance("testLikeIsSharedWithAutoPost", "testLikeIsSharedWithAutoPost");
final SocialNetwork[] autoPost = {
SocialNetwork.TWITTER,
SocialNetwork.FACEBOOK,
};
SocializeLikeUtils likeUtils = new SocializeLikeUtils() {
@Override
protected void doLikeWithoutShareDialog(Activity context, SocializeSession session, Entity entity, LikeOptions likeOptions, LikeAddListener listener, SocialNetwork... networks) {
TestUtils.addResult(0, networks);
}
@Override
protected boolean isDisplayAuthDialog(Context context, SocializeSession session, ActionOptions options, SocialNetwork... networks) {
return false;
}
@Override
protected boolean isDisplayShareDialog(Context context, ShareableActionOptions options) {
return false;
}
};
SocializeUserUtils userUtils = new SocializeUserUtils() {
@Override
public SocialNetwork[] getAutoPostSocialNetworks(Context context) {
return autoPost;
}
};
SocializeAccess.setUserUtilsProxy(userUtils);
likeUtils.like(TestUtils.getActivity(this), entity, null);
SocialNetwork[] networks = TestUtils.getResult(0);
assertNotNull(networks);
assertEquals(2, networks.length);
}
}