Search in sources :

Example 6 with AdditionalItemsLoadable

use of com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.AdditionalItemsLoadable in project mosby by sockeqwe.

the class HomePresenterTest method loadingFirstPageAndNextPageAndFailPullToRefresh.

@Test
public void loadingFirstPageAndNextPageAndFailPullToRefresh() throws IOException {
    //
    // Prepare mock server to deliver mock response on incoming http request
    //
    List<Product> mockProductsFirstPage = Arrays.asList(new Product(1, "image", "name", "category1", "description", 21.9), new Product(2, "image", "name", "category1", "description", 21.9), new Product(3, "image", "name", "category1", "description", 21.9), new Product(4, "image", "name", "category1", "description", 21.9), new Product(5, "image", "name", "category1", "description", 21.9));
    List<Product> mockProductsNextPage = Arrays.asList(new Product(6, "image", "name", "category2", "description", 21.9), new Product(7, "image", "name", "category2", "description", 21.9), new Product(8, "image", "name", "category2", "description", 21.9), new Product(9, "image", "name", "category2", "description", 21.9));
    List<Product> mockProductsPullToRefresh = Arrays.asList(new Product(10, "image", "name", "category3", "description", 21.9), new Product(11, "image", "name", "category3", "description", 21.9), new Product(12, "image", "name", "category3", "description", 21.9));
    mockWebServer.enqueue(new MockResponse().setBody(adapter.toJson(mockProductsFirstPage)));
    mockWebServer.enqueue(new MockResponse().setBody(adapter.toJson(mockProductsNextPage)));
    mockWebServer.enqueue(new MockResponse().setBody(adapter.toJson(mockProductsPullToRefresh)));
    //
    // init the robot to drive to View which triggers intents on the presenter
    //
    HomePresenter presenter = // In a real app you could use dagger or instantiate the Presenter manually like new HomePresenter(...)
    new DependencyInjection().newHomePresenter();
    HomeViewRobot robot = new HomeViewRobot(presenter);
    //
    // We are ready, so let's start: fire intents
    //
    robot.fireLoadFirstPageIntent();
    //
    // we expect that 2 view.render() events happened with the following HomeViewState:
    // 1. show loading indicator
    // 2. show the items with the first page
    //
    List<FeedItem> expectedDataAfterFristPage = Arrays.asList(new SectionHeader("category1"), mockProductsFirstPage.get(0), mockProductsFirstPage.get(1), mockProductsFirstPage.get(2), new AdditionalItemsLoadable(2, "category1", false, null));
    HomeViewState loadingFirstPage = new HomeViewState.Builder().firstPageLoading(true).build();
    HomeViewState firstPage = new HomeViewState.Builder().data(expectedDataAfterFristPage).build();
    // Check if as expected
    robot.assertViewStateRendered(loadingFirstPage, firstPage);
    //
    // Fire next page intent
    //
    robot.fireLoadNextPageIntent();
    //
    // we expect that 4 view.render() events happened with the following HomeViewState:
    // 1. show loading indicator (caused by loadFirstPageIntent)
    // 2. show the items with the first page (caused by loadFirstPageIntent)
    // 3. show loading next page indicator
    // 4. show next page content (plus original first page content)
    //
    List<FeedItem> expectedDataAfterNextPage = Arrays.asList(new SectionHeader("category1"), mockProductsFirstPage.get(0), mockProductsFirstPage.get(1), mockProductsFirstPage.get(2), new AdditionalItemsLoadable(2, "category1", false, null), new SectionHeader("category2"), mockProductsNextPage.get(0), mockProductsNextPage.get(1), mockProductsNextPage.get(2), new AdditionalItemsLoadable(1, "category2", false, null));
    HomeViewState nextPageLoading = new HomeViewState.Builder().data(expectedDataAfterFristPage).nextPageLoading(true).build();
    HomeViewState nextPage = new HomeViewState.Builder().data(expectedDataAfterNextPage).build();
    // Check if as expected
    robot.assertViewStateRendered(loadingFirstPage, firstPage, nextPageLoading, nextPage);
    //
    // fire pull to refresh intent
    //
    // Error: no connection to server
    mockWebServer.shutdown();
    robot.firePullToRefreshIntent();
    //
    // we expect that 6 view.render() events happened with the following HomeViewState:
    // 1. show loading indicator (caused by loadFirstPageIntent)
    // 2. show the items with the first page (caused by loadFirstPageIntent)
    // 3. show loading next page indicator
    // 4. show next page content (plus original first page content)
    // 5. show loading - pull to refresh indicator
    // 6. show error loading  pull to refresh (plus original first page + next page content)
    //
    HomeViewState pullToRefreshLoading = new HomeViewState.Builder().data(expectedDataAfterNextPage).pullToRefreshLoading(true).build();
    HomeViewState pullToRefreshError = new HomeViewState.Builder().data(expectedDataAfterNextPage).pullToRefreshError(new ConnectException()).build();
    robot.assertViewStateRendered(loadingFirstPage, firstPage, nextPageLoading, nextPage, pullToRefreshLoading, pullToRefreshError);
}
Also used : MockResponse(okhttp3.mockwebserver.MockResponse) Product(com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.Product) DependencyInjection(com.hannesdorfmann.mosby3.sample.mvi.dependencyinjection.DependencyInjection) FeedItem(com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.FeedItem) SectionHeader(com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.SectionHeader) AdditionalItemsLoadable(com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.AdditionalItemsLoadable) ConnectException(java.net.ConnectException) Test(org.junit.Test)

Example 7 with AdditionalItemsLoadable

use of com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.AdditionalItemsLoadable in project mosby by sockeqwe.

the class HomePresenterTest method loadingFirstPageAndNextPage.

@Test
public void loadingFirstPageAndNextPage() {
    //
    // Prepare mock server to deliver mock response on incoming http request
    //
    List<Product> mockProductsFirstPage = Arrays.asList(new Product(1, "image", "name", "category1", "description", 21.9), new Product(2, "image", "name", "category1", "description", 21.9), new Product(3, "image", "name", "category1", "description", 21.9), new Product(4, "image", "name", "category1", "description", 21.9), new Product(5, "image", "name", "category1", "description", 21.9));
    List<Product> mockProductsNextPage = Arrays.asList(new Product(6, "image", "name", "category2", "description", 21.9), new Product(7, "image", "name", "category2", "description", 21.9), new Product(8, "image", "name", "category2", "description", 21.9), new Product(9, "image", "name", "category2", "description", 21.9));
    mockWebServer.enqueue(new MockResponse().setBody(adapter.toJson(mockProductsFirstPage)));
    mockWebServer.enqueue(new MockResponse().setBody(adapter.toJson(mockProductsNextPage)));
    //
    // init the robot to drive to View which triggers intents on the presenter
    //
    // In a real app you could use dagger or instantiate the Presenter manually like new HomePresenter(...)
    HomePresenter presenter = new DependencyInjection().newHomePresenter();
    HomeViewRobot robot = new HomeViewRobot(presenter);
    //
    // We are ready, so let's start: fire intents
    //
    robot.fireLoadFirstPageIntent();
    //
    // we expect that 2 view.render() events happened with the following HomeViewState:
    // 1. show loading indicator
    // 2. show the items with the first page
    //
    List<FeedItem> expectedDataAfterFristPage = Arrays.asList(new SectionHeader("category1"), mockProductsFirstPage.get(0), mockProductsFirstPage.get(1), mockProductsFirstPage.get(2), new AdditionalItemsLoadable(2, "category1", false, null));
    HomeViewState loadingFirstPage = new HomeViewState.Builder().firstPageLoading(true).build();
    HomeViewState firstPage = new HomeViewState.Builder().data(expectedDataAfterFristPage).build();
    // Check if as expected
    robot.assertViewStateRendered(loadingFirstPage, firstPage);
    //
    // Fire second intent
    //
    robot.fireLoadNextPageIntent();
    //
    // we expect that 4 view.render() events happened with the following HomeViewState:
    // 1. show loading indicator (caused by loadFirstPageIntent)
    // 2. show the items with the first page (caused by loadFirstPageIntent)
    // 3. show loading next page indicator
    // 4. show next page content (plus original first page content)
    //
    List<FeedItem> expectedDataAfterNextPage = Arrays.asList(new SectionHeader("category1"), mockProductsFirstPage.get(0), mockProductsFirstPage.get(1), mockProductsFirstPage.get(2), new AdditionalItemsLoadable(2, "category1", false, null), new SectionHeader("category2"), mockProductsNextPage.get(0), mockProductsNextPage.get(1), mockProductsNextPage.get(2), new AdditionalItemsLoadable(1, "category2", false, null));
    HomeViewState nextPageLoading = new HomeViewState.Builder().data(expectedDataAfterFristPage).nextPageLoading(true).build();
    HomeViewState nextPage = new HomeViewState.Builder().data(expectedDataAfterNextPage).build();
    // Check if as expected
    robot.assertViewStateRendered(loadingFirstPage, firstPage, nextPageLoading, nextPage);
}
Also used : MockResponse(okhttp3.mockwebserver.MockResponse) Product(com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.Product) DependencyInjection(com.hannesdorfmann.mosby3.sample.mvi.dependencyinjection.DependencyInjection) FeedItem(com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.FeedItem) SectionHeader(com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.SectionHeader) AdditionalItemsLoadable(com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.AdditionalItemsLoadable) Test(org.junit.Test)

Example 8 with AdditionalItemsLoadable

use of com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.AdditionalItemsLoadable in project mosby by sockeqwe.

the class HomePresenterTest method loadingFirstPageAndFailLoadingNextPage.

@Test
public void loadingFirstPageAndFailLoadingNextPage() throws Exception {
    //
    // Prepare mock server to deliver mock response on incoming http request
    //
    List<Product> mockProductsFirstPage = Arrays.asList(new Product(1, "image", "name", "category1", "description", 21.9), new Product(2, "image", "name", "category1", "description", 21.9), new Product(3, "image", "name", "category1", "description", 21.9), new Product(4, "image", "name", "category1", "description", 21.9), new Product(5, "image", "name", "category1", "description", 21.9));
    mockWebServer.enqueue(new MockResponse().setBody(adapter.toJson(mockProductsFirstPage)));
    //
    // init the robot to drive to View which triggers intents on the presenter
    //
    HomePresenter presenter = // In a real app you could use dagger or instantiate the Presenter manually like new HomePresenter(...)
    new DependencyInjection().newHomePresenter();
    HomeViewRobot robot = new HomeViewRobot(presenter);
    //
    // We are ready, so let's start: fire intents
    //
    robot.fireLoadFirstPageIntent();
    //
    // we expect that 2 view.render() events happened with the following HomeViewState:
    // 1. show loading indicator
    // 2. show the items with the first page
    //
    List<FeedItem> expectedDataAfterFristPage = Arrays.asList(new SectionHeader("category1"), mockProductsFirstPage.get(0), mockProductsFirstPage.get(1), mockProductsFirstPage.get(2), new AdditionalItemsLoadable(2, "category1", false, null));
    HomeViewState loadingFirstPage = new HomeViewState.Builder().firstPageLoading(true).build();
    HomeViewState firstPage = new HomeViewState.Builder().data(expectedDataAfterFristPage).build();
    // Check if as expected
    robot.assertViewStateRendered(loadingFirstPage, firstPage);
    //
    // Fire second intent
    //
    // causes loading next page error
    mockWebServer.shutdown();
    robot.fireLoadNextPageIntent();
    //
    // we expect that 4 view.render() events happened with the following HomeViewState:
    // 1. show loading indicator (caused by loadFirstPageIntent)
    // 2. show the items with the first page (caused by loadFirstPageIntent)
    // 3. show loading next page indicator
    // 4. show next page error (plus original first page content)
    //
    HomeViewState nextPageLoading = new HomeViewState.Builder().data(expectedDataAfterFristPage).nextPageLoading(true).build();
    HomeViewState nextPage = new HomeViewState.Builder().data(expectedDataAfterFristPage).nextPageError(new ConnectException()).build();
    // Check if as expected
    robot.assertViewStateRendered(loadingFirstPage, firstPage, nextPageLoading, nextPage);
}
Also used : MockResponse(okhttp3.mockwebserver.MockResponse) Product(com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.Product) DependencyInjection(com.hannesdorfmann.mosby3.sample.mvi.dependencyinjection.DependencyInjection) FeedItem(com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.FeedItem) SectionHeader(com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.SectionHeader) AdditionalItemsLoadable(com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.AdditionalItemsLoadable) ConnectException(java.net.ConnectException) Test(org.junit.Test)

Aggregations

AdditionalItemsLoadable (com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.AdditionalItemsLoadable)8 FeedItem (com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.FeedItem)8 SectionHeader (com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.SectionHeader)8 Product (com.hannesdorfmann.mosby3.sample.mvi.businesslogic.model.Product)7 DependencyInjection (com.hannesdorfmann.mosby3.sample.mvi.dependencyinjection.DependencyInjection)7 MockResponse (okhttp3.mockwebserver.MockResponse)7 Test (org.junit.Test)7 ConnectException (java.net.ConnectException)3 ArrayList (java.util.ArrayList)1