Skip to content
This repository was archived by the owner on Aug 17, 2020. It is now read-only.

Commit f68ddb4

Browse files
committed
Merge pull request #48 from artem-zinnatullin/queryobservable-add-query-to-exception
Add Query to the cause of exception in QueryObservable
2 parents a7642cb + a9f940e commit f68ddb4

2 files changed

Lines changed: 80 additions & 9 deletions

File tree

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.squareup.sqlbrite;
2+
3+
import android.database.Cursor;
4+
import android.database.MatrixCursor;
5+
import android.support.test.runner.AndroidJUnit4;
6+
7+
import com.squareup.sqlbrite.SqlBrite.Query;
8+
9+
import org.junit.Test;
10+
import org.junit.runner.RunWith;
11+
12+
import rx.Observable;
13+
import rx.functions.Func1;
14+
import rx.observers.TestSubscriber;
15+
16+
import static com.google.common.truth.Truth.assertThat;
17+
18+
@RunWith(AndroidJUnit4.class)
19+
public final class QueryObservableTest {
20+
21+
@Test public void mapToListThrowsFromQueryRun() {
22+
TestSubscriber<Object> testSubscriber = new TestSubscriber<>();
23+
24+
new QueryObservable(Observable.<Query>just(new Query() {
25+
@Override public Cursor run() {
26+
throw new IllegalStateException("test exception");
27+
}
28+
})).mapToList(new Func1<Cursor, Object>() {
29+
@Override public Object call(Cursor cursor) {
30+
throw new AssertionError("Must not be called");
31+
}
32+
}).subscribe(testSubscriber);
33+
34+
testSubscriber.awaitTerminalEvent();
35+
testSubscriber.assertNoValues();
36+
assertThat(testSubscriber.getOnErrorEvents()).hasSize(1);
37+
38+
IllegalStateException expected = (IllegalStateException) testSubscriber.getOnErrorEvents().get(0);
39+
assertThat(expected).hasMessage("test exception");
40+
}
41+
42+
@Test public void mapToListThrowsFromMapFunction() {
43+
TestSubscriber<Object> testSubscriber = new TestSubscriber<>();
44+
45+
new QueryObservable(Observable.<Query>just(new Query() {
46+
@Override public Cursor run() {
47+
MatrixCursor cursor = new MatrixCursor(new String[]{"col1"});
48+
cursor.addRow(new Object[]{"value1"});
49+
return cursor;
50+
}
51+
})).mapToList(new Func1<Cursor, Object>() {
52+
@Override public Object call(Cursor cursor) {
53+
throw new IllegalStateException("test exception");
54+
}
55+
}).subscribe(testSubscriber);
56+
57+
testSubscriber.awaitTerminalEvent();
58+
testSubscriber.assertNoValues();
59+
assertThat(testSubscriber.getOnErrorEvents()).hasSize(1);
60+
61+
IllegalStateException expected = (IllegalStateException) testSubscriber.getOnErrorEvents().get(0);
62+
assertThat(expected).hasMessage("test exception");
63+
}
64+
}

sqlbrite/src/main/java/com/squareup/sqlbrite/QueryObservable.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import java.util.List;
99
import rx.Observable;
1010
import rx.Subscriber;
11+
import rx.exceptions.Exceptions;
12+
import rx.exceptions.OnErrorThrowable;
1113
import rx.functions.Func1;
1214

1315
/** An {@link Observable} of {@link Query} which offers query-specific convenience operators. */
@@ -41,17 +43,22 @@ public final <T> Observable<List<T>> mapToList(@NonNull final Func1<Cursor, T> m
4143
public Subscriber<? super Query> call(final Subscriber<? super List<T>> subscriber) {
4244
return new Subscriber<Query>(subscriber) {
4345
@Override public void onNext(Query query) {
44-
Cursor cursor = query.run();
45-
List<T> items = new ArrayList<>(cursor.getCount());
4646
try {
47-
while (cursor.moveToNext() && !subscriber.isUnsubscribed()) {
48-
items.add(mapper.call(cursor));
47+
Cursor cursor = query.run();
48+
List<T> items = new ArrayList<>(cursor.getCount());
49+
try {
50+
while (cursor.moveToNext() && !subscriber.isUnsubscribed()) {
51+
items.add(mapper.call(cursor));
52+
}
53+
} finally {
54+
cursor.close();
4955
}
50-
} finally {
51-
cursor.close();
52-
}
53-
if (!subscriber.isUnsubscribed()) {
54-
subscriber.onNext(items);
56+
if (!subscriber.isUnsubscribed()) {
57+
subscriber.onNext(items);
58+
}
59+
} catch (Throwable e) {
60+
Exceptions.throwIfFatal(e);
61+
onError(OnErrorThrowable.addValueAsLastCause(e, query));
5562
}
5663
}
5764

0 commit comments

Comments
 (0)