content: /*
   * Copyright (C) 2017 The Android Open Source Project
   *
   * 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.example.android.contentprovidersample;
  
  import static org.hamcrest.Matchers.is;
  import static org.hamcrest.Matchers.notNullValue;
  import static org.junit.Assert.assertThat;
  
  import android.content.ContentProviderOperation;
  import android.content.ContentProviderResult;
  import android.content.ContentResolver;
  import android.content.ContentValues;
  import android.content.Context;
  import android.content.OperationApplicationException;
  import android.database.Cursor;
  import android.net.Uri;
  import android.os.RemoteException;
  import androidx.test.core.app.ApplicationProvider;
  import androidx.test.ext.junit.runners.AndroidJUnit4;
  import androidx.test.filters.SmallTest;
  import com.example.android.contentprovidersample.data.Cheese;
  import com.example.android.contentprovidersample.data.SampleDatabase;
  import com.example.android.contentprovidersample.provider.SampleContentProvider;
  
  import org.junit.Before;
  import org.junit.Test;
  import org.junit.runner.RunWith;
  
  import java.util.ArrayList;
  
  
  @RunWith(AndroidJUnit4.class)
  @SmallTest
  public class SampleContentProviderTest {
  
      private ContentResolver mContentResolver;
  
      @Before
      public void setUp() {
          final Context context = ApplicationProvider.getApplicationContext();
          SampleDatabase.switchToInMemory(context);
          mContentResolver = context.getContentResolver();
      }
  
      @Test
      public void cheese_initiallyEmpty() {
          final Cursor cursor = mContentResolver.query(SampleContentProvider.URI_CHEESE,
                  new String[]{Cheese.COLUMN_NAME}, null, null, null);
          assertThat(cursor, notNullValue());
          assertThat(cursor.getCount(), is(0));
          cursor.close();
      }
  
      @Test
      public void cheese_insert() {
          final Uri itemUri = mContentResolver.insert(SampleContentProvider.URI_CHEESE,
                  cheeseWithName("Daigo"));
          assertThat(itemUri, notNullValue());
          final Cursor cursor = mContentResolver.query(SampleContentProvider.URI_CHEESE,
                  new String[]{Cheese.COLUMN_NAME}, null, null, null);
          assertThat(cursor, notNullValue());
          assertThat(cursor.getCount(), is(1));
          assertThat(cursor.moveToFirst(), is(true));
          assertThat(cursor.getString(cursor.getColumnIndexOrThrow(Cheese.COLUMN_NAME)), is("Daigo"));
          cursor.close();
      }
  
      @Test
      public void cheese_update() {
          final Uri itemUri = mContentResolver.insert(SampleContentProvider.URI_CHEESE,
                  cheeseWithName("Daigo"));
          assertThat(itemUri, notNullValue());
          final int count = mContentResolver.update(itemUri, cheeseWithName("Queso"), null, null);
          assertThat(count, is(1));
          final Cursor cursor = mContentResolver.query(SampleContentProvider.URI_CHEESE,
                  new String[]{Cheese.COLUMN_NAME}, null, null, null);
          assertThat(cursor, notNullValue());
          assertThat(cursor.getCount(), is(1));
          assertThat(cursor.moveToFirst(), is(true));
          assertThat(cursor.getString(cursor.getColumnIndexOrThrow(Cheese.COLUMN_NAME)), is("Queso"));
          cursor.close();
      }
  
      @Test
      public void cheese_delete() {
          final Uri itemUri = mContentResolver.insert(SampleContentProvider.URI_CHEESE,
                  cheeseWithName("Daigo"));
          assertThat(itemUri, notNullValue());
          final Cursor cursor1 = mContentResolver.query(SampleContentProvider.URI_CHEESE,
                  new String[]{Cheese.COLUMN_NAME}, null, null, null);
          assertThat(cursor1, notNullValue());
          assertThat(cursor1.getCount(), is(1));
          cursor1.close();
          final int count = mContentResolver.delete(itemUri, null, null);
          assertThat(count, is(1));
          final Cursor cursor2 = mContentResolver.query(SampleContentProvider.URI_CHEESE,
                  new String[]{Cheese.COLUMN_NAME}, null, null, null);
          assertThat(cursor2, notNullValue());
          assertThat(cursor2.getCount(), is(0));
          cursor2.close();
      }
  
      @Test
      public void cheese_bulkInsert() {
          final int count = mContentResolver.bulkInsert(SampleContentProvider.URI_CHEESE,
                  new ContentValues[]{
                          cheeseWithName("Peynir"),
                          cheeseWithName("Queso"),
                          cheeseWithName("Daigo"),
                  });
          assertThat(count, is(3));
          final Cursor cursor = mContentResolver.query(SampleContentProvider.URI_CHEESE,
                  new String[]{Cheese.COLUMN_NAME}, null, null, null);
          assertThat(cursor, notNullValue());
          assertThat(cursor.getCount(), is(3));
          cursor.close();
      }
  
      @Test
      public void cheese_applyBatch() throws RemoteException, OperationApplicationException {
          final ArrayList<ContentProviderOperation> operations = new ArrayList<>();
          operations.add(ContentProviderOperation
                  .newInsert(SampleContentProvider.URI_CHEESE)
                  .withValue(Cheese.COLUMN_NAME, "Peynir")
                  .build());
          operations.add(ContentProviderOperation
                  .newInsert(SampleContentProvider.URI_CHEESE)
                  .withValue(Cheese.COLUMN_NAME, "Queso")
                  .build());
          final ContentProviderResult[] results = mContentResolver.applyBatch(
                  SampleContentProvider.AUTHORITY, operations);
          assertThat(results.length, is(2));
          final Cursor cursor = mContentResolver.query(SampleContentProvider.URI_CHEESE,
                  new String[]{Cheese.COLUMN_NAME}, null, null, null);
          assertThat(cursor, notNullValue());
          assertThat(cursor.getCount(), is(2));
          assertThat(cursor.moveToFirst(), is(true));
          cursor.close();
      }
  
      private ContentValues cheeseWithName(String name) {
          final ContentValues values = new ContentValues();
          values.put(Cheese.COLUMN_NAME, name);
          return values;
      }
  
  }
  