/** * Copyright 2010 Google Inc. * * Licensed 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.waveprotocol.wave.client.gadget.renderer; import static org.waveprotocol.wave.model.gadget.GadgetConstants.AUTHOR_ATTRIBUTE; import static org.waveprotocol.wave.model.gadget.GadgetConstants.CATEGORY_TAGNAME; import static org.waveprotocol.wave.model.gadget.GadgetConstants.TAGNAME; import static org.waveprotocol.wave.model.gadget.GadgetConstants.KEY_ATTRIBUTE; import static org.waveprotocol.wave.model.gadget.GadgetConstants.PREFS_ATTRIBUTE; import static org.waveprotocol.wave.model.gadget.GadgetConstants.STATE_ATTRIBUTE; import static org.waveprotocol.wave.model.gadget.GadgetConstants.TITLE_ATTRIBUTE; import static org.waveprotocol.wave.model.gadget.GadgetConstants.URL_ATTRIBUTE; import com.google.gwt.http.client.URL; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONString; import com.google.gwt.junit.client.GWTTestCase; import com.google.gwt.user.client.Window.Location; import org.waveprotocol.wave.client.gadget.GadgetXmlUtil; import org.waveprotocol.wave.model.document.util.XmlStringBuilder; import org.waveprotocol.wave.model.id.ModernIdSerialiser; import org.waveprotocol.wave.model.id.WaveId; import org.waveprotocol.wave.model.id.WaveletId; import org.waveprotocol.wave.model.id.WaveletName; /** * Tests Gadget class functionality that can be tested outside of the Editor framework. * * * TODO: Reorganize tests after the client refactoring is complete. */ public class GadgetNonEditorGwtTest extends GWTTestCase { private static final String VIEW_NAME = "canvas"; private static class FakeLocale implements Locale { @Override public String getCountry() { return "OZ"; } @Override public String getLanguage() { return "wizard"; } } private static final String GADGET_SERVER = "-opensocial.googleusercontent.com"; private static final String LOGIN_NAME = "johnny_addgadget@rentacoder.com"; /** * Tests the construct XML function which is used to insert gadgets into wave * XML representation. */ public void testConstructXml() { String xmlSource = "http://test.com/gadget.xml"; XmlStringBuilder builder = GadgetXmlUtil.constructXml(xmlSource, "", LOGIN_NAME); String xml = builder.toString(); String expectedValue = "<" + TAGNAME + " " + URL_ATTRIBUTE + "=\"" + xmlSource + "\"" + " " + TITLE_ATTRIBUTE + "=\"\"" + " " + PREFS_ATTRIBUTE + "=\"\"" + " " + STATE_ATTRIBUTE + "=\"\"" + " " + AUTHOR_ATTRIBUTE + "=\"johnny_addgadget@rentacoder.com\">" + "</" + TAGNAME + ">"; assertEquals(expectedValue, xml); String[] categories = {"chess", "game"}; builder = GadgetXmlUtil.constructXml(xmlSource, "my pref", categories, LOGIN_NAME); xml = builder.toString(); expectedValue = "<" + TAGNAME + " " + URL_ATTRIBUTE + "=\"" + xmlSource + "\"" + " " + TITLE_ATTRIBUTE + "=\"\"" + " " + PREFS_ATTRIBUTE + "=\"my pref\"" + " " + STATE_ATTRIBUTE + "=\"\"" + " " + AUTHOR_ATTRIBUTE + "=\"johnny_addgadget@rentacoder.com\">" + "<" + CATEGORY_TAGNAME + " " + KEY_ATTRIBUTE + "=\"chess\"" + ">" + "</" + CATEGORY_TAGNAME + ">" + "<" + CATEGORY_TAGNAME + " " + KEY_ATTRIBUTE + "=\"game\"" + ">" + "</" + CATEGORY_TAGNAME + ">" + "</" + TAGNAME + ">"; assertEquals(expectedValue, xml); } /** * Returns a test gadget metadata object. * * @param xmlSource gadget xml * @return the metadata object */ public GadgetMetadata getTestMetadata(String xmlSource) { String iFrameUrl = "//0" + GADGET_SERVER + "/gadgets/ifr?url=http://test.com/gadget.xml&view=canvas"; JSONObject canvasViewData = new JSONObject(); JSONObject viewData = new JSONObject(); viewData.put(VIEW_NAME, canvasViewData); JSONObject jsonData = new JSONObject(); jsonData.put("iframeUrl", new JSONString(iFrameUrl)); jsonData.put("views", viewData); jsonData.put("url", new JSONString(xmlSource)); jsonData.put("userPrefs", new JSONObject()); return new GadgetMetadata(jsonData); } /** * Tests the method that removes redundant parts from iframe URLs returned in * gadget metadata by GGS. */ public void testCleanUrl() { String url = "//0-a-wave-opensocial.googleusercontent.com/gadgets/ifr?v=f5&container=wave" + "&view=default&debug=0&lang=en&url=http%3A%2F%2Fwave-api.appspot.com%2Fpublic%2Fgadgets" + "%2Ftest%2Fgadget.xml&country=ALL&st=SECURITY&libs=core%3Adynamic-height%3Awave" + "&mid=31415926#rpctoken=4815162342&st=WRONGPLACE&up_test=done&test=see&up_again=not"; String cleanUrl = "//0-a-wave-opensocial.googleusercontent.com/gadgets/ifr?v=f5" + "&container=wave&view=default&url=http%3A%2F%2Fwave-api.appspot.com%2Fpublic" + "%2Fgadgets%2Ftest%2Fgadget.xml&libs=core%3Adynamic-height%3Awave#test=see"; assertEquals(cleanUrl, GadgetWidget.cleanUrl(url)); } /** * Tests the helper method that extracts and verifies the iframe URL host. */ public void testGetIframeHost() { assertEquals("", GadgetWidget.getIframeHost("http://www.google.com/hey!")); assertEquals("//www.google.com/", GadgetWidget.getIframeHost("//www.google.com/hey!")); assertEquals("//googleusercontent.com/", GadgetWidget.getIframeHost("//googleusercontent.com/hey!")); assertEquals("//!!.googleusercontent.com/", GadgetWidget.getIframeHost("//!!.googleusercontent.com/hey!")); assertEquals("//123-yesgoogleusercontent.com/", GadgetWidget.getIframeHost("//123-yesgoogleusercontent.com/hey!")); assertEquals("//123-yes.googleusercontent.com/", GadgetWidget.getIframeHost("//123-yes.googleusercontent.com/hey!")); } /** * Tests the IFrame URI generator of Gadget class. */ public void testIframeUri() { String xmlSource = "http://test.com/gadget.xml"; String href = "http://" + Location.getHost(); String hrefEscaped = href.replace("?", "%3F"); if (hrefEscaped.endsWith("/")) { hrefEscaped = hrefEscaped.substring(0, hrefEscaped.length() - 1); } int clientInstanceId = 1234; GadgetUserPrefs userPrefs = GadgetUserPrefs.create(); userPrefs.put("pref1", "value1"); userPrefs.put("pref2", "value2"); GadgetMetadata metadata = getTestMetadata(xmlSource); WaveId waveId = WaveId.of("wave.google.com", "123"); WaveletId waveletId = WaveletId.of("wave.google.com", "conv+root"); WaveletName name = WaveletName.of(waveId, waveletId); String securityToken = "SECURITY"; GadgetWidget gadget = GadgetWidget.createForTesting( clientInstanceId, userPrefs, name, securityToken, new FakeLocale()); int gadgetInstanceId = -12345; String url = gadget.buildIframeUrl(gadgetInstanceId, metadata.getIframeUrl(VIEW_NAME)); String expectedValue = "//0" + GADGET_SERVER + "/gadgets" + "/ifr?url=http://test.com/gadget.xml&view=canvas&nocache=1&mid=" + gadgetInstanceId + "&lang=wizard&country=OZ&parent=" + hrefEscaped + "&wave=1&waveId=" + URL.encodeQueryString(ModernIdSerialiser.INSTANCE.serialiseWaveId(waveId)) + "#rpctoken=" + gadget.getRpcToken() + "&st=" + securityToken + "&up_pref1=value1&up_pref2=value2"; assertEquals(expectedValue, url); } @Override public String getModuleName() { return "org.waveprotocol.wave.client.gadget.tests"; } }