package com.nilhcem.bblfr.ui.baggers.list.filter; import android.content.Intent; import android.os.Build; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.view.MenuItem; import com.nilhcem.bblfr.BuildConfig; import com.nilhcem.bblfr.R; import com.nilhcem.bblfr.model.baggers.City; import com.nilhcem.bblfr.ui.baggers.list.BaggersListActivity; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.fakes.RoboMenuItem; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(RobolectricTestRunner.class) @Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.M) public class TagsListActivityTest { private TestTagsListActivity activity; @Mock DrawerLayout drawer; TagsListAdapter tagsAdapter; @Before public void setup() { MockitoAnnotations.initMocks(this); City city = new City(); city.name = "Shanghai"; Intent intent = new Intent(RuntimeEnvironment.application, TestTagsListActivity.class); intent.putExtra("mCity", city); activity = Robolectric.buildActivity(TestTagsListActivity.class).withIntent(intent).create().get(); TagsListActivity.FilterDrawerViewHolder holder = new TagsListActivity.FilterDrawerViewHolder(); holder.mLayout = drawer; activity.mFilterDrawer = holder; tagsAdapter = new TagsListAdapter(selectedTagsIds -> { }); tagsAdapter = spy(tagsAdapter); activity.mTagsAdapter = tagsAdapter; } @Test public void should_create_launch_intent_with_extra_data() { // Given City city = new City(); city.name = "Dalian"; // When Intent intent = BaggersListActivity.createLaunchIntent(RuntimeEnvironment.application, city); // Then assertThat(intent.getComponent().getClassName()).isEqualTo(BaggersListActivity.class.getName()); assertThat(((City) intent.getParcelableExtra("mCity")).name).isEqualTo("Dalian"); } @Test public void should_open_filter_drawer_when_clicking_on_menu_icon() { // Given MenuItem item = new RoboMenuItem(R.id.action_filter_baggers); // When activity.onOptionsItemSelected(item); // Then verify(drawer).openDrawer(GravityCompat.END); } @Test public void should_close_tags_drawer_when_clicking_on_menu_icon_and_drawer_is_already_opened() { // Given MenuItem item = new RoboMenuItem(R.id.action_filter_baggers); when(drawer.isDrawerOpen(GravityCompat.END)).thenReturn(true); // When activity.onOptionsItemSelected(item); // Then verify(drawer).closeDrawer(GravityCompat.END); } @Test public void should_close_filter_drawer_when_pressing_back_if_visible() { // Given activity.onFilterChanged(Arrays.asList("Android")); when(drawer.isDrawerVisible(GravityCompat.END)).thenReturn(true); // When activity.onBackPressed(); // Then assertThat(activity.mIsFiltered).isTrue(); verify(drawer).closeDrawer(GravityCompat.END); } @Test public void should_reset_filters_if_any_on_back_pressed_when_drawer_is_not_visible() { // Given activity.onFilterChanged(Arrays.asList("Android")); when(drawer.isDrawerVisible(GravityCompat.END)).thenReturn(false); // When activity.onBackPressed(); // Then assertThat(activity.mIsFiltered).isFalse(); verify(drawer, times(0)).closeDrawer(GravityCompat.END); } @Test public void should_set_filter_flag_to_true_when_filter_changes_and_has_data() { // Given List<String> data = Arrays.asList("Android"); // When activity.onFilterChanged(data); // Then assertThat(activity.mIsFiltered).isTrue(); } @Test public void should_set_filter_flag_to_false_when_filter_changes_and_is_empty() { // Given List<String> data = new ArrayList<>(); // When activity.onFilterChanged(data); // Then assertThat(activity.mIsFiltered).isFalse(); } @Test public void should_reset_filter() { // Given activity.onFilterChanged(Arrays.asList("Android")); // When activity.resetFilter(); // Then assertThat(activity.mIsFiltered).isFalse(); verify(tagsAdapter).resetFilter(); } @Test public void should_set_data_from_extra() { // Given When // setup() // Then assertThat(activity.mCity.name).isEqualTo("Shanghai"); } public static class TestTagsListActivity extends TagsListActivity { } }