/*
* Copyright (c) 2016 Google Inc.
*
* 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.google.samples.apps.iosched.navigation;
import android.content.Context;
import android.test.suitebuilder.annotation.SmallTest;
import com.google.samples.apps.iosched.BuildConfig;
import com.google.samples.apps.iosched.archframework.Model;
import com.google.samples.apps.iosched.navigation.NavigationModel.NavigationItemEnum;
import com.google.samples.apps.iosched.settings.SettingsUtils;
import com.google.samples.apps.iosched.testutils.SettingsMockContext;
import com.google.samples.apps.iosched.util.AccountUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static junit.framework.Assert.assertEquals;
@RunWith(PowerMockRunner.class)
@PrepareForTest({SettingsUtils.class, AccountUtils.class})
@SmallTest
public class NavigationModelTest {
@Mock
private Context mMockContext;
@Mock
private Model.UserActionCallback mMockUserActionCallback;
@Mock
private Model.DataQueryCallback mMockDataQueryCallback;
private NavigationModel mNavigationModel;
@Before
public void setUp() {
// Create an instance of the model.
mNavigationModel = new NavigationModel(mMockContext);
}
@Test
public void requestData_LoadItemsForLoggedOutAttendingUser_ItemsLoaded() {
// Given a user attending the conference and logged out
setUpMockForAttendance(true);
setUpMockForLoginStatus(false);
NavigationItemEnum[] expectedItems = NavigationConfig.filterOutItemsDisabledInBuildConfig(
appendDebugIfRequired(
NavigationConfig.NAVIGATION_ITEMS_LOGGEDOUT_ATTENDING));
// When the navigation items are requested
mNavigationModel.requestData(NavigationModel.NavigationQueryEnum.LOAD_ITEMS,
mMockDataQueryCallback);
// Then the expected items are loaded into the model
assertEquals(mNavigationModel.getItems().length,expectedItems.length);
assertEquals(mNavigationModel.getItems()[0], expectedItems[0]);
}
@Test
public void requestData_LoadItemsForLoggedOutRemoteUser_ItemsLoaded() {
// Given a user not attending the conference and logged out
setUpMockForAttendance(false);
setUpMockForLoginStatus(false);
NavigationItemEnum[] expectedItems = NavigationConfig.filterOutItemsDisabledInBuildConfig(
appendDebugIfRequired(
NavigationConfig.NAVIGATION_ITEMS_LOGGEDOUT_REMOTE));
// When the navigation items are requested
mNavigationModel.requestData(NavigationModel.NavigationQueryEnum.LOAD_ITEMS,
mMockDataQueryCallback);
// Then the expected items are loaded into the model
assertEquals(mNavigationModel.getItems().length,expectedItems.length);
assertEquals(mNavigationModel.getItems()[0], expectedItems[0]);
}
@Test
public void requestData_LoadItemsForLoggedInRemoteUser_ItemsLoaded() {
// Given a user not attending the conference and logged in
setUpMockForAttendance(false);
setUpMockForLoginStatus(true);
NavigationItemEnum[] expectedItems = NavigationConfig.filterOutItemsDisabledInBuildConfig(
appendDebugIfRequired(
NavigationConfig.NAVIGATION_ITEMS_LOGGEDIN_REMOTE));
// When the navigation items are requested
mNavigationModel.requestData(NavigationModel.NavigationQueryEnum.LOAD_ITEMS,
mMockDataQueryCallback);
// Then the expected items are loaded into the model
assertEquals(mNavigationModel.getItems().length,expectedItems.length);
assertEquals(mNavigationModel.getItems()[0], expectedItems[0]);
}
@Test
public void requestData_LoadItemsForLoggedInAttendingUser_ItemsLoaded() {
// Given a user attending the conference and logged in
setUpMockForAttendance(true);
setUpMockForLoginStatus(true);
NavigationItemEnum[] expectedItems = NavigationConfig.filterOutItemsDisabledInBuildConfig(
appendDebugIfRequired(
NavigationConfig.NAVIGATION_ITEMS_LOGGEDIN_ATTENDING));
// When the navigation items are requested
mNavigationModel.requestData(NavigationModel.NavigationQueryEnum.LOAD_ITEMS,
mMockDataQueryCallback);
// Then the expected items are loaded into the model
assertEquals(mNavigationModel.getItems().length,expectedItems.length);
assertEquals(mNavigationModel.getItems()[0], expectedItems[0]);
}
@Test
public void deliverUserAction_ReloadItemsForUserWithAttendanceChange_ItemsLoaded() {
// Given a user attending the conference and logged in
setUpMockForAttendance(true);
setUpMockForLoginStatus(true);
// And navigation items loaded
mNavigationModel.requestData(NavigationModel.NavigationQueryEnum.LOAD_ITEMS,
mMockDataQueryCallback);
// And a change in user attendance
setUpMockForAttendance(false);
NavigationItemEnum[] expectedItems = NavigationConfig.filterOutItemsDisabledInBuildConfig(
appendDebugIfRequired(
NavigationConfig.NAVIGATION_ITEMS_LOGGEDIN_REMOTE));
// When requesting to reload the items
mNavigationModel
.deliverUserAction(NavigationModel.NavigationUserActionEnum.RELOAD_ITEMS, null,
mMockUserActionCallback);
// Then the expected items are loaded into the model
assertEquals(mNavigationModel.getItems().length,expectedItems.length);
assertEquals(mNavigationModel.getItems()[0], expectedItems[0]);
}
@Test
public void deliverUserAction_ReloadItemsForUserWithLoginStatusChange_ItemsLoaded() {
// Given a user attending the conference and logged in
setUpMockForAttendance(true);
setUpMockForLoginStatus(true);
// And navigation items loaded
mNavigationModel.requestData(NavigationModel.NavigationQueryEnum.LOAD_ITEMS,
mMockDataQueryCallback);
// And a change in logged in status
setUpMockForLoginStatus(false);
NavigationItemEnum[] expectedItems = NavigationConfig.filterOutItemsDisabledInBuildConfig(
appendDebugIfRequired(
NavigationConfig.NAVIGATION_ITEMS_LOGGEDOUT_ATTENDING));
// When requesting to reload the items
mNavigationModel
.deliverUserAction(NavigationModel.NavigationUserActionEnum.RELOAD_ITEMS, null,
mMockUserActionCallback);
// Then the expected items are loaded into the model
assertEquals(mNavigationModel.getItems().length,expectedItems.length);
assertEquals(mNavigationModel.getItems()[0], expectedItems[0]);
}
private void setUpMockForAttendance(boolean attending) {
SettingsMockContext.initMockContextForAttendingVenueSetting(attending, mMockContext);
}
private void setUpMockForLoginStatus(boolean loggedIn) {
SettingsMockContext.initMockContextForLoggedInStatus(loggedIn, mMockContext);
}
private NavigationItemEnum[] appendDebugIfRequired(NavigationItemEnum[] items) {
return BuildConfig.DEBUG ? NavigationConfig.appendItem(items,
NavigationModel.NavigationItemEnum.DEBUG) :
items;
}
}