org.openmrs.module.webservices.rest.web.ClassHierarchyResourceTest.java Source code

Java tutorial

Introduction

Here is the source code for org.openmrs.module.webservices.rest.web.ClassHierarchyResourceTest.java

Source

/**
 * The contents of this file are subject to the OpenMRS Public License
 * Version 1.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://license.openmrs.org
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific language governing rights and limitations
 * under the License.
 *
 * Copyright (C) OpenMRS, LLC.  All Rights Reserved.
 */
package org.openmrs.module.webservices.rest.web;

import org.apache.commons.beanutils.PropertyUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openmrs.DrugOrder;
import org.openmrs.Order;
import org.openmrs.api.context.Context;
import org.openmrs.module.webservices.rest.SimpleObject;
import org.openmrs.module.webservices.rest.test.Util;
import org.openmrs.module.webservices.rest.web.api.RestService;
import org.openmrs.module.webservices.rest.web.v1_0.resource.openmrs1_8.OrderResource1_8;
import org.openmrs.web.test.BaseModuleWebContextSensitiveTest;
import org.springframework.mock.web.MockHttpServletRequest;

/**
 * Integration tests for the framework that lets a resource handle an entire class hierarchy
 */
public class ClassHierarchyResourceTest extends BaseModuleWebContextSensitiveTest {

    private static final String datasetFilename = "customTestDataset.xml";

    private static final String PATIENT_UUID = "5946f880-b197-400b-9caa-a3c661d23041";

    private static final String SUPERCLASS_UUID = "ff97d3a0-8dbf-11e1-bc86-da3a922f3783";

    private static final String SUBCLASS_UUID = "921de0a3-05c4-444a-be03-e01b4c4b9142";

    private static final String ASPIRIN_CONCEPT_UUID = "15f83cd6-64e9-4e06-a5f9-364d3b14a43d";

    private static final String ASPIRIN_DRUG_UUID = "05ec820a-d297-44e3-be6e-698531d9dd3f";

    private static final String LUNCH_ORDER_TYPE_UUID = "e23733ab-787e-4096-8ba2-577a902d2c2b";

    RequestContext context;

    OrderResource1_8 resource;

    @Before
    public void beforeEachTests() throws Exception {
        executeDataSet(datasetFilename);
        context = new RequestContext();
        resource = (OrderResource1_8) Context.getService(RestService.class)
                .getResourceBySupportedClass(Order.class);
    }

    private SimpleObject buildSuperclass() {
        return new SimpleObject().add(RestConstants.PROPERTY_FOR_TYPE, "order").add("startDate", "2011-02-03")
                .add("patient", PATIENT_UUID).add("concept", ASPIRIN_CONCEPT_UUID)
                .add("orderType", LUNCH_ORDER_TYPE_UUID);
    }

    private SimpleObject buildSubclass() {
        return buildSuperclass().removeProperty("orderType").add(RestConstants.PROPERTY_FOR_TYPE, "drugorder")
                .add("dose", "100").add("units", "mg").add("prn", "true").add("complex", "false")
                .add("drug", ASPIRIN_DRUG_UUID);
    }

    @Test
    public void shouldCreateASuperclass() throws Exception {
        SimpleObject created = (SimpleObject) resource.create(buildSuperclass(), context);
        Util.log("Created superclass", created);
        Assert.assertEquals("order", created.get("type"));
    }

    @Test
    public void shouldCreateASubclass() throws Exception {
        SimpleObject created = (SimpleObject) resource.create(buildSubclass(), context);
        Util.log("Created subclass", created);
        Assert.assertEquals("drugorder", created.get("type"));
    }

    @Test
    public void shouldRetrieveASuperclass() throws Exception {
        SimpleObject retrieved = (SimpleObject) resource.retrieve(SUPERCLASS_UUID, context);
        Util.log("Retrieved superclass", retrieved);
        Assert.assertEquals("order", retrieved.get("type"));
        Assert.assertEquals("a09ab2c5-878e-4905-b25d-5784167d0216", Util.getByPath(retrieved, "concept/uuid"));
    }

    @Test
    public void shouldRetrieveASubclass() throws Exception {
        SimpleObject retrieved = (SimpleObject) resource.retrieve(SUBCLASS_UUID, context);
        Util.log("Retrieved subclass", retrieved);
        Assert.assertEquals("drugorder", retrieved.get("type"));
        Assert.assertEquals(325d, retrieved.get("dose"));
    }

    @Test
    public void shouldUpdateASuperclass() throws Exception {
        String newValue = "Do a CD4 Test STAT!";
        Object updated = resource.update(SUPERCLASS_UUID, new SimpleObject().add("instructions", newValue),
                context);
        Util.log("Updated subclass", updated);
        Assert.assertEquals(newValue, PropertyUtils.getProperty(updated, "instructions"));
    }

    @Test
    public void shouldUpdateASubclass() throws Exception {
        Object updated = resource.update(SUBCLASS_UUID, new SimpleObject().add("dose", "500"), context);
        Util.log("Updated subclass", updated);
        Assert.assertEquals(500d, PropertyUtils.getProperty(updated, "dose"));
    }

    @Test
    public void shouldDeleteASuperclass() throws Exception {
        resource.delete(SUPERCLASS_UUID, "because", context);
        Order deleted = Context.getOrderService().getOrderByUuid(SUPERCLASS_UUID);
        Assert.assertTrue(deleted.isVoided());
    }

    @Test
    public void shouldDeleteASubclass() throws Exception {
        resource.delete(SUBCLASS_UUID, "because", context);
        Order deleted = Context.getOrderService().getOrderByUuid(SUBCLASS_UUID);
        Assert.assertTrue(deleted.isVoided());
    }

    @Test
    public void shouldPurgeASuperclass() throws Exception {
        resource.purge(SUPERCLASS_UUID, context);
        Order purged = Context.getOrderService().getOrderByUuid(SUPERCLASS_UUID);
        Assert.assertNull(purged);
    }

    @Test
    public void shouldPurgeASubclass() throws Exception {
        resource.purge(SUBCLASS_UUID, context);
        Order purged = Context.getOrderService().getOrderByUuid(SUBCLASS_UUID);
        Assert.assertNull(purged);
    }

    @Test
    public void shouldGetAll() throws Exception {
        SimpleObject all = resource.getAll(context);
        Util.log("Get all", all);
        Assert.assertEquals(6, Util.getResultsSize(all));
        // ensure the type property gets added when we return multiple
        Object typeForFirst = Util.getByPath(all, "results[0]/type");
        Assert.assertTrue("drugorder".equals(typeForFirst) || "order".equals(typeForFirst));
    }

    @Test
    public void shouldGetAllOfSubclass() throws Exception {
        context.setType("drugorder");
        SimpleObject all = resource.getAll(context);
        Util.log("Get all of subclass", all);
        Assert.assertEquals(5, Util.getResultsSize(all));
        Assert.assertEquals("drugorder", Util.getByPath(all, "results[0]/type"));
    }

    @Test
    public void shouldUsePropertySetterAndGetterFromSubclassHandler() throws Exception {
        HivDrugOrderSubclassHandler handler = new HivDrugOrderSubclassHandler();
        resource.registerSubclassHandler(handler);
        HivDrugOrder o = handler.newDelegate();
        // this will only work if the @PropertySetter method on the subclass handler is used 
        resource.setProperty(o, "standardRegimenCode", "Peds-1a");
        // this will only work if the @PropertyGetter method on the subclass handler is used
        Object valueSet = resource.getProperty(o, "standardRegimenCode");
        Assert.assertEquals("Peds-1a", valueSet);
    }

    @Test(expected = IllegalArgumentException.class)
    public void shouldNotAllowSpecifyingDefaultTypeOnGetAll() throws Exception {
        context.setType("order");
        resource.getAll(context);
    }

    @Test
    public void shouldGetAllOrdersForAPatient() throws Exception {
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.setParameter("patient", PATIENT_UUID);
        context.setRequest(request);
        SimpleObject simple = resource.search(context);
        Util.log("all orders for patient", simple);
        Assert.assertEquals(2, Util.getResultsSize(simple));
        Object typeForFirst = Util.getByPath(simple, "results[0]/type");
        Assert.assertTrue("drugorder".equals(typeForFirst) || "order".equals(typeForFirst));
    }

    @Test
    public void shouldGetAllDrugOrdersForAPatient() throws Exception {
        context.setType("drugorder");
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.setParameter("patient", PATIENT_UUID);
        context.setRequest(request);
        SimpleObject simple = resource.search(context);
        Util.log("drug orders for patient", simple);
        Assert.assertEquals(1, Util.getResultsSize(simple));
        Assert.assertEquals("drugorder", Util.getByPath(simple, "results[0]/type"));
    }

}