Merge "Implemented integration test for upsert focusing on testing RxJava: Single, Maybe and Completable" into androidx-main
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/dao/BooksDao.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/dao/BooksDao.kt
index b6c57857..fac123e 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/dao/BooksDao.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/dao/BooksDao.kt
@@ -459,4 +459,22 @@
 
     @Upsert
     fun upsertPublishers(vararg publishers: Publisher)
+
+    @Upsert
+    fun upsertTwoPublishers(publisherOne: Publisher, publisherTwo: Publisher)
+
+    @Upsert
+    fun upsertMultiple(publisher: Publisher, publishers: List<Publisher>)
+
+    @Upsert
+    fun upsertPublisherSingle(publisher: Publisher): Single<Long>
+
+    @Upsert
+    fun upsertBookSingle(book: Book): Single<Long>
+
+    @Upsert
+    fun upsertBookMaybe(book: Book): Maybe<Long>
+
+    @Upsert
+    fun upsertBookCompletable(book: Book): Completable
 }
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/TestUtil.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/TestUtil.kt
index 66cf87b..b382a7d 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/TestUtil.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/TestUtil.kt
@@ -28,6 +28,7 @@
 
         val PUBLISHER = Publisher("ph1", "publisher 1")
         val PUBLISHER2 = Publisher("ph2", "publisher 2")
+        val PUBLISHER3 = Publisher("ph3", "publisher 3")
 
         val AUTHOR_1 = Author("a1", "author 1")
         val AUTHOR_2 = Author("a2", "author 2")
diff --git a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/UpsertTest.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/UpsertTest.kt
index 28b2d34..3ccd123 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/UpsertTest.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/test/UpsertTest.kt
@@ -15,16 +15,151 @@
  */
 
 package androidx.room.androidx.room.integration.kotlintestapp.test
+import android.database.sqlite.SQLiteConstraintException
 import androidx.room.integration.kotlintestapp.test.TestDatabaseTest
 import androidx.room.integration.kotlintestapp.test.TestUtil
+import androidx.room.integration.kotlintestapp.vo.Book
+import androidx.room.integration.kotlintestapp.vo.Lang
+import androidx.room.integration.kotlintestapp.vo.Publisher
 import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import io.reactivex.observers.TestObserver
+import io.reactivex.subscribers.TestSubscriber
 import org.junit.Test
 
 @MediumTest
 class UpsertTest : TestDatabaseTest() {
 
+    val PUBLISHERLIST: List<Publisher> = buildList {
+        add(Publisher("ph4", "publisher 4"))
+        add(Publisher("ph2", "change publisher 2"))
+        add(TestUtil.PUBLISHER3)
+    }
+
+    val BOOK_1_EDIT: Book = Book(
+        "b1", "book title 4", "ph1",
+        setOf(Lang.EN), 6
+    )
     @Test
-    fun upsertPublishers() {
-        booksDao.upsertPublishers(TestUtil.PUBLISHER)
+    fun upsertMulti() {
+        booksDao.upsertTwoPublishers(TestUtil.PUBLISHER, TestUtil.PUBLISHER2)
+
+        assertThat(booksDao.getPublisher(TestUtil.PUBLISHER.publisherId)).isEqualTo(
+            TestUtil.PUBLISHER
+        )
+        assertThat(booksDao.getPublisher(TestUtil.PUBLISHER2.publisherId)).isEqualTo(
+            TestUtil.PUBLISHER2
+        )
+
+        val modifyPublisher3 = Publisher("ph3", "changed publisher 3")
+        booksDao.upsertPublishers(modifyPublisher3)
+        booksDao.upsertMultiple(TestUtil.PUBLISHER3, PUBLISHERLIST)
+
+        assertThat(booksDao.getPublisher(TestUtil.PUBLISHER3.publisherId)).isEqualTo(
+            TestUtil.PUBLISHER3
+        )
+        assertThat(booksDao.getPublisher(PUBLISHERLIST[1].publisherId).name).isEqualTo(
+            "change publisher 2"
+        )
+        assertThat(booksDao.getPublisher(PUBLISHERLIST[0].publisherId).name).isEqualTo(
+            "publisher 4"
+        )
+    }
+    @Test
+    fun upsertSingle() {
+        val testObserver = TestObserver<Long>()
+        booksDao.upsertPublisherSingle(TestUtil.PUBLISHER).subscribeWith(testObserver)
+        testObserver.assertComplete()
+        val result = testObserver.values().single()
+        assertThat(booksDao.getPublisher(TestUtil.PUBLISHER.publisherId)).isEqualTo(
+            TestUtil.PUBLISHER
+        )
+        assertThat(result).isEqualTo(1)
+    }
+
+    @Test
+    fun upsertSingleError() {
+        val testObserver = TestObserver<Long>()
+        booksDao.upsertBookSingle(TestUtil.BOOK_1).subscribeWith(testObserver)
+        testObserver.assertError(SQLiteConstraintException::class.java)
+        assertThat(testObserver.errors().get(0).message).ignoringCase().contains("foreign key")
+    }
+
+    @Test
+    fun upsertSingleWithFlowableQuery() {
+        val testObserver = TestObserver<Long>()
+        val testObserver2 = TestObserver<Long>()
+        val subscriber = TestSubscriber<Book>()
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+        booksDao.upsertBookSingle(TestUtil.BOOK_1).subscribeWith(testObserver)
+        booksDao.getBookFlowable(TestUtil.BOOK_1.bookId).subscribeWith(subscriber)
+        testObserver.assertComplete()
+        drain()
+        assertThat(subscriber.values().size).isEqualTo(1)
+        assertThat(subscriber.values()[0]).isEqualTo(TestUtil.BOOK_1)
+        booksDao.upsertBookSingle(TestUtil.BOOK_1.copy(title = "changed title"))
+            .subscribeWith(testObserver2)
+        drain()
+        assertThat(subscriber.values().size).isEqualTo(2)
+        assertThat(subscriber.values()[1].title).isEqualTo("changed title")
+    }
+
+    @Test
+    fun upsertMaybe() {
+        val testObserver = TestObserver<Long>()
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+        booksDao.addBooks(BOOK_1_EDIT)
+        booksDao.upsertBookMaybe(TestUtil.BOOK_1).subscribeWith(testObserver)
+        testObserver.assertComplete()
+        assertThat(booksDao.getBook(TestUtil.BOOK_1.bookId)).isEqualTo(
+            TestUtil.BOOK_1
+        )
+    }
+
+    @Test
+    fun upsertMaybeError() {
+        val testObserver = TestObserver<Long>()
+        booksDao.upsertBookMaybe(TestUtil.BOOK_1).subscribeWith(testObserver)
+        testObserver.assertError(SQLiteConstraintException::class.java)
+        assertThat(testObserver.errors().get(0).message).ignoringCase().contains("foreign key")
+    }
+
+    @Test
+    fun upsertMaybeWithFlowableQuery() {
+        val testObserver = TestObserver<Long>()
+        val testObserver2 = TestObserver<Long>()
+        val subscriber = TestSubscriber<Book>()
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+        booksDao.upsertBookMaybe(TestUtil.BOOK_1).subscribeWith(testObserver)
+        booksDao.getBookFlowable(TestUtil.BOOK_1.bookId).subscribeWith(subscriber)
+        testObserver.assertComplete()
+        drain()
+        assertThat(subscriber.values().size).isEqualTo(1)
+        assertThat(subscriber.values()[0]).isEqualTo(TestUtil.BOOK_1)
+        booksDao.upsertBookMaybe(TestUtil.BOOK_1.copy(title = "changed title"))
+            .subscribeWith(testObserver2)
+        drain()
+        assertThat(subscriber.values().size).isEqualTo(2)
+        assertThat(subscriber.values()[1].title).isEqualTo("changed title")
+    }
+
+    @Test
+    fun upsertCompletable() {
+        val testObserver = TestObserver<Long>()
+        booksDao.addPublishers(TestUtil.PUBLISHER)
+        booksDao.addBooks(BOOK_1_EDIT)
+        booksDao.upsertBookCompletable(TestUtil.BOOK_1).subscribeWith(testObserver)
+        testObserver.assertComplete()
+        assertThat(booksDao.getBook(TestUtil.BOOK_1.bookId)).isEqualTo(
+            TestUtil.BOOK_1
+        )
+    }
+
+    @Test
+    fun upsertCompletableError() {
+        val testObserver = TestObserver<Long>()
+        booksDao.upsertBookCompletable(TestUtil.BOOK_1).subscribeWith(testObserver)
+        testObserver.assertError(SQLiteConstraintException::class.java)
+        assertThat(testObserver.errors().get(0).message).ignoringCase().contains("foreign key")
     }
 }