Package org.apache.shindig.gadgets.spec

Source Code of org.apache.shindig.gadgets.spec.PipelinedDataTest

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you 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 org.apache.shindig.gadgets.spec;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import org.apache.shindig.common.JsonAssert;
import org.apache.shindig.common.uri.Uri;
import org.apache.shindig.common.xml.XmlUtil;
import org.apache.shindig.expressions.Expressions;
import org.apache.shindig.expressions.RootELResolver;
import org.apache.shindig.gadgets.AuthType;
import org.apache.shindig.gadgets.spec.PipelinedData.BatchItem;
import org.apache.shindig.gadgets.spec.PipelinedData.BatchType;

import java.util.Map;

import javax.el.ELResolver;

import org.json.JSONArray;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

public class PipelinedDataTest {

  private static final Uri GADGET_URI = Uri.parse("http://example.org/");
  private ELResolver elResolver;
  private Map<String, Object> elValues;
  private Expressions expressions;

  @Before
  public void setUp() {
    elValues = Maps.newHashMap();
    elResolver = new RootELResolver(elValues);
    expressions = Expressions.forTesting();
  }
 
  @Test
  public void testDataRequest() throws Exception {
    String xml = "<Content><DataRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" "
        + " key=\"key\""
        + " method=\"people.get\""
        + " groupId=\"${params.groupId}\""
        + " userId=\"${userIds}\""
        + " startIndex=\"${startIndex}\""
        + " fields=\"${fields}\""
        + "/></Content>";

    elValues.put("startIndex", 10);
    // Test a param that evaluates to null
    elValues.put("params", ImmutableMap.of());
    elValues.put("userIds", Lists.newArrayList("first", "second"));   
    elValues.put("fields", new JSONArray("['name','id']"));
    PipelinedData socialData = new PipelinedData(XmlUtil.parse(xml), null);
    assertFalse(socialData.needsOwner());
    assertFalse(socialData.needsViewer());

    JSONObject expected = new JSONObject("{method: 'people.get', id: 'key', params:"
        + "{userId: ['first','second'],"
        + "startIndex: 10,"
        + "fields: ['name','id']"
        + "}}");

    PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);
    assertEquals(1, batch.getPreloads().size());
    PipelinedData.BatchItem batchItem = batch.getPreloads().get("key");
    assertEquals(PipelinedData.BatchType.SOCIAL, batchItem.getType());
    JsonAssert.assertObjectEquals(expected, batchItem.getData());
  }

  @Test
  public void testPeopleRequest() throws Exception {
    String xml = "<Content><PeopleRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" "
        + " key=\"key\""
        + " groupId=\"group\""
        + " userId=\"first,second\""
        + " startIndex=\"20\""
        + " count=\"10\""
        + " fields=\"name,id\""
        + "/></Content>";

    PipelinedData socialData = new PipelinedData(XmlUtil.parse(xml), null);
    assertFalse(socialData.needsOwner());
    assertFalse(socialData.needsViewer());

    JSONObject expected = new JSONObject("{method: 'people.get', id: 'key', params:"
        + "{groupId: 'group',"
        + "userId: ['first','second'],"
        + "startIndex: 20,"
        + "count: 10,"
        + "fields: ['name','id']"
        + "}}");

    PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);
    assertEquals(1, batch.getPreloads().size());
    PipelinedData.BatchItem batchItem = batch.getPreloads().get("key");
    assertEquals(PipelinedData.BatchType.SOCIAL, batchItem.getType());
    JsonAssert.assertObjectEquals(expected, batchItem.getData());
    assertNull(batch.getNextBatch(elResolver));
  }
 
  @Test
  public void testPeopleRequestWithExpressions() throws Exception {
    String xml = "<Content><PeopleRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" "
        + " key=\"key\""
        + " groupId=\"group\""
        + " userId=\"first,second\""
        + " startIndex=\"20\""
        + " count=\"${count}\""
        + " fields=\"${fields}\""
        + "/></Content>";

    elValues.put("count", 10);
    // TODO: try List, JSONArray
    elValues.put("fields", "name,id");
    PipelinedData socialData = new PipelinedData(XmlUtil.parse(xml), null);
    assertFalse(socialData.needsOwner());
    assertFalse(socialData.needsViewer());

    JSONObject expected = new JSONObject("{method: 'people.get', id: 'key', params:"
        + "{groupId: 'group',"
        + "userId: ['first','second'],"
        + "startIndex: 20,"
        + "count: 10,"
        + "fields: ['name','id']"
        + "}}");

    PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);
    assertEquals(1, batch.getPreloads().size());
    PipelinedData.BatchItem batchItem = batch.getPreloads().get("key");
    assertEquals(PipelinedData.BatchType.SOCIAL, batchItem.getType());
    JsonAssert.assertObjectEquals(expected, batchItem.getData());
  }

  @Test
  public void testViewerRequest() throws Exception {
    String xml = "<Content><ViewerRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" "
        + " key=\"key\""
        + " fields=\"name,id\""
        + "/></Content>";

    PipelinedData socialData = new PipelinedData(XmlUtil.parse(xml), null);
    assertFalse(socialData.needsOwner());
    assertTrue(socialData.needsViewer());

    JSONObject expected = new JSONObject("{method: 'people.get', id: 'key', params:"
        + "{userId: ['@viewer'],"
        + "fields: ['name','id']"
        + "}}");

    PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);
    assertEquals(1, batch.getPreloads().size());
    PipelinedData.BatchItem batchItem = batch.getPreloads().get("key");
    assertEquals(PipelinedData.BatchType.SOCIAL, batchItem.getType());
    JsonAssert.assertObjectEquals(expected, batchItem.getData());
  }

  @Test
  public void testOwnerRequest() throws Exception {
    String xml = "<Content><OwnerRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" "
        + " key=\"key\""
        + " fields=\"name,id\""
        + "/></Content>";

    PipelinedData socialData = new PipelinedData(XmlUtil.parse(xml), null);
    assertTrue(socialData.needsOwner());
    assertFalse(socialData.needsViewer());

    JSONObject expected = new JSONObject("{method: 'people.get', id: 'key', params:"
        + "{userId: ['@owner'],"
        + "fields: ['name','id']"
        + "}}");

    PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);
    assertEquals(1, batch.getPreloads().size());
    PipelinedData.BatchItem batchItem = batch.getPreloads().get("key");
    assertEquals(PipelinedData.BatchType.SOCIAL, batchItem.getType());
    JsonAssert.assertObjectEquals(expected, batchItem.getData());
  }

  @Test
  public void testPersonAppData() throws Exception {
    String xml = "<Content><PersonAppDataRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" "
        + " key=\"key\""
        + " userId=\"@viewer\""
        + " fields=\"foo,bar\""
        + "/></Content>";

    PipelinedData socialData = new PipelinedData(XmlUtil.parse(xml), null);
    assertFalse(socialData.needsOwner());
    assertTrue(socialData.needsViewer());

    JSONObject expected = new JSONObject("{method: 'appdata.get', id: 'key', params:"
        + "{userId: ['@viewer'],"
        + "fields: ['foo','bar']"
        + "}}");

    PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);
    assertEquals(1, batch.getPreloads().size());
    PipelinedData.BatchItem batchItem = batch.getPreloads().get("key");
    assertEquals(PipelinedData.BatchType.SOCIAL, batchItem.getType());
    JsonAssert.assertObjectEquals(expected, batchItem.getData());
  }

  @Test
  public void testActivitiesRequest() throws Exception {
    String xml = "<Content><ActivitiesRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" "
        + " key=\"key\""
        + " userId=\"@owner,@viewer\""
        + " startIndex=\"10\""
        + " count=\"20\""
        + " fields=\"foo,bar\""
        + "/></Content>";


    PipelinedData socialData = new PipelinedData(XmlUtil.parse(xml), null);
    assertTrue(socialData.needsOwner());
    assertTrue(socialData.needsViewer());

    JSONObject expected = new JSONObject("{method: 'activities.get', id: 'key', params:"
        + "{userId: ['@owner','@viewer'],"
        + "startIndex: 10,"
        + "count: 20,"
        + "fields: ['foo','bar']"
        + "}}");

    PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);
    assertEquals(1, batch.getPreloads().size());
    PipelinedData.BatchItem batchItem = batch.getPreloads().get("key");
    assertEquals(PipelinedData.BatchType.SOCIAL, batchItem.getType());
    JsonAssert.assertObjectEquals(expected, batchItem.getData());
  }

  @Test
  public void testIgnoreNoNamespace() throws Exception {
    String xml = "<Content><PersonRequest"
        + " key=\"key\""
        + " userId=\"@owner\""
        + " fields=\"name,id\""
        + "/></Content>";

    PipelinedData socialData = new PipelinedData(XmlUtil.parse(xml), null);
    assertFalse(socialData.needsOwner());

    PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);
    assertNull(batch);
  }

  @Test(expected = SpecParserException.class)
  public void testErrorOnUnknownOpensocialElement() throws Exception {
    String xml = "<Content><NotARealElement xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" "
        + "/></Content>";

    new PipelinedData(XmlUtil.parse(xml), null);
  }
 
  @Test
  public void testBatching() throws Exception {
    String xml = "<Content xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\">"
        + "<PeopleRequest key=\"key\" userId=\"${userId}\"/>"
        + "<HttpRequest key=\"key2\" href=\"${key}\"/>"
        + "</Content>";

    PipelinedData socialData = new PipelinedData(XmlUtil.parse(xml), GADGET_URI);
   
    PipelinedData.Batch batch = socialData.getBatch(expressions, elResolver);

    assertTrue(batch.getPreloads().isEmpty());

    // Now have "userId", the next batch should resolve the people request
    elValues.put("userId", "foo");
    batch = batch.getNextBatch(elResolver);
    assertEquals(1, batch.getPreloads().size());
    assertTrue(batch.getPreloads().containsKey("key"));

    // Now, add "key", the next batch should resolve the HTTP request
    elValues.put("key", "somedata");
    batch = batch.getNextBatch(elResolver);
    assertEquals(1, batch.getPreloads().size());
    assertTrue(batch.getPreloads().containsKey("key2"));
   
    // And the final batch should be empty
    assertNull(batch.getNextBatch(elResolver));
  }

  @Test
  public void testVariable() throws Exception {
    String xml = "<Content xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\">"
            + "<osx:Variable xmlns:osx=\"" + PipelinedData.EXTENSION_NAMESPACE + "\" "
            +       "key=\"key\" value=\"${1+1}\"/>"
        + "</Content>";

    PipelinedData pipelinedData = new PipelinedData(XmlUtil.parse(xml), GADGET_URI);
   
    PipelinedData.Batch batch = pipelinedData.getBatch(expressions, elResolver);
    assertFalse(pipelinedData.needsViewer());
    assertFalse(pipelinedData.needsOwner());
   
    assertEquals(1, batch.getPreloads().size());
    BatchItem output = batch.getPreloads().get("key");
    assertEquals(BatchType.VARIABLE, output.getType());
    assertEquals(2L, output.getData());
  }

@Test
  public void httpRequestDefaults() throws Exception {
    String xml = "<Content><HttpRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" "
        + " key=\"key\""
        + " href=\"/example.html\""
        + "/></Content>";

    PipelinedData pipelinedData = new PipelinedData(XmlUtil.parse(xml), GADGET_URI);
    PipelinedData.Batch batch = pipelinedData.getBatch(expressions, elResolver);
    assertFalse(pipelinedData.needsViewer());
    assertFalse(pipelinedData.needsOwner());
   
    assertEquals(1, batch.getPreloads().size());
    BatchItem output = batch.getPreloads().get("key");
    assertEquals(BatchType.HTTP, output.getType());
    RequestAuthenticationInfo preload = (RequestAuthenticationInfo) output.getData();
    assertEquals(AuthType.NONE, preload.getAuthType());
    assertEquals(Uri.parse("http://example.org/example.html"), preload.getHref());   
  }

  @Test
  public void badHrefTest() throws Exception {
    // unparseable url escape
    String xml = "<Content><HttpRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" "
        + " key=\"key\""
        + " href=\"/example.html%\""
        + "/></Content>";

    boolean foundException = false;
    try {
      PipelinedData pipelinedData = new PipelinedData(XmlUtil.parse(xml), GADGET_URI);
      PipelinedData.Batch batch = pipelinedData.getBatch(expressions, elResolver);
    } catch (RuntimeException e) {
      foundException = true;
    }
    assertTrue("found RuntimeException (for now) see SHINDIG-1090", foundException);
  }

  @Test
  public void httpRequestDefaultsSigned() throws Exception {
    String xml = "<Content><HttpRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" "
        + " key=\"key\""
        + " href=\"/example.html\""
        + " authz=\"signed\""
        + " sign_owner=\"false\""
        + "/></Content>";

    PipelinedData pipelinedData = new PipelinedData(XmlUtil.parse(xml), GADGET_URI);
    PipelinedData.Batch batch = pipelinedData.getBatch(expressions, elResolver);
    assertTrue(pipelinedData.needsViewer());
    assertFalse(pipelinedData.needsOwner());
   
    assertEquals(1, batch.getPreloads().size());
    BatchItem output = batch.getPreloads().get("key");
    assertEquals(BatchType.HTTP, output.getType());
    RequestAuthenticationInfo preload = (RequestAuthenticationInfo) output.getData();
    assertEquals(AuthType.SIGNED, preload.getAuthType());
    assertTrue(preload.isSignViewer());
    assertFalse(preload.isSignOwner());
  }
}
TOP

Related Classes of org.apache.shindig.gadgets.spec.PipelinedDataTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.