Package org.eclipse.orion.server.tests.servlets.site

Source Code of org.eclipse.orion.server.tests.servlets.site.SiteTest

/*******************************************************************************
* Copyright (c) 2013, 2014 IBM Corporation and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.orion.server.tests.servlets.site;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URISyntaxException;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.orion.internal.server.core.metastore.SimpleMetaStore;
import org.eclipse.orion.internal.server.hosting.SiteConfigurationConstants;
import org.eclipse.orion.internal.server.hosting.SiteInfo;
import org.eclipse.orion.server.core.OrionConfiguration;
import org.eclipse.orion.server.core.ProtocolConstants;
import org.eclipse.orion.server.core.metastore.UserInfo;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.xml.sax.SAXException;

import com.meterware.httpunit.WebConversation;
import com.meterware.httpunit.WebRequest;
import com.meterware.httpunit.WebResponse;

/**
* Tests for the site configurations API.
*
* Basic tests:
* - Create (POST)
* - Retrieve (GET)
* - Update (PUT)
* - Delete (DELETE)
*
* Security tests:
* - User A tries to access user B's site
*/
public class SiteTest extends CoreSiteTest {

  private WebResponse workspaceResponse;
  private JSONObject workspaceObject;

  @BeforeClass
  public static void setUpWorkspace() {
    initializeWorkspaceLocation();
  }

  @Before
  /**
   * Before each test, create a workspace and prepare fields for use by test methods.
   */
  public void setUp() throws CoreException, SAXException, IOException, JSONException {
    webConversation = new WebConversation();
    webConversation.setExceptionsThrownOnErrorStatus(false);
    setUpAuthorization();
    workspaceResponse = basicCreateWorkspace(SimpleMetaStore.DEFAULT_WORKSPACE_NAME);
    workspaceObject = new JSONObject(workspaceResponse.getText());
  }

  @Test
  /**
   * Create site via POST, check that the response has the parameters we expected.
   */
  public void testCreateSite() throws IOException, SAXException, JSONException {
    final String siteName = "My great website";
    final String workspaceId = workspaceObject.getString(ProtocolConstants.KEY_ID);
    final String hostHint = "mySite";
    final String source = "/fizz";
    final String target = "/buzz";
    final JSONArray mappings = makeMappings(new String[][] {{source, target}});

    WebRequest request = getCreateSiteRequest(siteName, workspaceId, mappings, hostHint);
    WebResponse siteResponse = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_CREATED, siteResponse.getResponseCode());

    JSONObject respObject = new JSONObject(siteResponse.getText());
    JSONArray respMappings = respObject.getJSONArray(SiteConfigurationConstants.KEY_MAPPINGS);
    assertEquals(siteName, respObject.get(ProtocolConstants.KEY_NAME));
    assertEquals(workspaceId, respObject.get(SiteConfigurationConstants.KEY_WORKSPACE));
    assertEquals(hostHint, respObject.get(SiteConfigurationConstants.KEY_HOST_HINT));
    assertEquals(1, respMappings.length());
    assertEquals(source, respMappings.getJSONObject(0).get(SiteConfigurationConstants.KEY_SOURCE));
    assertEquals(target, respMappings.getJSONObject(0).get(SiteConfigurationConstants.KEY_TARGET));
  }

  @Test
  /**
   * Attempt to create site with no name, expect 400 Bad Request
   */
  public void testCreateSiteNoName() throws SAXException, IOException {
    final String siteName = "My great website";
    final String hostHint = "mySite";
    WebRequest request = getCreateSiteRequest(siteName, null, null, hostHint);
    WebResponse response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_BAD_REQUEST, response.getResponseCode());
  }

  @Test
  /**
   * Attempt to create site with no workspace, expect 400 Bad Request
   */
  public void testCreateSiteNoWorkspace() throws SAXException, IOException {
    final String siteName = "My great website";
    final String hostHint = "mySite";
    WebRequest request = getCreateSiteRequest(siteName, null, null, hostHint);
    WebResponse response = webConversation.getResponse(request);
    assertEquals(HttpURLConnection.HTTP_BAD_REQUEST, response.getResponseCode());
  }

  @Test
  /**
   * Create a site, then fetch its resource via a GET and check the result.
   */
  public void testRetrieveSite() throws SAXException, JSONException, IOException, URISyntaxException {
    // Create site
    final String name = "Bob's site";
    final String workspaceId = workspaceObject.getString(ProtocolConstants.KEY_ID);
    final JSONArray mappings = makeMappings(new String[][] { {"/foo", "/A"}, {"/bar", "/B"}});
    final String hostHint = "bobhost";
    WebResponse createResp = createSite(name, workspaceId, mappings, hostHint, null);
    JSONObject site = new JSONObject(createResp.getText());

    String location = site.getString(ProtocolConstants.HEADER_LOCATION);

    // Fetch site using its Location and ensure that what we find matches what was POSTed
    WebRequest fetchReq = getRetrieveSiteRequest(location, null);
    WebResponse fetchResp = webConversation.getResponse(fetchReq);
    assertEquals(HttpURLConnection.HTTP_OK, fetchResp.getResponseCode());
    JSONObject fetchedSite = new JSONObject(fetchResp.getText());
    assertEquals(name, fetchedSite.optString(ProtocolConstants.KEY_NAME));
    assertEquals(workspaceId, fetchedSite.optString(SiteConfigurationConstants.KEY_WORKSPACE));
    assertEquals(mappings.toString(), fetchedSite.getJSONArray(SiteConfigurationConstants.KEY_MAPPINGS).toString());
    assertEquals(hostHint, fetchedSite.optString(SiteConfigurationConstants.KEY_HOST_HINT));
  }

  @Test
  /**
   * Create a site, then update it via PUT and check the result.
   */
  public void testUpdateSite() throws SAXException, JSONException, IOException, URISyntaxException {
    // Create site
    final String name = "A site to update";
    final String workspaceId = workspaceObject.getString(ProtocolConstants.KEY_ID);
    final JSONArray mappings = makeMappings(new String[] {"/", "http://www.google.com"});
    final String hostHint = "orion-is-awesome";
    WebResponse createResp = createSite(name, workspaceId, mappings, hostHint, null);
    JSONObject site = new JSONObject(createResp.getText());
    String location = site.getString(ProtocolConstants.HEADER_LOCATION);

    // Update site
    final String newName = "A site that was updated";
    final String newWorkspaceId = "" + Math.random(); // Doesn't matter since we won't start it
    final JSONArray newMappings = makeMappings(new String[] {"/some/path", "/XYZ/webRoot"});
    final String newHostHint = "orion-is-awesomer";

    WebRequest updateReq = getUpdateSiteRequest(location, newName, newWorkspaceId, newMappings, newHostHint, null);
    WebResponse updateResp = webConversation.getResponse(updateReq);
    assertEquals(HttpURLConnection.HTTP_OK, updateResp.getResponseCode());
    JSONObject updatedSite = new JSONObject(updateResp.getText());
    assertEquals(newName, updatedSite.optString(ProtocolConstants.KEY_NAME));
    assertEquals(newWorkspaceId, updatedSite.optString(SiteConfigurationConstants.KEY_WORKSPACE));
    assertEquals(newMappings.toString(), updatedSite.getJSONArray(SiteConfigurationConstants.KEY_MAPPINGS).toString());
    assertEquals(newHostHint, updatedSite.optString(SiteConfigurationConstants.KEY_HOST_HINT));
  }

  @Test
  /**
   * Create a site, then delete it and make sure it's gone.
   */
  public void testDeleteSite() throws SAXException, JSONException, IOException, URISyntaxException, CoreException {
    // Create site
    final String name = "A site to delete";
    final String workspaceId = workspaceObject.getString(ProtocolConstants.KEY_ID);
    WebResponse createResp = createSite(name, workspaceId, null, null, null);
    JSONObject site = new JSONObject(createResp.getText());
    final String siteId = site.getString(ProtocolConstants.KEY_ID);
    String location = site.getString(ProtocolConstants.HEADER_LOCATION);

    UserInfo user = OrionConfiguration.getMetaStore().readUser(testUserId);
    SiteInfo siteInfo = SiteInfo.getSite(user, siteId);
    assertNotNull(siteInfo);

    // Delete site
    WebRequest deleteReq = getDeleteSiteRequest(location);
    WebResponse deleteResp = webConversation.getResponse(deleteReq);
    assertEquals(HttpURLConnection.HTTP_OK, deleteResp.getResponseCode());

    // GET should fail now
    WebRequest getReq = getRetrieveSiteRequest(location, null);
    WebResponse getResp = webConversation.getResponse(getReq);
    assertEquals(HttpURLConnection.HTTP_NOT_FOUND, getResp.getResponseCode());

    user = OrionConfiguration.getMetaStore().readUser(testUserId);
    siteInfo = SiteInfo.getSite(user, siteId);
    assertNull(siteInfo);

    // GET all sites should not include the deleted site
    WebRequest getAllReq = getRetrieveAllSitesRequest(null);
    WebResponse getAllResp = webConversation.getResponse(getAllReq);
    JSONObject allSitesJson = new JSONObject(getAllResp.getText());
    JSONArray allSites = allSitesJson.getJSONArray(SiteConfigurationConstants.KEY_SITE_CONFIGURATIONS);
    for (int i = 0; i < allSites.length(); i++) {
      assertEquals(false, allSites.getJSONObject(i).getString(ProtocolConstants.KEY_ID).equals(siteId));
    }
  }

  @Test
  /**
   * Try to access site created by another user, verify that we can't.
   */
  public void testDisallowedAccess() throws SAXException, JSONException, IOException, URISyntaxException {
    createUser("alice", "alice");
    createUser("bob", "bob");

    // Alice: Create site
    final String name = "A site to delete";
    final String workspaceId = workspaceObject.getString(ProtocolConstants.KEY_ID);
    WebResponse createResp = createSite(name, workspaceId, null, null, "alice");
    JSONObject site = new JSONObject(createResp.getText());
    String location = site.getString(ProtocolConstants.HEADER_LOCATION);

    // Alice: Get site
    WebRequest getReq = getRetrieveSiteRequest(location, "alice");
    WebResponse getResp = webConversation.getResponse(getReq);
    assertEquals(HttpURLConnection.HTTP_OK, getResp.getResponseCode());

    // Bob: Attempt to get Alice's site
    getReq = getRetrieveSiteRequest(location, "bob");
    getResp = webConversation.getResponse(getReq);
    assertEquals(HttpURLConnection.HTTP_NOT_FOUND, getResp.getResponseCode());
  }

}
TOP

Related Classes of org.eclipse.orion.server.tests.servlets.site.SiteTest

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.