/** * Copyright (c) 2014-present, Facebook, Inc. All rights reserved. * * You are hereby granted a non-exclusive, worldwide, royalty-free license to use, * copy, modify, and distribute this software in source code or binary form for use * in connection with the web services and APIs provided by Facebook. * * As with any software that integrates with the Facebook platform, your use of * this software is subject to the Facebook Developer Principles and Policies * [http://developers.facebook.com/policy/]. This copyright 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.facebook.internal; import com.facebook.FacebookTestCase; import com.facebook.share.internal.ShareInternalUtility; import com.facebook.share.model.ShareOpenGraphAction; import com.facebook.share.model.ShareOpenGraphContent; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.junit.Test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Locale; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; public class ShareInternalUtilityTest extends FacebookTestCase { @Test public void testRemoveNamespaceFromNullOGJsonObject() { assertNull(ShareInternalUtility.removeNamespacesFromOGJsonObject(null, false)); } @Test public void testRemoveNamespaceFromComplexOGJsonObject() { try { JSONObject testObject = getJsonOGActionTestObject(); testObject = ShareInternalUtility.removeNamespacesFromOGJsonObject(testObject, false); JSONObject expectedResult = getJsonOGActionTestObjectWithoutNamespace(); if(!simpleJsonObjComparer(testObject, expectedResult)){ fail(String.format( Locale.ROOT, "Actual: %s\nExpected: %s", testObject.toString(), expectedResult.toString())); } } catch (JSONException ex) { // Fail assertNotNull(ex); } } @Test public void testJsonSerializationOfOpenGraph() { String placeId = "1"; ShareOpenGraphContent content = new ShareOpenGraphContent.Builder() .setAction( new ShareOpenGraphAction.Builder() .putStringArrayList("tags", new ArrayList<String>() {{ add("2"); add("4"); }}) .build() ).setPeopleIds(new ArrayList<String>() {{ add("1"); add("1"); add("2"); add("3"); }}).setPlaceId(placeId) .build(); try { JSONObject object = ShareInternalUtility.toJSONObjectForCall(null, content); List<String> peopleIds = Utility.jsonArrayToStringList(object.getJSONArray("tags")); assertEquals(4, peopleIds.size()); for (int i = 1; i < 5; ++i) { assertTrue(peopleIds.contains(Integer.valueOf(i).toString())); } assertEquals(placeId, object.getString("place")); } catch (JSONException ex) { // Fail assertNotNull(ex); return; } } @Test public void testJsonSerializationOfOpenGraphExistingPlace() { ShareOpenGraphContent content = new ShareOpenGraphContent.Builder() .setAction( new ShareOpenGraphAction.Builder() .putString("place", "1") .build() ).setPlaceId("2") .build(); try { JSONObject object = ShareInternalUtility.toJSONObjectForCall(null, content); assertEquals("1", object.getString("place")); } catch (JSONException ex) { // Fail assertNotNull(ex); return; } } private static JSONObject getJsonOGActionTestObject() throws JSONException { JSONObject testAction = new JSONObject(); testAction.put("og:field", 1); testAction.put("namespaced:custom:field", 3); JSONObject testOGContent = getJsonOGContentTestObject(); testAction.put("namespaced:content", testOGContent); testAction.put("array", getJsonOGArrayTestObject()); return testAction; } private static JSONObject getJsonOGActionTestObjectWithoutNamespace() throws JSONException { JSONObject testAction = new JSONObject(); testAction.put("field", 1); testAction.put("custom:field", 3); JSONObject testOGContent = getJsonOGContentTestObjectWithoutNamespace(); testAction.put("content", testOGContent); testAction.put("array", getJsonOGArrayTestObjectWithoutNamespace()); return testAction; } private static JSONArray getJsonOGArrayTestObject() throws JSONException { JSONArray testArray = new JSONArray(); testArray.put(10); testArray.put(getJsonOGContentTestObject()); return testArray; } private static JSONArray getJsonOGArrayTestObjectWithoutNamespace() throws JSONException { JSONArray testArray = new JSONArray(); testArray.put(10); testArray.put(getJsonOGContentTestObjectWithoutNamespace()); return testArray; } private static JSONObject getJsonOGContentTestObject() throws JSONException { JSONObject testOGContent = new JSONObject(); testOGContent.put("fbsdk:create", true); testOGContent.put("namespaced:field", 4); testOGContent.put("og:field", 5); testOGContent.put("custom:namespaced:field", 6); JSONObject innerContent = new JSONObject(); innerContent.put("namespaced:field", 7); innerContent.put("og:field", 8); testOGContent.put("namespaced:innerContent", innerContent); return testOGContent; } private static JSONObject getJsonOGContentTestObjectWithoutNamespace() throws JSONException { JSONObject testOGContent = new JSONObject(); testOGContent.put("fbsdk:create", true); testOGContent.put("field", 5); JSONObject innerContent = new JSONObject(); innerContent.put("field", 8); JSONObject innerData = new JSONObject(); innerData.put("field", 7); innerContent.put("data", innerData); JSONObject data = new JSONObject(); data.put("field", 4); data.put("namespaced:field", 6); data.put("innerContent", innerContent); testOGContent.put("data", data); return testOGContent; } private boolean simpleJsonObjComparer(JSONObject obj1, JSONObject obj2) { if (obj1.names().length() != obj2.names().length()) { return false; } Iterator<String> keys = obj1.keys(); while (keys.hasNext()) { try { String key = keys.next(); Object value1 = obj1.get(key); Object value2 = obj2.get(key); if (!jsonObjectValueComparer(value1, value2)){ return false; } } catch (Exception ex) { return false; } } return true; } private boolean simpleJsonArrayComparer(JSONArray array1, JSONArray array2) throws JSONException{ if(array1.length() != array2.length()) { return false; } for(int i = 0; i < array1.length(); ++i) { if (!jsonObjectValueComparer(array1.get(i), array2.get(i))){ return false; } } return true; } private boolean jsonObjectValueComparer(Object value1, Object value2) throws JSONException{ if (value1 instanceof JSONObject) { if (!simpleJsonObjComparer((JSONObject) value1, (JSONObject) value2)) { return false; } } else if (value1 instanceof JSONArray) { if (!simpleJsonArrayComparer((JSONArray) value1, (JSONArray) value2)) { return false; } } else if (value1 != value2) { return false; } return true; } }