package com.merybere.app.mycontentprovider.test; import com.merybere.app.mycontentprovider.data.MembersContract; import com.merybere.app.mycontentprovider.data.MembersContract.UsersTable; import com.merybere.app.mycontentprovider.data.MyContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.test.ProviderTestCase2; import android.test.mock.MockContentResolver; public class MyContentProviderTest extends ProviderTestCase2<MyContentProvider> { // ContentResolver es el que se encarga de llamar uno u otro Provider, // en funci�n de lo que se le est� pidiendo. private MockContentResolver mContentResolver; // Constructor public MyContentProviderTest() { // Pasamos al super: // - la clase provider que vamos a probar // - la authority, que es el dominio que tienen las urls de ContentProvider // sobre el que vamos a trabajar super(MyContentProvider.class, MembersContract.AUTHORITY); } // M�todo que se ejecuta antes de cada test // Sirve para inicializar objetos @Override protected void setUp() throws Exception { // TODO Auto-generated method stub super.setUp(); // (los Mock son conjuntos de datos que preparamos para no usar los datos reales) mContentResolver = getMockContentResolver(); } // Cada m�todo que llamemos con el prefijo test se considerar� un test: // - Si lanza una excepci�n se considerar� fallido // - Si pasa por toda la programaci�n que contenga sin lanzar una excepci�n se considera ok // Test de la uri del ContentProvider // (con este test nos aseguramos que si m�s adelante cambi�ramos la constante AUTHORITY que // estamos usando para definir la uri, el programa no falle) public void testUsersUri() { Uri expected = Uri.parse("content://com.merybere.app.mycontentprovider/users"); Uri actual = UsersTable.getUri(); assertEquals(expected, actual); } // Test de insertar datos public void testInsert() { // Necesitamos un objeto ContentValues, cargar en �l los datos que queremos insertar ContentValues values = new ContentValues(); values.put(MembersContract.UsersTable.USERNAME, "Clark Kent"); values.put(MembersContract.UsersTable.EMAIL, "super@man.com"); // Necesitamos una uri, a la que pasarle los valores y tiene que hacer el insert Uri uri = UsersTable.getUri(); // Llamada al insert. // Si va bien, devolver� una nueva uri que es la direcci�n del registro que acabamos de insertar Uri newUri = mContentResolver.insert(uri, values); // Comprobaci�n de que newUri es correcta assertNotNull(newUri); } // Test de select: // - tras insertar un dato nuevo devolver� una uri // - el test consiste en consultar por esa uri, y que devuelva un �nico registro con los // datos que hemos insertado public void testSelectOne() { // Necesitamos un objeto ContentValues, cargar en �l los datos que queremos insertar ContentValues values = new ContentValues(); values.put(MembersContract.UsersTable.USERNAME, "Clark Kent"); values.put(MembersContract.UsersTable.EMAIL, "super@man.com"); // Necesitamos una uri, a la que pasarle los valores y tiene que hacer el insert Uri uri = UsersTable.getUri(); // Llamada al insert, que devolver� una uri de registro �nico Uri newUri = mContentResolver.insert(uri, values); // Comprobaci�n de que newUri es correcta assertNotNull(newUri); // Lanzar una query con esa uri, que devuelva todos los campos, sin l�mites de selecci�n // ni argumentos ni ordenaci�n, que devuelva un cursor para acceder a esos datos Cursor cursor = mContentResolver.query(newUri, null, null, null, null); // Comprobaci�n para asegurarse de que el n�mero de filas del cursor es 1 assertEquals(cursor.getCount(), 1); cursor.moveToFirst(); // Como en la consulta para obtener el cursor no hemos forzado ning�n orden en las columnas, // obtener los campos nombre y email por b�squeda de los �ndices de esas columnas String email = cursor.getString(cursor.getColumnIndex(UsersTable.EMAIL)); String name = cursor.getString(cursor.getColumnIndex(UsersTable.USERNAME)); assertEquals("Clark Kent", name); assertEquals("super@man.com", email); cursor.close(); } // Test de select de varios registros: // - tras insertar un dato nuevo devolver� una uri �nica // - el test consiste en consultar por la uri de la colecci�n de datos, y que devuelva // todos los registros que cumplen la cl�usula where public void testSelectLike() { // Necesitamos un objeto ContentValues, cargar en �l los datos que queremos insertar ContentValues values = new ContentValues(); values.put(MembersContract.UsersTable.USERNAME, "Clark Kent"); values.put(MembersContract.UsersTable.EMAIL, "super@man.com"); // Necesitamos una uri, a la que pasarle los valores y tiene que hacer el insert Uri uri = UsersTable.getUri(); // Llamada al insert, que devolver� una uri de registro �nico Uri newUri = mContentResolver.insert(uri, values); // Comprobaci�n de que newUri es correcta assertNotNull(newUri); // Limpiamos el ContentValues para reutilizarlo values.clear(); values.put(MembersContract.UsersTable.USERNAME, "James Bond"); values.put(MembersContract.UsersTable.EMAIL, "james@bond.com"); // Llamada al insert, que devolver� una uri de registro �nico newUri = mContentResolver.insert(uri, values); // Comprobaci�n de que newUri es correcta assertNotNull(newUri); // Limpiamos el ContentValues para reutilizarlo values.clear(); values.put(MembersContract.UsersTable.USERNAME, "Bilbo Bolson"); values.put(MembersContract.UsersTable.EMAIL, "bilbo@bolson.es"); // Llamada al insert, que devolver� una uri de registro �nico newUri = mContentResolver.insert(uri, values); // Comprobaci�n de que newUri es correcta assertNotNull(newUri); String selection = UsersTable.EMAIL + " LIKE '%.com'"; // Lanzar una query con esa uri, que devuelva todos los campos, sin l�mites de selecci�n ni // argumentos ni ordenaci�n, que devuelva un cursor para acceder a los datos que cumplen el where String sortOrder = "_ID"; Cursor cursor = mContentResolver.query(uri, null, selection, null, sortOrder ); // Comprobaci�n para asegurarse de que el n�mero de filas del cursor es 2 assertEquals(cursor.getCount(), 2); cursor.moveToFirst(); // Como en la consulta para obtener el cursor no hemos forzado ning�n orden en las columnas, // obtener los campos nombre y email por b�squeda de los �ndices de esas columnas String email = cursor.getString(cursor.getColumnIndex(UsersTable.EMAIL)); assertEquals("super@man.com", email); // Mover el cursor al segundo registro cursor.moveToNext(); email = cursor.getString(cursor.getColumnIndex(UsersTable.EMAIL)); assertEquals("james@bond.com", email); cursor.close(); } // Test de borrado de un registro de la tabla public void testDeleteOne() { // Necesitamos un objeto ContentValues, cargar en �l los datos que queremos insertar ContentValues values = new ContentValues(); values.put(MembersContract.UsersTable.USERNAME, "Clark Kent"); values.put(MembersContract.UsersTable.EMAIL, "super@man.com"); // Necesitamos una uri, a la que pasarle los valores y tiene que hacer el insert Uri uri = UsersTable.getUri(); // Llamada al insert, que devolver� una uri de registro �nico Uri newUri = mContentResolver.insert(uri, values); // Comprobaci�n de que newUri es correcta assertNotNull(newUri); int dels = mContentResolver.delete(newUri, null, null); assertEquals(1, dels); } // Test de borrado de todos los registros de la tabla public void testDeleteAll() { // Necesitamos un objeto ContentValues, cargar en �l los datos que queremos insertar ContentValues values = new ContentValues(); values.put(MembersContract.UsersTable.USERNAME, "Clark Kent"); values.put(MembersContract.UsersTable.EMAIL, "super@man.com"); // Necesitamos una uri, a la que pasarle los valores y tiene que hacer el insert Uri uri = UsersTable.getUri(); // Llamada al insert, que devolver� una uri de registro �nico Uri newUri = mContentResolver.insert(uri, values); // Comprobaci�n de que newUri es correcta assertNotNull(newUri); // Limpiamos el ContentValues para reutilizarlo values.clear(); values.put(MembersContract.UsersTable.USERNAME, "James Bond"); values.put(MembersContract.UsersTable.EMAIL, "james@bond.com"); // Llamada al insert, que devolver� una uri de registro �nico newUri = mContentResolver.insert(uri, values); // Comprobaci�n de que newUri es correcta assertNotNull(newUri); // Para borrar toda la tabla, pasar un 1 en la cl�usula where int dels = mContentResolver.delete(uri, "1", null); assertEquals(2, dels); } // Test actualizar un registro public void testUpdate() { // Necesitamos un objeto ContentValues, cargar en �l los datos que queremos insertar ContentValues values = new ContentValues(); values.put(MembersContract.UsersTable.USERNAME, "Clark Kent"); values.put(MembersContract.UsersTable.EMAIL, "super@man.com"); // Necesitamos una uri, a la que pasarle los valores y tiene que hacer el insert Uri uri = UsersTable.getUri(); // Llamada al insert, que devolver� una uri de registro �nico Uri newUri = mContentResolver.insert(uri, values); // Comprobaci�n de que newUri es correcta assertNotNull(newUri); ContentValues newValues = new ContentValues(); newValues.put(MembersContract.UsersTable.USERNAME, "Superman"); newValues.put(MembersContract.UsersTable.EMAIL, "clark@kent.com"); int numRows = mContentResolver.update(newUri, newValues, null, null); assertEquals(1, numRows); } }