/*
* Copyright (c) 2016 Ngewi Fet <ngewif@gmail.com>
*
* 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 org.gnucash.android.test.ui;
import android.support.test.espresso.contrib.DrawerActions;
import android.support.test.espresso.intent.Intents;
import android.support.test.espresso.intent.rule.IntentsTestRule;
import android.support.test.runner.AndroidJUnit4;
import org.gnucash.android.R;
import org.gnucash.android.db.BookDbHelper;
import org.gnucash.android.db.adapter.BooksDbAdapter;
import org.gnucash.android.model.Book;
import org.gnucash.android.test.ui.util.DisableAnimationsRule;
import org.gnucash.android.ui.account.AccountsActivity;
import org.gnucash.android.ui.settings.PreferenceActivity;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.swipeUp;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent;
import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withParent;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.Matchers.allOf;
/**
* Test support for multiple books in the application
*/
@RunWith(AndroidJUnit4.class)
public class MultiBookTest {
private static BooksDbAdapter mBooksDbAdapter;
@ClassRule
public static DisableAnimationsRule disableAnimationsRule = new DisableAnimationsRule();
@Rule
public IntentsTestRule<AccountsActivity> mActivityRule = new IntentsTestRule<>(AccountsActivity.class);
@BeforeClass
public static void prepTestCase(){
mBooksDbAdapter = BooksDbAdapter.getInstance();
}
@Test
public void shouldOpenBookManager(){
onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());
onView(withId(R.id.book_name)).check(matches(isDisplayed())).perform(click());
onView(withText(R.string.menu_manage_books)).perform(click());
Intents.intended(hasComponent(PreferenceActivity.class.getName()));
}
public void testLoadBookFromBookManager(){
Book book = new Book();
book.setDisplayName("Launch Codes");
BooksDbAdapter.getInstance().addRecord(book);
shouldOpenBookManager();
onView(withText(book.getDisplayName())).perform(click());
assertThat(BooksDbAdapter.getInstance().getActiveBookUID()).isEqualTo(book.getUID());
}
@Test
public void creatingNewAccounts_shouldCreatedNewBook(){
long booksCount = mBooksDbAdapter.getRecordsCount();
onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());
onView(withId(R.id.drawer_layout)).perform(swipeUp());
onView(withText(R.string.title_settings)).perform(click());
Intents.intended(hasComponent(PreferenceActivity.class.getName()));
onView(withText(R.string.header_account_settings)).perform(click());
onView(withText(R.string.title_create_default_accounts)).perform(click());
onView(withId(android.R.id.button1)).perform(click());
//// TODO: 18.05.2016 wait for import to finish instead
sleep(2000); //give import time to finish
assertThat(mBooksDbAdapter.getRecordsCount()).isEqualTo(booksCount+1);
//// TODO: 25.08.2016 Delete all books before the start of this test
Book activeBook = mBooksDbAdapter.getRecord(mBooksDbAdapter.getActiveBookUID());
assertThat(activeBook.getDisplayName()).isEqualTo("Book " + (booksCount+1));
}
@Test
public void testCreateNewBook(){
long bookCount = mBooksDbAdapter.getRecordsCount();
shouldOpenBookManager();
onView(withId(R.id.menu_create_book))
.check(matches(isDisplayed()))
.perform(click());
assertThat(mBooksDbAdapter.getRecordsCount()).isEqualTo(bookCount+1);
}
//TODO: Finish implementation of this test
public void testDeleteBook(){
long bookCount = mBooksDbAdapter.getRecordsCount();
Book book = new Book();
String displayName = "To Be Deleted";
book.setDisplayName(displayName);
mBooksDbAdapter.addRecord(book);
assertThat(mBooksDbAdapter.getRecordsCount()).isEqualTo(bookCount + 1);
shouldOpenBookManager();
onView(allOf(withParent(hasDescendant(withText(displayName))),
withId(R.id.options_menu))).perform(click());
onView(withText(R.string.menu_delete)).perform(click());
onView(withText(R.string.btn_delete_book)).perform(click());
assertThat(mBooksDbAdapter.getRecordsCount()).isEqualTo(bookCount);
}
private static void sleep(long millis){
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}