com.ecofactor.qa.automation.api.HttpsReportsAPITest.java Source code

Java tutorial

Introduction

Here is the source code for com.ecofactor.qa.automation.api.HttpsReportsAPITest.java

Source

/*
 * ReportsAPITest.java
 * Copyright (c) 2013, EcoFactor, All Rights Reserved.
 *
 * This software is the confidential and proprietary information of EcoFactor
 * ("Confidential Information"). You shall not disclose such Confidential Information and shall use
 * it only in accordance with the terms of the license agreement you entered into with
 * EcoFactor.
 */
package com.ecofactor.qa.automation.api;

import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.testng.Assert;
import org.testng.annotations.*;

import com.ecofactor.common.pojo.analytics.AggDailyStatsThermostatWeather;
import com.ecofactor.common.pojo.analytics.AggMonthlyStatsThermostatWeather;
import com.ecofactor.common.pojo.analytics.QuantReport;
import com.ecofactor.qa.automation.dao.DailyReportDao;
import com.ecofactor.qa.automation.dao.DaoModule;
import com.ecofactor.qa.automation.dao.HourlyReportDao;
import com.ecofactor.qa.automation.dao.MonthlyReportDao;
import com.ecofactor.qa.automation.dao.SavingsReportDao;
import com.ecofactor.qa.automation.pojo.AggHourlyStatsThermostatWeather;
import com.ecofactor.qa.automation.util.DateUtil;
import com.ecofactor.qa.automation.util.HttpsUtil;
import com.ecofactor.qa.automation.util.JsonUtil;
import com.ecofactor.qa.automation.util.TestLogUtil;
import com.ecofactor.qa.automation.util.UtilModule;
import com.google.inject.Inject;

/**
 * The Class ReportsAPITest.
 * @author $Author:$
 * @version $Rev:$ $Date:$
 */
@Guice(modules = { UtilModule.class, DaoModule.class, HttpsReportsAPIModule.class })
public class HttpsReportsAPITest {

    @Inject
    private HttpsReportsAPIConfig reportsAPIConfig;
    @Inject
    private MonthlyReportDao monthlyReportDao;
    @Inject
    private DailyReportDao dailyReportDao;
    @Inject
    private HourlyReportDao hourlyReportDao;
    @Inject
    private SavingsReportDao savingsReportDao;
    @Inject
    private TestLogUtil testLogUtil;
    private long start;

    /**
     * Inits the method.
     * @param method the method
     * @param param the param
     */
    @BeforeMethod(alwaysRun = true)
    public void initMethod(Method method, Object[] param) {

        testLogUtil.logStart(method);
        start = System.currentTimeMillis();
    }

    /**
     * End method.
     * @param method the method
     */
    @AfterMethod(alwaysRun = true)
    public void endMethod(Method method) {

        long duration = (System.currentTimeMillis() - start) / 1000;
        testLogUtil.logEnd(method, duration);
    }

    /**
     * End suite.
     */
    @AfterSuite(alwaysRun = true)
    public void endSuite() {

        HttpsUtil.closeDriver();

    }

    /**
     * Start suite.
     */
    @BeforeSuite(alwaysRun = true)
    public void startSuite() {
        HttpsUtil.loadDriver();

    }

    /**
     * Invalid location id location usage months.
     */
    @Test(groups = { "sanity1" })
    public void invalidLocationIdLocationUsageMonths() {

        String content = HttpsUtil.get(getLocationUsageURL("00"), getMonthParams(5), 404);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ERROR), mesg);
        }
    }

    /**
     * Invalid location id location usage days.
     */
    @Test(groups = { "sanity1" })
    public void invalidLocationIdLocationUsageDays() {

        String content = HttpsUtil.get(getLocationUsageURL("00"), getDayParams(), 404);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ERROR), mesg);
        }
    }

    /**
     * Invalid location id location usage hours.
     */
    @Test(groups = { "sanity1" })
    public void invalidLocationIdLocationUsageHours() {

        String content = HttpsUtil.get(getLocationUsageURL("00"), getHourParams(), 404);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ERROR), mesg);
        }
    }

    /**
     * Missing start date location usage months.
     */
    @Test(groups = { "sanity1" })
    public void missingStartDateLocationUsageDays() {

        HashMap<String, String> params = getDayParams();
        params.remove(HttpsReportsAPIConfig.START_DATE);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ID);
        String content = HttpsUtil.get(getLocationUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_START_DATE_ERROR));
        }
    }

    /**
     * Missing start date location usage months.
     */
    @Test(groups = { "sanity1" })
    public void missingStartDateLocationUsageMonths() {

        HashMap<String, String> params = getMonthParams(5);
        params.remove(HttpsReportsAPIConfig.START_DATE);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ID);
        String content = HttpsUtil.get(getLocationUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_START_DATE_ERROR));
        }
    }

    /**
     * Missing start date location usage hours.
     */
    @Test(groups = { "sanity1" })
    public void missingStartDateLocationUsageHours() {

        HashMap<String, String> params = getHourParams();
        params.remove(HttpsReportsAPIConfig.START_DATE);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ID);
        String content = HttpsUtil.get(getLocationUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_START_DATE_ERROR));
        }
    }

    /**
     * Missing end date location usage months.
     */
    @Test(groups = { "sanity1" })
    public void missingEndDateLocationUsageMonths() {

        HashMap<String, String> params = getMonthParams(5);
        params.remove(HttpsReportsAPIConfig.END_DATE);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ID);
        String content = HttpsUtil.get(getLocationUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_END_DATE_ERROR));
        }
    }

    /**
     * Missing end date location usage days.
     */
    @Test(groups = { "sanity1" })
    public void missingEndDateLocationUsageDays() {

        HashMap<String, String> params = getDayParams();
        params.remove(HttpsReportsAPIConfig.END_DATE);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ID);
        String content = HttpsUtil.get(getLocationUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_END_DATE_ERROR));
        }
    }

    /**
     * Missing end date location usage hours.
     */
    @Test(groups = { "sanity1" })
    public void missingEndDateLocationUsageHours() {

        HashMap<String, String> params = getHourParams();
        params.remove(HttpsReportsAPIConfig.END_DATE);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ID);
        String content = HttpsUtil.get(getLocationUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_END_DATE_ERROR));
        }
    }

    /**
     * Missing interval location usage months.
     */
    @Test(groups = { "sanity1" })
    public void missingIntervalLocationUsageMonths() {

        HashMap<String, String> params = getMonthParams(5);
        params.remove(HttpsReportsAPIConfig.INTERVAL);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ID);
        String content = HttpsUtil.get(getLocationUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_INTERVAL_ERROR));
        }
    }

    /**
     * Invalid interval location usage months.
     */
    @Test(groups = { "sanity1" })
    public void invalidIntervalLocationUsageMonths() {

        HashMap<String, String> params = getMonthParams(5);
        params.put(HttpsReportsAPIConfig.INTERVAL, "MONTH");
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ID);
        String content = HttpsUtil.get(getLocationUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_INTERVAL_INVALID));
        }
    }

    /**
     * Invalid interval location usage days.
     */
    @Test(groups = { "sanity1" })
    public void invalidIntervalLocationUsageDays() {

        HashMap<String, String> params = getDayParams();
        params.put(HttpsReportsAPIConfig.INTERVAL, "DAY");
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ID);
        String content = HttpsUtil.get(getLocationUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_INTERVAL_INVALID));
        }
    }

    /**
     * Invalid interval location usage hours.
     */
    @Test(groups = { "sanity1" })
    public void invalidIntervalLocationUsageHours() {

        HashMap<String, String> params = getHourParams();
        params.put(HttpsReportsAPIConfig.INTERVAL, "HOUR");
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ID);
        String content = HttpsUtil.get(getLocationUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_INTERVAL_INVALID));
        }
    }

    /**
     * Location usage months.
     */
    @Test(groups = { "sanity1" })
    public void locationUsageMonths() {

        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ID);
        String content = HttpsUtil.get(getLocationUsageURL(id), getMonthParams(5), 200);
        JSONObject object = JsonUtil.parseObject(content);
        assertMonthlyLocationUsageData(object, 5, 2013);
    }

    /**
     * Location usage days.
     */
    @Test(groups = { "sanity1" })
    public void locationUsageDays() {

        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ID);
        String content = HttpsUtil.get(getLocationUsageURL(id), getDayParams(), 200);
        JSONObject object = JsonUtil.parseObject(content);
        assertDailyLocationUsageData(object, 1, 5, 2013);
    }

    /**
     * Location usage hours.
     */
    @Test(groups = { "sanity1" })
    public void locationUsageHours() {

        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ID);
        String content = HttpsUtil.get(getLocationUsageURL(id), getHourParams(), 200);
        JSONObject object = JsonUtil.parseObject(content);
        assertHourlyLocationUsageData(object, 12, 25, 5, 2013);
    }

    /**
     * Invalid user id user usage months.
     */
    @Test(groups = { "sanity1" })
    public void invalidUserIdUserUsageMonths() {

        String content = HttpsUtil.get(getUserUsageURL("00"), getMonthParams(5), 404);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get("Error Messages"));
        JSONArray mesgs = (JSONArray) object.get("Error Messages");
        for (Object mesg : mesgs) {
            Assert.assertEquals("User with Id 00 not found.", mesg);
        }
    }

    /**
     * Invalid user id user usage days.
     */
    @Test(groups = { "sanity1" })
    public void invalidUserIdUserUsageDays() {

        String content = HttpsUtil.get(getUserUsageURL("00"), getDayParams(), 404);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get("Error Messages"));
        JSONArray mesgs = (JSONArray) object.get("Error Messages");
        for (Object mesg : mesgs) {
            Assert.assertEquals("User with Id 00 not found.", mesg);
        }
    }

    /**
     * Invalid user id user usage hours.
     */
    @Test(groups = { "sanity1" })
    public void invalidUserIdUserUsageHours() {

        String content = HttpsUtil.get(getUserUsageURL("00"), getHourParams(), 404);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get("Error Messages"));
        JSONArray mesgs = (JSONArray) object.get("Error Messages");
        for (Object mesg : mesgs) {
            Assert.assertEquals("User with Id 00 not found.", mesg);
        }
    }

    /**
     * Missing start date user usage months.
     */
    @Test(groups = { "sanity1" })
    public void missingStartDateUserUsageMonths() {

        HashMap<String, String> params = getMonthParams(5);
        params.remove(HttpsReportsAPIConfig.START_DATE);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_START_DATE_ERROR));
        }
    }

    /**
     * Missing start date user usage days.
     */
    @Test(groups = { "sanity1" })
    public void missingStartDateUserUsageDays() {

        HashMap<String, String> params = getDayParams();
        params.remove(HttpsReportsAPIConfig.START_DATE);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_START_DATE_ERROR));
        }
    }

    /**
     * Missing start date user usage hours.
     */
    @Test(groups = { "sanity1" })
    public void missingStartDateUserUsageHours() {

        HashMap<String, String> params = getHourParams();
        params.remove(HttpsReportsAPIConfig.START_DATE);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_START_DATE_ERROR));
        }
    }

    /**
     * Missing end date user usage months.
     */
    @Test(groups = { "sanity1" })
    public void missingEndDateUserUsageMonths() {

        HashMap<String, String> params = getMonthParams(5);
        params.remove(HttpsReportsAPIConfig.END_DATE);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_END_DATE_ERROR));
        }
    }

    /**
     * Missing end date user usage days.
     */
    @Test(groups = { "sanity1" })
    public void missingEndDateUserUsageDays() {

        HashMap<String, String> params = getDayParams();
        params.remove(HttpsReportsAPIConfig.END_DATE);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_END_DATE_ERROR));
        }
    }

    /**
     * Missing end date user usage hours.
     */
    @Test(groups = { "sanity1" })
    public void missingEndDateUserUsageHours() {

        HashMap<String, String> params = getHourParams();
        params.remove(HttpsReportsAPIConfig.END_DATE);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_END_DATE_ERROR));
        }
    }

    /**
     * Missing interval user usage months.
     */
    @Test(groups = { "sanity1" })
    public void missingIntervalUserUsageMonths() {

        HashMap<String, String> params = getMonthParams(5);
        params.remove(HttpsReportsAPIConfig.INTERVAL);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_INTERVAL_ERROR));
        }
    }

    /**
     * Invalid interval user usage months.
     */
    @Test(groups = { "sanity1" })
    public void invalidIntervalUserUsageMonths() {

        HashMap<String, String> params = getMonthParams(5);
        params.put(HttpsReportsAPIConfig.INTERVAL, "MONTH");
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_INTERVAL_INVALID));
        }
    }

    /**
     * Invalid interval user usage days.
     */
    @Test(groups = { "sanity1" })
    public void invalidIntervalUserUsageDays() {

        HashMap<String, String> params = getDayParams();
        params.put(HttpsReportsAPIConfig.INTERVAL, "DAY");
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_INTERVAL_INVALID));
        }
    }

    /**
     * Invalid interval user usage hours.
     */
    @Test(groups = { "sanity1" })
    public void invalidIntervalUserUsageHours() {

        HashMap<String, String> params = getHourParams();
        params.put(HttpsReportsAPIConfig.INTERVAL, "HOUR");
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserUsageURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.USAGE_INTERVAL_INVALID));
        }
    }

    /**
     * User usage months.
     */
    @Test(groups = { "sanity1" })
    public void userUsageMonths() {

        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserUsageURL(id), getMonthParams(5), 200);
        JSONObject object = JsonUtil.parseObject(content);
        assertMonthlyUserUsageData(object, 5, 2013);
    }

    /**
     * User usage days.
     */
    @Test(groups = { "sanity1" })
    public void userUsageDays() {

        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserUsageURL(id), getDayParams(), 200);
        JSONObject object = JsonUtil.parseObject(content);
        assertDailyUserUsageData(object, 1, 5, 2013);
    }

    /**
     * User usage hours.
     */
    @Test(groups = { "sanity1" })
    public void userUsageHours() {

        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserUsageURL(id), getHourParams(), 200);
        JSONObject object = JsonUtil.parseObject(content);
        assertHourlyUserUsageData(object, 12, 25, 5, 2013);
    }

    /**
     * Location savings.
     */
    @Test(groups = { "sanity1" })
    public void locationSavings() {

        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ID);
        String content = HttpsUtil.get(getLocationSavingsURL(id), getNotAccumulatedParams(5), 200);
        JSONObject object = JsonUtil.parseObject(content);

        Calendar start = DateUtil.getUTCCalendar();
        start.set(Calendar.MONTH, 5 - 1);
        start.set(Calendar.DATE, 1);
        start.set(Calendar.HOUR, 0);
        start.set(Calendar.MINUTE, 0);
        start.set(Calendar.SECOND, 0);
        Calendar end = DateUtil.getUTCCalendar();
        end.set(Calendar.MONTH, 5 - 1);
        end.set(Calendar.DATE, end.getMaximum(Calendar.DATE));
        end.set(Calendar.HOUR, 23);
        end.set(Calendar.MINUTE, 59);
        end.set(Calendar.SECOND, 0);
        assertLocationSavingsData(object, start, end);
    }

    /**
     * Location savings accumulated.
     */
    @Test(groups = { "sanity1" })
    public void locationSavingsAccumulated() {

        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ID);
        String content = HttpsUtil.get(getLocationSavingsURL(id), getAccumulatedParams(5), 200);
        JSONObject object = JsonUtil.parseObject(content);
        assertAccumulatedLocationSavingsData(object);
    }

    /**
     * Invalid location savings.
     */
    @Test(groups = { "sanity1" })
    public void invalidLocationSavings() {

        HashMap<String, String> params = getNotAccumulatedParams(5);
        params.remove(HttpsReportsAPIConfig.ACCUMULATED);
        params.put(HttpsReportsAPIConfig.ACCUMULATED, "");
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ID);
        String content = HttpsUtil.get(getLocationSavingsURL(id), params, 500);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertTrue(
                    mesg.toString().startsWith(reportsAPIConfig.get(HttpsReportsAPIConfig.INTERNAL_ERROR)));
        }
    }

    /**
     * Invalid location id location savings.
     */
    @Test(groups = { "sanity1" })
    public void invalidLocationIdLocationSavings() {

        HashMap<String, String> params = getNotAccumulatedParams(5);
        String id = "00";
        String content = HttpsUtil.get(getLocationSavingsURL(id), params, 404);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ERROR), mesg);
        }
    }

    /**
     * Invalid location id location savings accumulated.
     */
    @Test(groups = { "sanity1" })
    public void invalidLocationIdLocationSavingsAccumulated() {

        HashMap<String, String> params = getAccumulatedParams(5);
        String id = "00";
        String content = HttpsUtil.get(getLocationSavingsURL(id), params, 404);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_ERROR), mesg);
        }
    }

    /**
     * Invalid location savings accumulated.
     */
    @Test(groups = { "sanity1" })
    public void invalidLocationSavingsAccumulated() {

        HashMap<String, String> params = new HashMap<String, String>();
        params.put(HttpsReportsAPIConfig.ACCUMULATED, "");
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getLocationSavingsURL(id), params, 500);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertTrue(
                    mesg.toString().startsWith(reportsAPIConfig.get(HttpsReportsAPIConfig.INTERNAL_ERROR)));
        }
    }

    /**
     * Missing start date location savings.
     */
    @Test(groups = { "sanity1" })
    public void missingStartDateLocationSavings() {

        HashMap<String, String> params = getNotAccumulatedParams(5);
        params.remove(HttpsReportsAPIConfig.START_DATE);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getLocationSavingsURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.SVG_START_DATE_ERROR));
        }
    }

    /**
     * Missing end date location savings.
     */
    @Test(groups = { "sanity1" })
    public void missingEndDateLocationSavings() {

        HashMap<String, String> params = getNotAccumulatedParams(5);
        params.remove(HttpsReportsAPIConfig.END_DATE);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getLocationSavingsURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.SVG_END_DATE_ERROR));
        }
    }

    /**
     * User savings.
     */
    @Test(groups = { "sanity1" })
    public void userSavings() {

        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserSavingsURL(id), getNotAccumulatedParams(5), 200);
        JSONObject object = JsonUtil.parseObject(content);

        Calendar start = DateUtil.getUTCCalendar();
        start.set(Calendar.MONTH, 5 - 1);
        start.set(Calendar.DATE, 1);
        start.set(Calendar.HOUR, 0);
        start.set(Calendar.MINUTE, 0);
        start.set(Calendar.SECOND, 0);
        Calendar end = DateUtil.getUTCCalendar();
        end.set(Calendar.MONTH, 5 - 1);
        end.set(Calendar.DATE, end.getMaximum(Calendar.DATE));
        end.set(Calendar.HOUR, 23);
        end.set(Calendar.MINUTE, 59);
        end.set(Calendar.SECOND, 0);
        assertUserSavingsData(object, start, end);
    }

    /**
     * User savings accumulated.
     */
    @Test(groups = { "sanity1" })
    public void userSavingsAccumulated() {

        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserSavingsURL(id), getAccumulatedParams(5), 200);
        JSONObject object = JsonUtil.parseObject(content);

        Calendar start = DateUtil.getUTCCalendar();
        start.set(Calendar.MONTH, 5 - 1);
        start.set(Calendar.DATE, 1);
        start.set(Calendar.HOUR, 0);
        start.set(Calendar.MINUTE, 0);
        start.set(Calendar.SECOND, 0);
        Calendar end = DateUtil.getUTCCalendar();
        end.set(Calendar.MONTH, 5 - 1);
        end.set(Calendar.DATE, end.getMaximum(Calendar.DATE));
        end.set(Calendar.HOUR, 23);
        end.set(Calendar.MINUTE, 59);
        end.set(Calendar.SECOND, 0);

        assertAccumulatedUserSavingsData(object, start, end);
    }

    /**
     * Invalid user savings accumulated.
     */
    @Test(groups = { "sanity1" })
    public void invalidUserSavingsAccumulated() {

        HashMap<String, String> params = new HashMap<String, String>();
        params.put(HttpsReportsAPIConfig.ACCUMULATED, "");
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserSavingsURL(id), params, 500);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertTrue(
                    mesg.toString().startsWith(reportsAPIConfig.get(HttpsReportsAPIConfig.INTERNAL_ERROR)));
        }
    }

    /**
     * Invalid user savings.
     */
    @Test(groups = { "sanity1" })
    public void invalidUserSavings() {

        HashMap<String, String> params = getNotAccumulatedParams(5);
        params.remove(HttpsReportsAPIConfig.ACCUMULATED);
        params.put(HttpsReportsAPIConfig.ACCUMULATED, "");
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserSavingsURL(id), params, 500);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertTrue(
                    mesg.toString().startsWith(reportsAPIConfig.get(HttpsReportsAPIConfig.INTERNAL_ERROR)));
        }
    }

    /**
     * Invalid user id user savings.
     */
    @Test(groups = { "sanity1" })
    public void invalidUserIdUserSavings() {

        HashMap<String, String> params = getNotAccumulatedParams(5);
        String id = "00";
        String content = HttpsUtil.get(getUserSavingsURL(id), params, 404);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ERROR), mesg);
        }
    }

    /**
     * Invalid user id user savings accumulated.
     */
    @Test(groups = { "sanity1" })
    public void invalidUserIdUserSavingsAccumulated() {

        HashMap<String, String> params = getAccumulatedParams(5);
        String id = "00";
        String content = HttpsUtil.get(getUserSavingsURL(id), params, 404);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ERROR), mesg);
        }
    }

    /**
     * Missing start date user savings.
     */
    @Test(groups = { "sanity1" })
    public void missingStartDateUserSavings() {

        HashMap<String, String> params = getNotAccumulatedParams(5);
        params.remove(HttpsReportsAPIConfig.START_DATE);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserSavingsURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.SVG_START_DATE_ERROR));
        }
    }

    /**
     * Missing end date user savings.
     */
    @Test(groups = { "sanity1" })
    public void missingEndDateUserSavings() {

        HashMap<String, String> params = getNotAccumulatedParams(5);
        params.remove(HttpsReportsAPIConfig.END_DATE);
        String id = reportsAPIConfig.get(HttpsReportsAPIConfig.USER_ID);
        String content = HttpsUtil.get(getUserSavingsURL(id), params, 400);
        JSONObject object = JsonUtil.parseObject(content);
        Assert.assertNotNull(object);
        Assert.assertNotNull(object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG)));
        JSONArray mesgs = (JSONArray) object.get(reportsAPIConfig.get(HttpsReportsAPIConfig.ERROR_MSG));
        for (Object mesg : mesgs) {
            Assert.assertEquals(mesg.toString().trim(),
                    reportsAPIConfig.get(HttpsReportsAPIConfig.SVG_END_DATE_ERROR));
        }
    }

    /**
     * Gets the user usage url.
     * @param id the id
     * @return the user usage url
     */
    private String getUserUsageURL(String id) {

        String url = reportsAPIConfig.get(HttpsReportsAPIConfig.API);
        url += reportsAPIConfig.get(HttpsReportsAPIConfig.USER_USAGE);
        url = url.replaceFirst("id", id);
        return url;
    }

    /**
     * Gets the location usage url.
     * @param id the id
     * @return the location usage url
     */
    private String getLocationUsageURL(String id) {

        String url = reportsAPIConfig.get(HttpsReportsAPIConfig.API);
        url += reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_USAGE);
        url = url.replaceAll("id", id);
        return url;
    }

    /**
     * Gets the user savings url.
     * @param id the id
     * @return the user savings url
     */
    private String getUserSavingsURL(String id) {

        String url = reportsAPIConfig.get(HttpsReportsAPIConfig.API);
        url += reportsAPIConfig.get(HttpsReportsAPIConfig.USER_SAVINGS);
        url = url.replaceFirst("id", id);
        return url;
    }

    /**
     * Gets the location savings url.
     * @param id the id
     * @return the location savings url
     */
    private String getLocationSavingsURL(String id) {

        String url = reportsAPIConfig.get(HttpsReportsAPIConfig.API);
        url += reportsAPIConfig.get(HttpsReportsAPIConfig.LOCATION_SAVINGS);
        url = url.replaceFirst("id", id);
        return url;
    }

    /**
     * Gets the accumulated params.
     * @param month the month
     * @return the accumulated params
     */
    private HashMap<String, String> getAccumulatedParams(int month) {

        HashMap<String, String> params = new HashMap<String, String>();
        Calendar start = DateUtil.getUTCCalendar();
        start.set(Calendar.MONTH, month - 1);
        start.set(Calendar.DATE, 1);
        Calendar end = DateUtil.getUTCCalendar();
        end.set(Calendar.MONTH, month - 1);
        end.set(Calendar.DATE, end.getMaximum(Calendar.DATE));
        params.put(HttpsReportsAPIConfig.START_DATE, DateUtil.format(start, DateUtil.DATE_FMT));
        params.put(HttpsReportsAPIConfig.END_DATE, DateUtil.format(end, DateUtil.DATE_FMT));
        params.put(HttpsReportsAPIConfig.ACCUMULATED, "true");
        return params;
    }

    /**
     * Gets the not accumulated params.
     * @param month the month
     * @return the not accumulated params
     */
    private HashMap<String, String> getNotAccumulatedParams(int month) {

        HashMap<String, String> params = new HashMap<String, String>();
        Calendar start = DateUtil.getUTCCalendar();
        start.set(Calendar.MONTH, month - 1);
        start.set(Calendar.DATE, 1);
        Calendar end = DateUtil.getUTCCalendar();
        end.set(Calendar.MONTH, month - 1);
        end.set(Calendar.DATE, end.getMaximum(Calendar.DATE));
        params.put(HttpsReportsAPIConfig.START_DATE, DateUtil.format(start, DateUtil.DATE_FMT));
        params.put(HttpsReportsAPIConfig.END_DATE, DateUtil.format(end, DateUtil.DATE_FMT));
        params.put(HttpsReportsAPIConfig.ACCUMULATED, "false");
        return params;
    }

    /**
     * Gets the month params.
     * @param month the month
     * @return the month params
     */
    private HashMap<String, String> getMonthParams(int month) {

        HashMap<String, String> params = new HashMap<String, String>();
        Calendar start = DateUtil.getUTCCalendar();
        start.set(Calendar.MONTH, month - 1);
        start.set(Calendar.DATE, 1);
        start.set(Calendar.HOUR, 12);
        start.set(Calendar.MINUTE, 0);
        start.set(Calendar.SECOND, 0);
        start.set(Calendar.AM_PM, 0);
        Calendar end = DateUtil.getUTCCalendar();
        end.set(Calendar.MONTH, month - 1);
        end.set(Calendar.DATE, end.getMaximum(Calendar.DATE));
        end.set(Calendar.HOUR, 12);
        end.set(Calendar.MINUTE, 0);
        end.set(Calendar.SECOND, 0);
        end.set(Calendar.AM_PM, 0);
        params.put(HttpsReportsAPIConfig.START_DATE, DateUtil.format(start, DateUtil.DATE_FMT));
        params.put(HttpsReportsAPIConfig.END_DATE, DateUtil.format(end, DateUtil.DATE_FMT));
        params.put(HttpsReportsAPIConfig.INTERVAL, "MONTHS");
        return params;
    }

    /**
     * Gets the day params.
     * @return the day params
     */
    private HashMap<String, String> getDayParams() {

        HashMap<String, String> params = new HashMap<String, String>();
        Calendar start = DateUtil.getUTCCalendar();
        start.set(Calendar.DAY_OF_MONTH, 1);
        start.set(Calendar.MONTH, 4);
        params.put(HttpsReportsAPIConfig.START_DATE, DateUtil.format(start, DateUtil.DATE_FMT));
        params.put(HttpsReportsAPIConfig.END_DATE, DateUtil.format(start, DateUtil.DATE_FMT));
        params.put(HttpsReportsAPIConfig.INTERVAL, "DAYS");
        return params;
    }

    /**
     * Gets the hour params.
     * @return the hour params
     */
    private HashMap<String, String> getHourParams() {

        HashMap<String, String> params = new HashMap<String, String>();
        Calendar start = DateUtil.getUTCCalendar();
        start.set(Calendar.DAY_OF_MONTH, 25);
        start.set(Calendar.MONTH, 4);
        start.set(Calendar.HOUR, 12);
        start.set(Calendar.MINUTE, 0);
        start.set(Calendar.SECOND, 0);
        start.set(Calendar.AM_PM, 0);
        params.put(HttpsReportsAPIConfig.START_DATE, DateUtil.format(start, DateUtil.DATE_FMT));
        params.put(HttpsReportsAPIConfig.END_DATE, DateUtil.format(start, DateUtil.DATE_FMT));
        params.put(HttpsReportsAPIConfig.INTERVAL, "HOURS");
        return params;
    }

    /**
     * Assert monthly location usage data.
     * @param object the object
     * @param month the month
     * @param year the year
     */
    private void assertMonthlyLocationUsageData(JSONObject object, int month, int year) {

        Assert.assertNotNull(object);
        JSONObject response = (JSONObject) object.get("response");
        int locationId = new Integer(response.get("id").toString());
        List<AggMonthlyStatsThermostatWeather> stats = monthlyReportDao.listByMonthLocation(locationId, month,
                year);
        double hvacOnTime = 0;

        for (AggMonthlyStatsThermostatWeather stat : stats) {
            hvacOnTime += stat.getHvacStateOnMinutes();
        }

        JSONArray infoList = (JSONArray) response.get("runtimeUsageInfo");
        for (Object info : infoList) {
            JSONObject jsonObject = (JSONObject) info;
            Assert.assertNotNull(jsonObject.get("datetime"));
            Assert.assertNotNull(jsonObject.get("hvacRuntime"));
            Assert.assertEquals(jsonObject.get("hvacRuntime"), hvacOnTime);
            Assert.assertNotNull(jsonObject.get("accessPercentage"));
            Assert.assertNotNull(jsonObject.get("avgIndoorTemperature"));
            Assert.assertNotNull(jsonObject.get("outsideLowTemperature"));
            Assert.assertNotNull(jsonObject.get("outsideHighTemperature"));
            Assert.assertNotNull(jsonObject.get("hasData"));
        }
    }

    /**
     * Assert daily location usage data.
     * @param object the object
     * @param day the day
     * @param month the month
     * @param year the year
     */
    private void assertDailyLocationUsageData(JSONObject object, int day, int month, int year) {

        Assert.assertNotNull(object);
        JSONObject response = (JSONObject) object.get("response");
        int locationId = new Integer(response.get("id").toString());
        List<AggDailyStatsThermostatWeather> stats = dailyReportDao.listByDayLocation(locationId, day, month, year);
        double hvacOnTime = 0;
        double inTempAvg = 0.0;
        double outTempLow = 0.0;
        double outTempHigh = 0.0;
        double accessPercent = 0.0;

        for (AggDailyStatsThermostatWeather stat : stats) {
            hvacOnTime += stat.getHvacStateOnMinutes();
            inTempAvg += stat.getTempInAvg();
            outTempLow += stat.getTempOutLow();
            outTempHigh += stat.getTempOutHigh();
            accessPercent += stat.getAccsPercent();
        }

        inTempAvg = inTempAvg / stats.size();
        outTempLow = outTempLow / stats.size();
        outTempHigh = outTempHigh / stats.size();
        accessPercent = accessPercent / stats.size();

        JSONArray infoList = (JSONArray) response.get("runtimeUsageInfo");
        for (Object info : infoList) {
            JSONObject jsonObject = (JSONObject) info;
            Assert.assertNotNull(jsonObject.get("datetime"));
            Assert.assertNotNull(jsonObject.get("hvacRuntime"));
            Assert.assertEquals(jsonObject.get("hvacRuntime"), hvacOnTime);
            Assert.assertNotNull(jsonObject.get("accessPercentage"));
            Assert.assertEquals(jsonObject.get("accessPercentage"), accessPercent);
            Assert.assertNotNull(jsonObject.get("avgIndoorTemperature"));
            Assert.assertEquals(jsonObject.get("avgIndoorTemperature"), inTempAvg);
            Assert.assertNotNull(jsonObject.get("outsideLowTemperature"));
            Assert.assertEquals(jsonObject.get("outsideLowTemperature"), outTempLow);
            Assert.assertNotNull(jsonObject.get("outsideHighTemperature"));
            Assert.assertEquals(jsonObject.get("outsideHighTemperature"), outTempHigh);
            Assert.assertNotNull(jsonObject.get("hasData"));
        }
    }

    /**
     * Assert hourly location usage data.
     * @param object the object
     * @param hour the hour
     * @param day the day
     * @param month the month
     * @param year the year
     */
    private void assertHourlyLocationUsageData(JSONObject object, int hour, int day, int month, int year) {

        Assert.assertNotNull(object);
        JSONObject response = (JSONObject) object.get("response");
        int locationId = new Integer(response.get("id").toString());
        List<AggHourlyStatsThermostatWeather> stats = hourlyReportDao.listByHourLocation(locationId, hour, day,
                month, year);
        double hvacOnTime = 0;
        double inTempAvg = 0.0;
        double outTempLow = 0.0;
        double outTempHigh = 0.0;
        double accessPercent = 0.0;

        for (AggHourlyStatsThermostatWeather stat : stats) {
            hvacOnTime += stat.getHvacStateOnMinutes();
            inTempAvg += stat.getTempInAvg();
            outTempLow += stat.getTempOutLow();
            outTempHigh += stat.getTempOutHigh();
            accessPercent += stat.getAccsPercent();
        }

        inTempAvg = inTempAvg / stats.size();
        outTempLow = outTempLow / stats.size();
        outTempHigh = outTempHigh / stats.size();
        accessPercent = accessPercent / stats.size();

        JSONArray infoList = (JSONArray) response.get("runtimeUsageInfo");
        for (Object info : infoList) {
            JSONObject jsonObject = (JSONObject) info;
            Assert.assertNotNull(jsonObject.get("datetime"));
            Assert.assertNotNull(jsonObject.get("hvacRuntime"));
            Assert.assertEquals(jsonObject.get("hvacRuntime"), hvacOnTime);
            Assert.assertNotNull(jsonObject.get("accessPercentage"));
            Assert.assertEquals(jsonObject.get("accessPercentage"), accessPercent);
            Assert.assertNotNull(jsonObject.get("avgIndoorTemperature"));
            Assert.assertEquals(jsonObject.get("avgIndoorTemperature"), inTempAvg);
            Assert.assertNotNull(jsonObject.get("outsideLowTemperature"));
            Assert.assertEquals(jsonObject.get("outsideLowTemperature"), outTempLow);
            Assert.assertNotNull(jsonObject.get("outsideHighTemperature"));
            Assert.assertEquals(jsonObject.get("outsideHighTemperature"), outTempHigh);
            Assert.assertNotNull(jsonObject.get("hasData"));
        }
    }

    /**
     * Assert monthly user usage data.
     * @param object the object
     * @param month the month
     * @param year the year
     */
    private void assertMonthlyUserUsageData(JSONObject object, int month, int year) {

        Assert.assertNotNull(object);
        JSONObject response = (JSONObject) object.get("response");
        int userId = new Integer(response.get("userId").toString());
        List<AggMonthlyStatsThermostatWeather> stats = monthlyReportDao.listByMonthUser(userId, month, year);
        double hvacOnTime = 0;

        for (AggMonthlyStatsThermostatWeather stat : stats) {
            hvacOnTime += stat.getHvacStateOnMinutes();
        }

        JSONArray array = (JSONArray) response.get("locationsRuntimeUsageInfoList");
        JSONArray infoList = (JSONArray) ((JSONObject) array.get(0)).get("runtimeUsageInfo");

        for (Object info : infoList) {
            JSONObject jsonObject = (JSONObject) info;
            Assert.assertNotNull(jsonObject.get("datetime"));
            Assert.assertNotNull(jsonObject.get("hvacRuntime"));
            Assert.assertEquals(jsonObject.get("hvacRuntime"), hvacOnTime);
            Assert.assertNotNull(jsonObject.get("accessPercentage"));
            Assert.assertNotNull(jsonObject.get("avgIndoorTemperature"));
            Assert.assertNotNull(jsonObject.get("outsideLowTemperature"));
            Assert.assertNotNull(jsonObject.get("outsideHighTemperature"));
            Assert.assertNotNull(jsonObject.get("hasData"));
        }
    }

    /**
     * Assert daily user usage data.
     * @param object the object
     * @param day the day
     * @param month the month
     * @param year the year
     */
    private void assertDailyUserUsageData(JSONObject object, int day, int month, int year) {

        Assert.assertNotNull(object);
        JSONObject response = (JSONObject) object.get("response");
        int userId = new Integer(response.get("userId").toString());
        List<AggDailyStatsThermostatWeather> stats = dailyReportDao.listByDayUser(userId, day, month, year);
        double hvacOnTime = 0;
        double inTempAvg = 0.0;
        double outTempLow = 0.0;
        double outTempHigh = 0.0;
        double accessPercent = 0.0;

        for (AggDailyStatsThermostatWeather stat : stats) {
            hvacOnTime += stat.getHvacStateOnMinutes();
            inTempAvg += stat.getTempInAvg();
            outTempLow += stat.getTempOutLow();
            outTempHigh += stat.getTempOutHigh();
            accessPercent += stat.getAccsPercent();
        }

        inTempAvg = inTempAvg / stats.size();
        outTempLow = outTempLow / stats.size();
        outTempHigh = outTempHigh / stats.size();
        accessPercent = accessPercent / stats.size();

        JSONArray array = (JSONArray) response.get("locationsRuntimeUsageInfoList");
        JSONArray infoList = (JSONArray) ((JSONObject) array.get(0)).get("runtimeUsageInfo");

        for (Object info : infoList) {
            JSONObject jsonObject = (JSONObject) info;
            Assert.assertNotNull(jsonObject.get("datetime"));
            Assert.assertNotNull(jsonObject.get("hvacRuntime"));
            Assert.assertEquals(jsonObject.get("hvacRuntime"), hvacOnTime);
            Assert.assertNotNull(jsonObject.get("accessPercentage"));
            Assert.assertEquals(jsonObject.get("accessPercentage"), accessPercent);
            Assert.assertNotNull(jsonObject.get("avgIndoorTemperature"));
            Assert.assertEquals(jsonObject.get("avgIndoorTemperature"), inTempAvg);
            Assert.assertNotNull(jsonObject.get("outsideLowTemperature"));
            Assert.assertEquals(jsonObject.get("outsideLowTemperature"), outTempLow);
            Assert.assertNotNull(jsonObject.get("outsideHighTemperature"));
            Assert.assertEquals(jsonObject.get("outsideHighTemperature"), outTempHigh);
            Assert.assertNotNull(jsonObject.get("hasData"));
        }
    }

    /**
     * Assert hourly user usage data.
     * @param object the object
     * @param hour the hour
     * @param day the day
     * @param month the month
     * @param year the year
     */
    private void assertHourlyUserUsageData(JSONObject object, int hour, int day, int month, int year) {

        Assert.assertNotNull(object);
        JSONObject response = (JSONObject) object.get("response");
        int userId = new Integer(response.get("userId").toString());
        List<AggHourlyStatsThermostatWeather> stats = hourlyReportDao.listByHourUser(userId, hour, day, month,
                year);
        double hvacOnTime = 0;
        double inTempAvg = 0.0;
        double outTempLow = 0.0;
        double outTempHigh = 0.0;
        double accessPercent = 0.0;

        for (AggHourlyStatsThermostatWeather stat : stats) {
            hvacOnTime += stat.getHvacStateOnMinutes();
            inTempAvg += stat.getTempInAvg();
            outTempLow += stat.getTempOutLow();
            outTempHigh += stat.getTempOutHigh();
            accessPercent += stat.getAccsPercent();
        }

        inTempAvg = inTempAvg / stats.size();
        outTempLow = outTempLow / stats.size();
        outTempHigh = outTempHigh / stats.size();
        accessPercent = accessPercent / stats.size();

        JSONArray array = (JSONArray) response.get("locationsRuntimeUsageInfoList");
        JSONArray infoList = (JSONArray) ((JSONObject) array.get(0)).get("runtimeUsageInfo");

        for (Object info : infoList) {
            JSONObject jsonObject = (JSONObject) info;
            Assert.assertNotNull(jsonObject.get("datetime"));
            Assert.assertNotNull(jsonObject.get("hvacRuntime"));
            Assert.assertEquals(jsonObject.get("hvacRuntime"), hvacOnTime);
            Assert.assertNotNull(jsonObject.get("accessPercentage"));
            Assert.assertEquals(jsonObject.get("accessPercentage"), accessPercent);
            Assert.assertNotNull(jsonObject.get("avgIndoorTemperature"));
            Assert.assertEquals(jsonObject.get("avgIndoorTemperature"), inTempAvg);
            Assert.assertNotNull(jsonObject.get("outsideLowTemperature"));
            Assert.assertEquals(jsonObject.get("outsideLowTemperature"), outTempLow);
            Assert.assertNotNull(jsonObject.get("outsideHighTemperature"));
            Assert.assertEquals(jsonObject.get("outsideHighTemperature"), outTempHigh);
            Assert.assertNotNull(jsonObject.get("hasData"));
        }
    }

    /**
     * Assert location savings data.
     * @param object the object
     * @param startDate the start date
     * @param endDate the end date
     */
    private void assertLocationSavingsData(JSONObject object, Calendar startDate, Calendar endDate) {

        Assert.assertNotNull(object);
        JSONArray array = (JSONArray) object.get("response");
        for (Object obj : array) {
            JSONObject jsonObject = (JSONObject) obj;
            JSONArray list = (JSONArray) jsonObject.get("thermostatEnergySavingsList");
            for (Object aObj : list) {
                JSONObject json = (JSONObject) aObj;
                Assert.assertNotNull(json.get("thermostatId"));
                int thermostatId = new Integer(json.get("thermostatId").toString());
                Assert.assertNotNull(json.get("runtimeWithEcoFactor"));
                double runtime = new Double(json.get("runtimeWithEcoFactor").toString());
                Assert.assertNotNull(jsonObject.get("runtimeSavings"));
                double savings = new Double(json.get("runtimeSavings").toString());
                verifyDB(thermostatId, startDate, endDate, runtime, savings);
            }
        }
    }

    /**
     * Assert accumulated location savings data.
     * @param object the object
     */
    private void assertAccumulatedLocationSavingsData(JSONObject object) {

        int thermostatId = 0;
        double runtime = 0;
        double savings = 0;

        Assert.assertNotNull(object);
        JSONObject obj = (JSONObject) object.get("response");
        JSONArray list = (JSONArray) obj.get("locationEnergySavingsInfo");
        for (Object aObj : list) {
            JSONObject jsonObject = (JSONObject) aObj;
            JSONArray thermostatList = (JSONArray) jsonObject.get("thermostatEnergySavingsList");
            for (Object thermostat : thermostatList) {
                JSONObject json = (JSONObject) thermostat;
                Assert.assertNotNull(json.get("thermostatId"));
                thermostatId = new Integer(json.get("thermostatId").toString());
                Assert.assertNotNull(json.get("runtimeWithEcoFactor"));
                runtime += new Double(json.get("runtimeWithEcoFactor").toString());
                Assert.assertNotNull(jsonObject.get("runtimeSavings"));
                savings += new Double(json.get("runtimeSavings").toString());
            }
        }

        verifyDB(thermostatId, runtime, savings);
    }

    /**
     * Assert user savings data.
     * @param object the object
     * @param startDate the start date
     * @param endDate the end date
     */
    private void assertUserSavingsData(JSONObject object, Calendar startDate, Calendar endDate) {

        Assert.assertNotNull(object);
        JSONArray array = (JSONArray) ((JSONObject) object.get("response")).get("locationEnergySavingsInfoList");
        for (Object obj : array) {
            JSONArray list = (JSONArray) obj;
            for (Object aObj : list) {
                JSONObject jsonObject = (JSONObject) aObj;
                JSONArray thermostatList = (JSONArray) jsonObject.get("thermostatEnergySavingsList");
                for (Object thermostat : thermostatList) {
                    JSONObject json = (JSONObject) thermostat;
                    Assert.assertNotNull(json.get("thermostatId"));
                    int thermostatId = new Integer(json.get("thermostatId").toString());
                    Assert.assertNotNull(json.get("runtimeWithEcoFactor"));
                    double runtime = new Double(json.get("runtimeWithEcoFactor").toString());
                    Assert.assertNotNull(jsonObject.get("runtimeSavings"));
                    double savings = new Double(json.get("runtimeSavings").toString());
                    verifyDB(thermostatId, startDate, endDate, runtime, savings);
                }
            }
        }
    }

    /**
     * Verify db.
     * @param thermostatId the thermostat id
     * @param startDate the start date
     * @param endDate the end date
     * @param runtime the runtime
     * @param savings the savings
     */
    private void verifyDB(int thermostatId, Calendar startDate, Calendar endDate, double runtime, double savings) {

        List<QuantReport> reports = savingsReportDao.listThermostatSavings(thermostatId, startDate, endDate);
        for (QuantReport report : reports) {
            String data = report.getReportData();
            JSONObject object = JsonUtil.parseObject(data);
            JSONObject heat = (JSONObject) object.get("Heat");
            JSONObject cool = (JSONObject) object.get("Cool");

            double totalRuntimeHours = new Double(heat.get("fullRuntimeHours").toString())
                    + new Double(cool.get("fullRuntimeHours").toString());
            double totalSavedHours = new Double(heat.get("fullSavedHours").toString())
                    + new Double(cool.get("fullSavedHours").toString());

            Assert.assertEquals(runtime, totalRuntimeHours);
            Assert.assertEquals(savings, totalSavedHours);
        }
    }

    /**
     * Assert accumulated user savings data.
     * @param object the object
     * @param startDate the start date
     * @param endDate the end date
     */
    private void assertAccumulatedUserSavingsData(JSONObject object, Calendar startDate, Calendar endDate) {

        Assert.assertNotNull(object);

        int thermostatId = 0;
        double runtime = 0;
        double savings = 0;

        JSONArray array = (JSONArray) ((JSONObject) object.get("response")).get("locationEnergySavingsInfoList");
        for (Object obj : array) {
            JSONArray list = (JSONArray) ((JSONObject) obj).get("locationEnergySavingsInfo");
            for (Object aObj : list) {
                JSONObject jsonObject = (JSONObject) aObj;
                JSONArray thermostatList = (JSONArray) jsonObject.get("thermostatEnergySavingsList");
                for (Object thermostat : thermostatList) {
                    JSONObject json = (JSONObject) thermostat;
                    Assert.assertNotNull(json.get("thermostatId"));
                    thermostatId = new Integer(json.get("thermostatId").toString());
                    Assert.assertNotNull(json.get("runtimeWithEcoFactor"));
                    runtime += new Double(json.get("runtimeWithEcoFactor").toString());
                    Assert.assertNotNull(jsonObject.get("runtimeSavings"));
                    savings += new Double(json.get("runtimeSavings").toString());
                }
            }
        }

        verifyDB(thermostatId, runtime, savings);
    }

    /**
     * Verify db.
     * @param thermostatId the thermostat id
     * @param runtime the runtime
     * @param savings the savings
     */
    private void verifyDB(int thermostatId, double runtime, double savings) {

        double totalSavedHours = 0;

        List<QuantReport> reports = savingsReportDao.listThermostatSavings(thermostatId);
        for (QuantReport report : reports) {
            String data = report.getReportData();
            JSONObject object = JsonUtil.parseObject(data);
            JSONObject heat = (JSONObject) object.get("Heat");
            JSONObject cool = (JSONObject) object.get("Cool");

            totalSavedHours += (new Double(heat.get("fullSavedHours").toString())
                    + new Double(cool.get("fullSavedHours").toString()));
        }

        Assert.assertEquals(savings, totalSavedHours);
    }
}