com.scvngr.levelup.core.model.UserTest.java Source code

Java tutorial

Introduction

Here is the source code for com.scvngr.levelup.core.model.UserTest.java

Source

/*
 * Copyright (C) 2014 SCVNGR, Inc. d/b/a LevelUp
 *
 * 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 com.scvngr.levelup.core.model;

import android.os.Parcel;
import android.test.MoreAsserts;
import android.test.suitebuilder.annotation.SmallTest;

import com.scvngr.levelup.core.model.factory.json.UserJsonFactory;
import com.scvngr.levelup.core.test.JsonTestUtil;
import com.scvngr.levelup.core.test.SupportAndroidTestCase;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;

/**
 * Tests {@link com.scvngr.levelup.core.model.User}.
 */
public final class UserTest extends SupportAndroidTestCase {

    @SmallTest
    public void testParcel_full() throws JSONException {
        {
            final JSONObject object = UserFixture.getFullJsonObject();

            final User user = new UserJsonFactory().from(object);
            final Parcel parcel = Parcel.obtain();
            user.writeToParcel(parcel, 0);
            parcel.setDataPosition(0);

            final User parceled = User.CREATOR.createFromParcel(parcel);
            assertEquals(user, parceled);
            assertTrue(user.getCustomAttributes().containsKey("test_attr"));
            assertTrue(user.getCustomAttributes().containsKey("test_attr2"));
            assertEquals("0", user.getCustomAttributes().get("test_attr"));
            assertEquals("1", user.getCustomAttributes().get("test_attr2"));
        }

        {
            final JSONObject object = UserFixture.getMinimalJsonObject();

            final User user = new UserJsonFactory().from(object);
            final Parcel parcel = Parcel.obtain();
            user.writeToParcel(parcel, 0);
            parcel.setDataPosition(0);

            final User parceled = User.CREATOR.createFromParcel(parcel);
            assertEquals(user, parceled);
        }

        {
            final JSONObject object = UserFixture.getFullJsonObject();

            object.remove(UserJsonFactory.JsonKeys.CUSTOM_ATTRIBUTES);
            final User user = new UserJsonFactory().from(object);
            final Parcel parcel = Parcel.obtain();
            user.writeToParcel(parcel, 0);
            parcel.setDataPosition(0);

            final User parceled = User.CREATOR.createFromParcel(parcel);
            assertEquals(user, parceled);
            assertNull(parceled.getCustomAttributes());
        }
    }

    @SmallTest
    public void testParcel_valid() throws JSONException {
        final JSONObject object = UserFixture.getMinimalJsonObject();

        object.remove(UserJsonFactory.JsonKeys.CUSTOM_ATTRIBUTES);
        final User user = new UserJsonFactory().from(object);
        final Parcel parcel = Parcel.obtain();
        try {
            user.writeToParcel(parcel, 0);
            parcel.setDataPosition(0);

            final User parceled = User.CREATOR.createFromParcel(parcel);
            assertEquals(user, parceled);
        } finally {
            parcel.recycle();
        }
    }

    /**
     * Tests {@link #equals(Object)} and {@link #hashCode()} methods.
     *
     * @throws org.json.JSONException for parsing errors.
     */
    @SmallTest
    public void testEqualsAndHashCode() throws JSONException {
        // Test identical objects
        final User user1 = new UserJsonFactory().from(UserFixture.getFullJsonObject());
        User user2 = new UserJsonFactory().from(UserFixture.getFullJsonObject());
        MoreAsserts.checkEqualsAndHashCodeMethods(user1, user2, true);

        /*
         * Test standard variations on all JsonKeys values (and check for any keys we may have added
         * that didn't make their way into equals/hashcode and the tests explicitly).
         *
         * CUSTOM_ATTRIBUTES needs to be tested by hand since it is deserialized into a dictionary.
         * MODEL_ROOT is only used for automatically un-nesting and isn't used for an attribute.
         */
        JsonTestUtil.checkEqualsAndHashCodeOnJsonVariants(UserJsonFactory.JsonKeys.class, new UserJsonFactory(),
                UserFixture.getFullJsonObject(), new String[] { "CUSTOM_ATTRIBUTES", "MODEL_ROOT" });

        // Modifying a single custom attribute should be unequal/give different hashcode
        final HashMap<String, String> customAttributesMap = new HashMap<String, String>();
        // Changed value
        customAttributesMap.put("test_attr", "1");
        customAttributesMap.put("test_attr2", "1");
        final JSONObject customAttributesObject = new JSONObject(customAttributesMap);
        user2 = new UserJsonFactory().from(UserFixture.getFullJsonObject()
                .put(UserJsonFactory.JsonKeys.CUSTOM_ATTRIBUTES, customAttributesObject));
        MoreAsserts.checkEqualsAndHashCodeMethods(user1, user2, false);
    }

    @SmallTest
    public void testEqualsAndHashCode_no_total_savings() throws JSONException {
        final User userModelWithNoTotalSavings = new UserJsonFactory().from(UserFixture.getMinimalJsonObject());

        final JSONObject userJsonWithTotalSavings = UserFixture.getMinimalJsonObject();
        userJsonWithTotalSavings.put(UserJsonFactory.JsonKeys.TOTAL_SAVINGS_AMOUNT, 2000);
        final User userModelWithTotalSavings = new UserJsonFactory().from(userJsonWithTotalSavings);

        MoreAsserts.checkEqualsAndHashCodeMethods(userModelWithNoTotalSavings, userModelWithNoTotalSavings, true);
        MoreAsserts.checkEqualsAndHashCodeMethods(userModelWithTotalSavings, userModelWithTotalSavings, true);

        MoreAsserts.checkEqualsAndHashCodeMethods(userModelWithNoTotalSavings, userModelWithTotalSavings, false);
    }

    /**
     * Tests that {@link com.scvngr.levelup.core.model.User#toString()} gives a value.
     *
     * @throws org.json.JSONException if there was a problem running toString.
     */
    @SmallTest
    public void testToString() throws JSONException {
        final User user = new UserJsonFactory().from(UserFixture.getMinimalJsonObject());
        final String string = user.toString();
        assertTrue(string.length() > 0);
    }
}