package com.truckmuncher.app.test.data;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.test.mock.MockContentProvider;
import org.assertj.android.api.Assertions;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import static org.assertj.core.api.Assertions.assertThat;
public class VerifiableContentProvider extends MockContentProvider {
private final Queue<UpdateEvent> updateEvents = new LinkedList<>();
private final Queue<QueryEvent> queryEvents = new LinkedList<>();
private final Queue<InsertEvent> insertEvents = new LinkedList<>();
private final Queue<DeleteEvent> deleteEvents = new LinkedList<>();
private final Queue<BulkInsertEvent> bulkInsertEvents = new LinkedList<>();
private final List<Cursor> expiredCursors = new ArrayList<>();
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
QueryEvent event = queryEvents.poll();
assertThat(event).isNotNull();
Cursor cursor = event.onQuery(uri, projection, selection, selectionArgs, sortOrder);
expiredCursors.add(cursor);
return cursor;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
UpdateEvent event = updateEvents.poll();
assertThat(event).isNotNull();
return event.onUpdate(uri, values, selection, selectionArgs);
}
@Override
public Uri insert(Uri uri, ContentValues values) {
InsertEvent event = insertEvents.poll();
assertThat(event).isNotNull();
return event.onInsert(uri, values);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
DeleteEvent event = deleteEvents.poll();
assertThat(event).isNotNull();
return event.onDelete(uri, selection, selectionArgs);
}
@Override
public int bulkInsert(Uri uri, ContentValues[] values) {
BulkInsertEvent event = bulkInsertEvents.poll();
assertThat(event).isNotNull();
return event.onBulkInsert(uri, values);
}
public VerifiableContentProvider enqueue(UpdateEvent event) {
updateEvents.add(event);
return this;
}
public VerifiableContentProvider enqueue(QueryEvent event) {
queryEvents.add(event);
return this;
}
public VerifiableContentProvider enqueue(InsertEvent event) {
insertEvents.add(event);
return this;
}
public VerifiableContentProvider enqueue(DeleteEvent event) {
deleteEvents.add(event);
return this;
}
public VerifiableContentProvider enqueue(BulkInsertEvent event) {
bulkInsertEvents.add(event);
return this;
}
public VerifiableContentProvider assertThatQueuesAreEmpty() {
assertThat(updateEvents)
.overridingErrorMessage("One or more UpdateEvents are still queued")
.isEmpty();
assertThat(queryEvents)
.overridingErrorMessage("One or more QueryEvents are still queued")
.isEmpty();
assertThat(insertEvents)
.overridingErrorMessage("One or more InsertEvents are still queued")
.isEmpty();
assertThat(deleteEvents)
.overridingErrorMessage("One or more DeleteEvents are still queued")
.isEmpty();
assertThat(bulkInsertEvents)
.overridingErrorMessage("One or more BulkInsertEvents are still queued")
.isEmpty();
return this;
}
public VerifiableContentProvider assertThatCursorsAreClosed() {
for (Cursor cursor : expiredCursors) {
Assertions.assertThat(cursor).isClosed();
}
return this;
}
public interface UpdateEvent {
int onUpdate(Uri uri, ContentValues values, String selection, String[] selectionArgs);
}
public interface QueryEvent {
@NonNull
Cursor onQuery(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder);
}
public interface InsertEvent {
Uri onInsert(@NonNull Uri uri, ContentValues values);
}
public interface DeleteEvent {
int onDelete(@NonNull Uri uri, String selection, String[] selectionArgs);
}
public interface BulkInsertEvent {
int onBulkInsert(Uri uri, @NonNull ContentValues[] values);
}
}