org.noorganization.instalist.server.api.CategoriesResourceTest.java Source code

Java tutorial

Introduction

Here is the source code for org.noorganization.instalist.server.api.CategoriesResourceTest.java

Source

/*
 * Copyright 2016 Tino Siegmund, Michael Wodniok
 *
 * 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.noorganization.instalist.server.api;

import com.fasterxml.jackson.databind.util.ISO8601Utils;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.glassfish.jersey.test.TestProperties;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.noorganization.instalist.server.AuthenticationFilter;
import org.noorganization.instalist.server.CommonData;
import org.noorganization.instalist.comm.message.CategoryInfo;
import org.noorganization.instalist.server.controller.impl.ControllerFactory;
import org.noorganization.instalist.server.model.Category;
import org.noorganization.instalist.server.model.DeletedObject;
import org.noorganization.instalist.server.model.Device;
import org.noorganization.instalist.server.model.DeviceGroup;
import org.noorganization.instalist.server.support.DatabaseHelper;

import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response;

import java.time.Instant;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import static org.junit.Assert.*;

public class CategoriesResourceTest extends JerseyTest {

    private EntityManager mManager;
    private DeviceGroup mGroup;
    private DeviceGroup mNotAccessibleGroup;
    private String mToken;
    private Category mCategory;
    private Category mNotAccessibleCategory;
    private DeletedObject mDeletedCategory;

    @Override
    protected Application configure() {
        enable(TestProperties.LOG_TRAFFIC);
        enable(TestProperties.DUMP_ENTITY);

        ResourceConfig rtn = new ResourceConfig(CategoriesResource.class);
        rtn.register(AuthenticationFilter.class);
        return rtn;
    }

    @Before
    public void setUp() throws Exception {
        super.setUp();

        CommonData data = new CommonData();

        mManager = DatabaseHelper.getInstance().getManager();
        mManager.getTransaction().begin();
        mGroup = new DeviceGroup();
        Instant now = Instant.now();
        Device aDev = new Device().withAuthorized(true).withGroup(mGroup).withSecret(data.mEncryptedSecret)
                .withName("testDev");
        mCategory = new Category().withGroup(mGroup).withName("cat1").withUUID(UUID.randomUUID()).withUpdated(now);
        mDeletedCategory = new DeletedObject().withGroup(mGroup).withType(DeletedObject.Type.CATEGORY)
                .withUUID(UUID.randomUUID()).withUpdated(now);
        mNotAccessibleGroup = new DeviceGroup().withUpdated(Date.from(now));
        mNotAccessibleCategory = new Category().withGroup(mNotAccessibleGroup).withName("cat2")
                .withUUID(UUID.randomUUID()).withUpdated(now);

        mManager.persist(mGroup);
        mManager.persist(aDev);
        mManager.persist(mCategory);
        mManager.persist(mDeletedCategory);
        mManager.persist(mNotAccessibleGroup);
        mManager.persist(mNotAccessibleCategory);
        mManager.flush();
        mManager.getTransaction().commit();
        mManager.refresh(mGroup);
        mManager.refresh(aDev);
        mManager.refresh(mCategory);
        mManager.refresh(mDeletedCategory);
        mManager.refresh(mNotAccessibleGroup);
        mManager.refresh(mNotAccessibleCategory);

        mToken = ControllerFactory.getAuthController().getTokenByHttpAuth(mManager, aDev.getId(), data.mSecret);
        assertNotNull(mToken);
    }

    @After
    public void tearDown() throws Exception {
        mManager.close();
        super.tearDown();
    }

    @Test
    public void testGetCategories() throws Exception {
        final String url = "/groups/%d/categories";
        Response wrongTokenResponse = target(String.format(url, mGroup.getId())).request()
                .header(HttpHeaders.AUTHORIZATION, "X-Token wrongToken").get();
        assertEquals(401, wrongTokenResponse.getStatus());

        Response wrongGroupResponse = target(String.format(url, mNotAccessibleGroup.getId())).request()
                .header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken).get();
        assertEquals(401, wrongGroupResponse.getStatus());

        Response wrongTimeResponse = target(String.format(url, mGroup.getId()))
                .queryParam("changedsince", "So 7. Feb 18:26:52 CET 2016").request()
                .header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken).get();
        assertEquals(400, wrongTimeResponse.getStatus());

        Response okResponse = target(String.format(url, mGroup.getId())).request()
                .header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken).get();
        assertEquals(200, okResponse.getStatus());
        CategoryInfo[] allCategories = okResponse.readEntity(CategoryInfo[].class);
        assertEquals(2, allCategories.length);
        for (int i = 0; i < 2; i++) {
            assertNotNull(allCategories[i].getLastChanged());
            if (mDeletedCategory.getUUID().equals(UUID.fromString(allCategories[i].getUUID()))) {
                assertNull(allCategories[i].getName());
                assertTrue(allCategories[i].getDeleted());
                assertEquals(mDeletedCategory.getUpdated(), allCategories[i].getLastChanged().toInstant());
            } else if (mCategory.getUUID().equals(UUID.fromString(allCategories[i].getUUID()))) {
                assertEquals("cat1", allCategories[i].getName());
                assertFalse(allCategories[i].getDeleted());
                assertEquals(mCategory.getUpdated(), allCategories[i].getLastChanged().toInstant());
            } else {
                fail("Got wrong category.");
            }
        }

        Response okResponseEmpty = target(String.format(url, mGroup.getId()))
                .queryParam("changedsince", ISO8601Utils.format(new Date(System.currentTimeMillis() + 10000), true))
                .request().header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken).get();
        assertEquals(200, okResponseEmpty.getStatus());
        CategoryInfo[] noCategories = okResponseEmpty.readEntity(CategoryInfo[].class);
        assertEquals(0, noCategories.length);
    }

    @Test
    public void testPutCategory() throws Exception {
        final String url = "/groups/%d/categories/%s";
        Response wrongTokenResponse = target(String.format(url, mGroup.getId(), mCategory.getId())).request()
                .header(HttpHeaders.AUTHORIZATION, "X-Token wrongToken")
                .put(Entity.json(new CategoryInfo().withName("dev111")));
        assertEquals(401, wrongTokenResponse.getStatus());

        Response wrongGroupResponse = target(
                String.format(url, mNotAccessibleGroup.getId(), mCategory.getUUID().toString())).request()
                        .header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken)
                        .put(Entity.json(new CategoryInfo().withName("dev111")));
        assertEquals(401, wrongGroupResponse.getStatus());

        Response wrongCatResponse = target(
                String.format(url, mGroup.getId(), mNotAccessibleCategory.getUUID().toString())).request()
                        .header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken)
                        .put(Entity.json(new CategoryInfo().withName("dev111")));
        assertEquals(404, wrongCatResponse.getStatus());

        Response invalidCatResponse = target(String.format(url, mGroup.getId(), mCategory.getUUID().toString()))
                .request().header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken).put(Entity.json(new CategoryInfo()
                        .withUUID(mNotAccessibleCategory.getUUID().toString()).withName("dev111")));
        assertEquals(400, invalidCatResponse.getStatus());
        mManager.refresh(mNotAccessibleCategory);
        mManager.refresh(mCategory);
        assertEquals("cat1", mCategory.getName());
        assertEquals("cat2", mNotAccessibleCategory.getName());

        Instant beforeChange = Instant.now();
        Thread.sleep(200);
        Response validCatResponse = target(String.format(url, mGroup.getId(), mCategory.getUUID().toString()))
                .request().header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken)
                .put(Entity.json(new CategoryInfo().withName("dev111")));
        assertEquals(200, validCatResponse.getStatus());
        mManager.refresh(mCategory);
        assertEquals("dev111", mCategory.getName());
        assertTrue(beforeChange.isBefore(mCategory.getUpdated()));

        Response conflictCatResponse = target(String.format(url, mGroup.getId(), mCategory.getUUID().toString()))
                .request().header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken)
                .put(Entity.json(new CategoryInfo().withName("cat1").withLastChanged(Date.from(beforeChange))));
        assertEquals(409, conflictCatResponse.getStatus());
        mManager.refresh(mCategory);
        assertEquals("dev111", mCategory.getName());
        assertTrue(beforeChange.isBefore(mCategory.getUpdated()));
    }

    @Test
    public void testPostCategory() throws Exception {
        final String url = "/groups/%d/categories";

        UUID uuid = UUID.randomUUID();
        Response wrongTokenResponse = target(String.format(url, mGroup.getId())).request()
                .header(HttpHeaders.AUTHORIZATION, "X-Token wrongToken")
                .post(Entity.json(new CategoryInfo().withUUID(uuid).withName("cat3")));
        assertEquals(401, wrongTokenResponse.getStatus());

        Response wrongGroupResponse = target(String.format(url, mNotAccessibleGroup.getId())).request()
                .header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken)
                .post(Entity.json(new CategoryInfo().withUUID(uuid).withName("cat3")));
        assertEquals(401, wrongGroupResponse.getStatus());

        Response invalidCatResponse = target(String.format(url, mGroup.getId())).request()
                .header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken)
                .post(Entity.json(new CategoryInfo().withUUID(uuid)));
        assertEquals(400, invalidCatResponse.getStatus());

        Response conflictCatResponse = target(String.format(url, mGroup.getId())).request()
                .header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken)
                .post(Entity.json(new CategoryInfo().withUUID(mCategory.getUUID()).withName("cat3")));
        assertEquals(409, conflictCatResponse.getStatus());

        mManager.refresh(mCategory);
        assertEquals("cat1", mCategory.getName());

        Response validCatResponse = target(String.format(url, mGroup.getId())).request()
                .header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken)
                .post(Entity.json(new CategoryInfo().withUUID(uuid).withName("cat3")));
        assertEquals(201, validCatResponse.getStatus());
        TypedQuery<Category> savedCatQuery = mManager.createQuery(
                "select c from Category c where " + "c.UUID = :uuid and c.group = :groupid", Category.class);
        savedCatQuery.setParameter("uuid", uuid);
        savedCatQuery.setParameter("groupid", mGroup);
        List<Category> savedCats = savedCatQuery.getResultList();
        assertEquals(1, savedCats.size());
        assertEquals("cat3", savedCats.get(0).getName());
    }

    @Test
    public void testDeleteCategoryById() throws Exception {
        final String url = "/groups/%d/categories/%s";
        Response wrongTokenResponse = target(String.format(url, mGroup.getId(), mCategory.getUUID())).request()
                .header(HttpHeaders.AUTHORIZATION, "X-Token " + "wrongToken").delete();
        assertEquals(401, wrongTokenResponse.getStatus());

        Response wrongGroupResponse = target(String.format(url, mNotAccessibleGroup.getId(), mCategory.getUUID()))
                .request().header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken).delete();
        assertEquals(401, wrongGroupResponse.getStatus());

        Response wrongCatResponse = target(String.format(url, mGroup.getId(), mNotAccessibleCategory.getUUID()))
                .request().header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken).delete();
        assertEquals(404, wrongCatResponse.getStatus());
        mManager.clear();
        assertNotNull(mManager.find(Category.class, mNotAccessibleCategory.getId()));

        Response goneCatResponse = target(String.format(url, mGroup.getId(), mDeletedCategory.getUUID())).request()
                .header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken).delete();
        assertEquals(410, goneCatResponse.getStatus());

        Response validCatResponse = target(String.format(url, mGroup.getId(), mCategory.getUUID())).request()
                .header(HttpHeaders.AUTHORIZATION, "X-Token " + mToken).delete();
        assertEquals(200, validCatResponse.getStatus());
        mManager.clear();
        assertNull(mManager.find(Category.class, mCategory.getId()));
        TypedQuery<DeletedObject> deletedCat1Query = mManager.createQuery("select do from "
                + "DeletedObject do where do.UUID = :uuid and do.group = :groupid and " + "do.type = :type",
                DeletedObject.class);
        deletedCat1Query.setParameter("uuid", mCategory.getUUID());
        deletedCat1Query.setParameter("groupid", mGroup);
        deletedCat1Query.setParameter("type", DeletedObject.Type.CATEGORY);
        List<DeletedObject> deletedCat1 = deletedCat1Query.getResultList();
        assertEquals(1, deletedCat1.size());
    }
}