/*
* Copyright 2015 Google Inc. All rights reserved.
*
* 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.model;
import android.database.Cursor;
import android.test.suitebuilder.annotation.SmallTest;
import com.google.samples.apps.iosched.provider.ScheduleContract;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
@SmallTest
public class TagMetadataTest {
private static final String FAKE_TAG_ID = "FAKE TAG ID";
private static final String FAKE_TAG_NAME = "FAKE TAG NAME";
private static final String FAKE_TAG_CATEGORY = "FAKE TAG CATEGORY";
private static final String FAKE_TAG_UNUSED_CATEGORY = "FAKE TAG UNUSED CATEGORY";
private static final int FAKE_TAG_ORDER_IN_CATEGORY = 1;
private static final String FAKE_TAG_ABSTRACT = "FAKE TAG ABSTRACT";
private static final int FAKE_TAG_COLOR = 255;
private static final int TAG_ID_COLUMN_INDEX = 1;
private static final int TAG_NAME_COLUMN_INDEX = 2;
private static final int TAG_CATEGORY_COLUMN_INDEX = 3;
private static final int TAG_ORDER_IN_CATEGORY_COLUMN_INDEX = 4;
private static final int TAG_ABSTRACT_COLUMN_INDEX = 5;
private static final int TAG_COLOR_COLUMN_INDEX = 6;
@Rule
public ExpectedException mThrown = ExpectedException.none();
@Mock
private Cursor mMockCursor;
private TagMetadata mTagMetadata;
@Test
public void constructor_WithNullCursor_ThrowsNPE() {
// Expected
mThrown.expect(NullPointerException.class);
// When TagMetadata initialised with null cursor
mTagMetadata = new TagMetadata(null);
// Then NPE is thrown
}
@Test
public void constructor_WithEmptyCursor_Returns() {
// Given an empty mock cursor
when(mMockCursor.getCount()).thenReturn(0);
// When TagMetadata initialised with mock cursor
mTagMetadata = new TagMetadata(mMockCursor);
// Then returns
}
@Test
public void constructor_WithOneTag_TagCorrectlyLoaded() {
// Given a mock cursor with a fake tag
initMockCursorWithOneTag(mMockCursor);
// When TagMetadata initialised with mock cursor
mTagMetadata = new TagMetadata(mMockCursor);
// Then the tag metadata has the correct data
assertThat(mTagMetadata.getTag(FAKE_TAG_ID).getName(), is(FAKE_TAG_NAME));
assertThat(mTagMetadata.getTag(FAKE_TAG_ID).getAbstract(), is(FAKE_TAG_ABSTRACT));
assertThat(mTagMetadata.getTag(FAKE_TAG_ID).getCategory(), is(FAKE_TAG_CATEGORY));
assertThat(mTagMetadata.getTag(FAKE_TAG_ID).getColor(), is(FAKE_TAG_COLOR));
assertThat(mTagMetadata.getTag(FAKE_TAG_ID).getOrderInCategory(),
is(FAKE_TAG_ORDER_IN_CATEGORY));
assertThat(mTagMetadata.getTagsInCategory(FAKE_TAG_CATEGORY).size(), is(1));
assertThat(mTagMetadata.getTagsInCategory(FAKE_TAG_UNUSED_CATEGORY), nullValue());
}
@Test
public void getTagByTagName_ReturnsCorrectTag() {
// Given a TagMetadata initialised with mock cursor
initMockCursorWithOneTag(mMockCursor);
mTagMetadata = new TagMetadata(mMockCursor);
// When tag is searched by name
TagMetadata.Tag tag = mTagMetadata.getTag(FAKE_TAG_NAME);
// Then tag is returned with correct data
assertNotNull(tag);
assertThat(tag.getAbstract(), is(FAKE_TAG_ABSTRACT));
assertThat(tag.getCategory(), is(FAKE_TAG_CATEGORY));
assertThat(tag.getId(), is(FAKE_TAG_ID));
assertThat(tag.getName(), is(FAKE_TAG_NAME));
assertThat(tag.getColor(), is(FAKE_TAG_COLOR));
assertThat(tag.getOrderInCategory(),
is(FAKE_TAG_ORDER_IN_CATEGORY));
}
@Test
public void constructor_WithTwoTags_TagsCorrectlyLoaded() {
// Given a mock cursor with two fake tags
initMockCursorWithTwoTags(mMockCursor);
// When TagMetadata initialised with mock cursor
mTagMetadata = new TagMetadata(mMockCursor);
// Then the tag metadata has two tags for the fake category
// Note: we cannot check the tag data because we used a random tag id, to get two distinct
// tags.
assertThat(mTagMetadata.getTagsInCategory(FAKE_TAG_CATEGORY).size(), is(2));
assertThat(mTagMetadata.getTagsInCategory(FAKE_TAG_UNUSED_CATEGORY), nullValue());
}
public static void initMockCursorWithOneTag(Cursor cursor) {
// Return a count of 1
when(cursor.getCount()).thenReturn(1);
when(cursor.moveToPosition(0)).thenReturn(true);
// Return fake tag details
when(cursor.getColumnIndex(ScheduleContract.Tags.TAG_ID))
.thenReturn(TAG_ID_COLUMN_INDEX);
when(cursor.getString(TAG_ID_COLUMN_INDEX)).thenReturn(FAKE_TAG_ID);
when(cursor.getColumnIndex(ScheduleContract.Tags.TAG_NAME))
.thenReturn(TAG_NAME_COLUMN_INDEX);
when(cursor.getString(TAG_NAME_COLUMN_INDEX)).thenReturn(FAKE_TAG_NAME);
when(cursor.getColumnIndex(ScheduleContract.Tags.TAG_CATEGORY))
.thenReturn(TAG_CATEGORY_COLUMN_INDEX);
when(cursor.getString(TAG_CATEGORY_COLUMN_INDEX)).thenReturn(FAKE_TAG_CATEGORY);
when(cursor.getColumnIndex(ScheduleContract.Tags.TAG_ORDER_IN_CATEGORY))
.thenReturn(TAG_ORDER_IN_CATEGORY_COLUMN_INDEX);
when(cursor.getInt(TAG_ORDER_IN_CATEGORY_COLUMN_INDEX))
.thenReturn(FAKE_TAG_ORDER_IN_CATEGORY);
when(cursor.getColumnIndex(ScheduleContract.Tags.TAG_ABSTRACT))
.thenReturn(TAG_ABSTRACT_COLUMN_INDEX);
when(cursor.getString(TAG_ABSTRACT_COLUMN_INDEX)).thenReturn(FAKE_TAG_ABSTRACT);
when(cursor.getColumnIndex(ScheduleContract.Tags.TAG_COLOR))
.thenReturn(TAG_COLOR_COLUMN_INDEX);
when(cursor.getInt(TAG_COLOR_COLUMN_INDEX)).thenReturn(FAKE_TAG_COLOR);
}
private void initMockCursorWithTwoTags(Cursor cursor) {
// Return a count of 2
when(cursor.getCount()).thenReturn(2);
when(cursor.moveToPosition(0)).thenReturn(true);
when(cursor.moveToPosition(1)).thenReturn(true);
// Return fake tag details, using random tag id so we have two distinct tags
when(cursor.getColumnIndex(ScheduleContract.Tags.TAG_ID))
.thenReturn(TAG_ID_COLUMN_INDEX);
when(cursor.getString(TAG_ID_COLUMN_INDEX)).thenReturn(FAKE_TAG_ID + " "
+ System.currentTimeMillis());
when(cursor.getColumnIndex(ScheduleContract.Tags.TAG_NAME))
.thenReturn(TAG_NAME_COLUMN_INDEX);
when(cursor.getString(TAG_NAME_COLUMN_INDEX)).thenReturn(FAKE_TAG_NAME);
when(cursor.getColumnIndex(ScheduleContract.Tags.TAG_CATEGORY))
.thenReturn(TAG_CATEGORY_COLUMN_INDEX);
when(cursor.getString(TAG_CATEGORY_COLUMN_INDEX)).thenReturn(FAKE_TAG_CATEGORY);
when(cursor.getColumnIndex(ScheduleContract.Tags.TAG_ORDER_IN_CATEGORY))
.thenReturn(TAG_ORDER_IN_CATEGORY_COLUMN_INDEX);
when(cursor.getInt(TAG_ORDER_IN_CATEGORY_COLUMN_INDEX))
.thenReturn(FAKE_TAG_ORDER_IN_CATEGORY);
when(cursor.getColumnIndex(ScheduleContract.Tags.TAG_ABSTRACT))
.thenReturn(TAG_ABSTRACT_COLUMN_INDEX);
when(cursor.getString(TAG_ABSTRACT_COLUMN_INDEX)).thenReturn(FAKE_TAG_ABSTRACT);
when(cursor.getColumnIndex(ScheduleContract.Tags.TAG_COLOR))
.thenReturn(TAG_COLOR_COLUMN_INDEX);
when(cursor.getInt(TAG_COLOR_COLUMN_INDEX)).thenReturn(FAKE_TAG_COLOR);
}
}