134f575b4b17fe635684e76e02685978477538622Florina Muntenescu/*
234f575b4b17fe635684e76e02685978477538622Florina Muntenescu * Copyright (C) 2017 The Android Open Source Project
334f575b4b17fe635684e76e02685978477538622Florina Muntenescu *
434f575b4b17fe635684e76e02685978477538622Florina Muntenescu * Licensed under the Apache License, Version 2.0 (the "License");
534f575b4b17fe635684e76e02685978477538622Florina Muntenescu * you may not use this file except in compliance with the License.
634f575b4b17fe635684e76e02685978477538622Florina Muntenescu * You may obtain a copy of the License at
734f575b4b17fe635684e76e02685978477538622Florina Muntenescu *
834f575b4b17fe635684e76e02685978477538622Florina Muntenescu *      http://www.apache.org/licenses/LICENSE-2.0
934f575b4b17fe635684e76e02685978477538622Florina Muntenescu *
1034f575b4b17fe635684e76e02685978477538622Florina Muntenescu * Unless required by applicable law or agreed to in writing, software
1134f575b4b17fe635684e76e02685978477538622Florina Muntenescu * distributed under the License is distributed on an "AS IS" BASIS,
1234f575b4b17fe635684e76e02685978477538622Florina Muntenescu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1334f575b4b17fe635684e76e02685978477538622Florina Muntenescu * See the License for the specific language governing permissions and
1434f575b4b17fe635684e76e02685978477538622Florina Muntenescu * limitations under the License.
1534f575b4b17fe635684e76e02685978477538622Florina Muntenescu */
1634f575b4b17fe635684e76e02685978477538622Florina Muntenescu
17ba069d50913c3fb250bb60ec310439db36895337Alan Viverettepackage androidx.room.integration.kotlintestapp.test
1834f575b4b17fe635684e76e02685978477538622Florina Muntenescu
197167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescuimport android.database.sqlite.SQLiteConstraintException
200e87fcf7a6a7df8d169c73a6b6b83009e70e17f3Aurimas Liutikasimport android.support.test.filters.SdkSuppress
2133e1a32a869ef4b296ab616acb47896a32ec5eb5Florina Muntenescuimport android.support.test.filters.SmallTest
22ddee2b5170ae257a7b2494f8aaa8459ebed806dcAurimas Liutikasimport androidx.arch.core.executor.ArchTaskExecutor
23ba069d50913c3fb250bb60ec310439db36895337Alan Viveretteimport androidx.room.integration.kotlintestapp.vo.Author
24ba069d50913c3fb250bb60ec310439db36895337Alan Viveretteimport androidx.room.integration.kotlintestapp.vo.Book
25ba069d50913c3fb250bb60ec310439db36895337Alan Viveretteimport androidx.room.integration.kotlintestapp.vo.BookWithPublisher
26ba069d50913c3fb250bb60ec310439db36895337Alan Viveretteimport androidx.room.integration.kotlintestapp.vo.Lang
27ba069d50913c3fb250bb60ec310439db36895337Alan Viveretteimport androidx.room.integration.kotlintestapp.vo.Publisher
2867ff17da9546803a38f8144b7a466a116e622866Tyson Henningimport com.google.common.base.Optional
2967ff17da9546803a38f8144b7a466a116e622866Tyson Henningimport io.reactivex.Flowable
3067ff17da9546803a38f8144b7a466a116e622866Tyson Henningimport io.reactivex.schedulers.Schedulers
3167ff17da9546803a38f8144b7a466a116e622866Tyson Henningimport io.reactivex.subscribers.TestSubscriber
320d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescuimport org.hamcrest.CoreMatchers
3334f575b4b17fe635684e76e02685978477538622Florina Muntenescuimport org.hamcrest.CoreMatchers.`is`
3426549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Arakiimport org.hamcrest.CoreMatchers.equalTo
357167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescuimport org.hamcrest.CoreMatchers.instanceOf
3626549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Arakiimport org.hamcrest.CoreMatchers.notNullValue
3734f575b4b17fe635684e76e02685978477538622Florina Muntenescuimport org.hamcrest.MatcherAssert.assertThat
387167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescuimport org.junit.Assert.assertNotNull
3934f575b4b17fe635684e76e02685978477538622Florina Muntenescuimport org.junit.Test
400d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescuimport java.util.Date
4134f575b4b17fe635684e76e02685978477538622Florina Muntenescu
4233e1a32a869ef4b296ab616acb47896a32ec5eb5Florina Muntenescu@SmallTest
4334f575b4b17fe635684e76e02685978477538622Florina Muntenescuclass BooksDaoTest : TestDatabaseTest() {
4434f575b4b17fe635684e76e02685978477538622Florina Muntenescu
4534f575b4b17fe635684e76e02685978477538622Florina Muntenescu    @Test
4634f575b4b17fe635684e76e02685978477538622Florina Muntenescu    fun bookById() {
4734f575b4b17fe635684e76e02685978477538622Florina Muntenescu        booksDao.addAuthors(TestUtil.AUTHOR_1)
4834f575b4b17fe635684e76e02685978477538622Florina Muntenescu        booksDao.addPublishers(TestUtil.PUBLISHER)
4934f575b4b17fe635684e76e02685978477538622Florina Muntenescu        booksDao.addBooks(TestUtil.BOOK_1)
5034f575b4b17fe635684e76e02685978477538622Florina Muntenescu
5134f575b4b17fe635684e76e02685978477538622Florina Muntenescu        assertThat(booksDao.getBook(TestUtil.BOOK_1.bookId), `is`<Book>(TestUtil.BOOK_1))
5234f575b4b17fe635684e76e02685978477538622Florina Muntenescu    }
5334f575b4b17fe635684e76e02685978477538622Florina Muntenescu
540e87fcf7a6a7df8d169c73a6b6b83009e70e17f3Aurimas Liutikas    @SdkSuppress(minSdkVersion = 24)
5534f575b4b17fe635684e76e02685978477538622Florina Muntenescu    @Test
56c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning    fun bookByIdJavaOptional() {
57c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning        booksDao.addAuthors(TestUtil.AUTHOR_1)
58c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning        booksDao.addPublishers(TestUtil.PUBLISHER)
59c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning        booksDao.addBooks(TestUtil.BOOK_1)
60c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning
61c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning        assertThat(
62c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning                booksDao.getBookJavaOptional(TestUtil.BOOK_1.bookId),
63c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning                `is`<java.util.Optional<Book>>(java.util.Optional.of(TestUtil.BOOK_1)))
64c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning    }
65c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning
660e87fcf7a6a7df8d169c73a6b6b83009e70e17f3Aurimas Liutikas    @SdkSuppress(minSdkVersion = 24)
67c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning    @Test
68c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning    fun bookByIdJavaOptionalEmpty() {
69c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning        assertThat(
70c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning                booksDao.getBookJavaOptional(TestUtil.BOOK_1.bookId),
71c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning                `is`<java.util.Optional<Book>>(java.util.Optional.empty()))
72c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning    }
73c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning
74c1fa1f4c9d1d61e344d4310928014132cb4fa4f4Tyson Henning    @Test
75f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning    fun bookByIdListenableFuture() {
76f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning        booksDao.addAuthors(TestUtil.AUTHOR_1)
77f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning        booksDao.addPublishers(TestUtil.PUBLISHER)
78f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning        booksDao.addBooks(TestUtil.BOOK_1)
79f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning
80f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning        assertThat(
81f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning                booksDao.getBookListenableFuture(TestUtil.BOOK_1.bookId).get(),
82f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning                `is`<Book>(TestUtil.BOOK_1))
83f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning    }
84f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning
85f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning    @Test
8667ff17da9546803a38f8144b7a466a116e622866Tyson Henning    fun bookByIdOptional() {
8767ff17da9546803a38f8144b7a466a116e622866Tyson Henning        booksDao.addAuthors(TestUtil.AUTHOR_1)
8867ff17da9546803a38f8144b7a466a116e622866Tyson Henning        booksDao.addPublishers(TestUtil.PUBLISHER)
8967ff17da9546803a38f8144b7a466a116e622866Tyson Henning        booksDao.addBooks(TestUtil.BOOK_1)
9067ff17da9546803a38f8144b7a466a116e622866Tyson Henning
9167ff17da9546803a38f8144b7a466a116e622866Tyson Henning        assertThat(
9267ff17da9546803a38f8144b7a466a116e622866Tyson Henning                booksDao.getBookOptional(TestUtil.BOOK_1.bookId),
9367ff17da9546803a38f8144b7a466a116e622866Tyson Henning                `is`<Optional<Book>>(Optional.of(TestUtil.BOOK_1)))
9467ff17da9546803a38f8144b7a466a116e622866Tyson Henning    }
9567ff17da9546803a38f8144b7a466a116e622866Tyson Henning
9667ff17da9546803a38f8144b7a466a116e622866Tyson Henning    @Test
97f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning    fun bookByIdOptionalListenableFuture() {
98f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning        booksDao.addAuthors(TestUtil.AUTHOR_1)
99f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning        booksDao.addPublishers(TestUtil.PUBLISHER)
100f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning        booksDao.addBooks(TestUtil.BOOK_1)
101f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning
102f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning        assertThat(
103f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning                booksDao.getBookOptionalListenableFuture(TestUtil.BOOK_1.bookId).get(),
104f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning                `is`<Optional<Book>>(Optional.of(TestUtil.BOOK_1)))
105f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning    }
106f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning
107f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning    @Test
108f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning    fun bookByIdOptionalListenableFutureAbsent() {
109f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning        assertThat(
110f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning                booksDao.getBookOptionalListenableFuture(TestUtil.BOOK_1.bookId).get(),
111f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning                `is`<Optional<Book>>(Optional.absent()))
112f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning    }
113f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning
114f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning    @Test
11567ff17da9546803a38f8144b7a466a116e622866Tyson Henning    fun bookByIdOptionalAbsent() {
11667ff17da9546803a38f8144b7a466a116e622866Tyson Henning        assertThat(
11767ff17da9546803a38f8144b7a466a116e622866Tyson Henning                booksDao.getBookOptional(TestUtil.BOOK_1.bookId),
11867ff17da9546803a38f8144b7a466a116e622866Tyson Henning                `is`<Optional<Book>>(Optional.absent()))
11967ff17da9546803a38f8144b7a466a116e622866Tyson Henning    }
12067ff17da9546803a38f8144b7a466a116e622866Tyson Henning
12167ff17da9546803a38f8144b7a466a116e622866Tyson Henning    @Test
12267ff17da9546803a38f8144b7a466a116e622866Tyson Henning    fun bookByIdOptionalFlowable() {
12367ff17da9546803a38f8144b7a466a116e622866Tyson Henning        booksDao.addAuthors(TestUtil.AUTHOR_1)
12467ff17da9546803a38f8144b7a466a116e622866Tyson Henning        booksDao.addPublishers(TestUtil.PUBLISHER)
12567ff17da9546803a38f8144b7a466a116e622866Tyson Henning        booksDao.addBooks(TestUtil.BOOK_1)
12667ff17da9546803a38f8144b7a466a116e622866Tyson Henning
12767ff17da9546803a38f8144b7a466a116e622866Tyson Henning        val subscriber = TestSubscriber<Optional<Book>>()
12867ff17da9546803a38f8144b7a466a116e622866Tyson Henning        val flowable: Flowable<Optional<Book>> =
12967ff17da9546803a38f8144b7a466a116e622866Tyson Henning                booksDao.getBookOptionalFlowable(TestUtil.BOOK_1.bookId)
13067ff17da9546803a38f8144b7a466a116e622866Tyson Henning        flowable.observeOn(Schedulers.from(ArchTaskExecutor.getMainThreadExecutor()))
13167ff17da9546803a38f8144b7a466a116e622866Tyson Henning                .subscribeWith(subscriber)
13267ff17da9546803a38f8144b7a466a116e622866Tyson Henning
13367ff17da9546803a38f8144b7a466a116e622866Tyson Henning        assertThat(subscriber.values().size, `is`(1))
13467ff17da9546803a38f8144b7a466a116e622866Tyson Henning        assertThat(subscriber.values()[0], `is`(Optional.of(TestUtil.BOOK_1)))
13567ff17da9546803a38f8144b7a466a116e622866Tyson Henning    }
13667ff17da9546803a38f8144b7a466a116e622866Tyson Henning
13767ff17da9546803a38f8144b7a466a116e622866Tyson Henning    @Test
13867ff17da9546803a38f8144b7a466a116e622866Tyson Henning    fun bookByIdOptionalFlowableAbsent() {
13967ff17da9546803a38f8144b7a466a116e622866Tyson Henning        val subscriber = TestSubscriber<Optional<Book>>()
14067ff17da9546803a38f8144b7a466a116e622866Tyson Henning        val flowable: Flowable<Optional<Book>> =
14167ff17da9546803a38f8144b7a466a116e622866Tyson Henning                booksDao.getBookOptionalFlowable(TestUtil.BOOK_1.bookId)
14267ff17da9546803a38f8144b7a466a116e622866Tyson Henning        flowable.observeOn(Schedulers.from(ArchTaskExecutor.getMainThreadExecutor()))
14367ff17da9546803a38f8144b7a466a116e622866Tyson Henning                .subscribeWith(subscriber)
14467ff17da9546803a38f8144b7a466a116e622866Tyson Henning
14567ff17da9546803a38f8144b7a466a116e622866Tyson Henning        assertThat(subscriber.values().size, `is`(1))
14667ff17da9546803a38f8144b7a466a116e622866Tyson Henning        assertThat(subscriber.values()[0], `is`(Optional.absent()))
14767ff17da9546803a38f8144b7a466a116e622866Tyson Henning    }
14867ff17da9546803a38f8144b7a466a116e622866Tyson Henning
14967ff17da9546803a38f8144b7a466a116e622866Tyson Henning    @Test
15034f575b4b17fe635684e76e02685978477538622Florina Muntenescu    fun bookWithPublisher() {
15134f575b4b17fe635684e76e02685978477538622Florina Muntenescu        booksDao.addAuthors(TestUtil.AUTHOR_1)
15234f575b4b17fe635684e76e02685978477538622Florina Muntenescu        booksDao.addPublishers(TestUtil.PUBLISHER)
15334f575b4b17fe635684e76e02685978477538622Florina Muntenescu        booksDao.addBooks(TestUtil.BOOK_1)
15434f575b4b17fe635684e76e02685978477538622Florina Muntenescu
155bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar        val expected = BookWithPublisher(TestUtil.BOOK_1.bookId, TestUtil.BOOK_1.title,
15634f575b4b17fe635684e76e02685978477538622Florina Muntenescu                TestUtil.PUBLISHER)
157bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar        val expectedList = ArrayList<BookWithPublisher>()
15834f575b4b17fe635684e76e02685978477538622Florina Muntenescu        expectedList.add(expected)
15934f575b4b17fe635684e76e02685978477538622Florina Muntenescu
16034f575b4b17fe635684e76e02685978477538622Florina Muntenescu        assertThat(database.booksDao().getBooksWithPublisher(),
16134f575b4b17fe635684e76e02685978477538622Florina Muntenescu                `is`<List<BookWithPublisher>>(expectedList))
162f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning    }
163f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning
164f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning    @Test
165f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning    fun bookWithPublisherListenableFuture() {
166f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning        booksDao.addAuthors(TestUtil.AUTHOR_1)
167f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning        booksDao.addPublishers(TestUtil.PUBLISHER)
168f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning        booksDao.addBooks(TestUtil.BOOK_1)
169f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning
170f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning        val expected = BookWithPublisher(TestUtil.BOOK_1.bookId, TestUtil.BOOK_1.title,
171f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning                TestUtil.PUBLISHER)
172f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning        val expectedList = ArrayList<BookWithPublisher>()
173f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning        expectedList.add(expected)
174f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning
175f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning        assertThat(database.booksDao().getBooksWithPublisherListenableFuture().get(),
176f1ae0061c85cdb02bd124f8f8c7a934aa75e62feTyson Henning                `is`<List<BookWithPublisher>>(expectedList))
17734f575b4b17fe635684e76e02685978477538622Florina Muntenescu    }
17834f575b4b17fe635684e76e02685978477538622Florina Muntenescu
17934f575b4b17fe635684e76e02685978477538622Florina Muntenescu    @Test
1807167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescu    fun updateBookWithNullTitle() {
1817167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescu        booksDao.addPublishers(TestUtil.PUBLISHER)
1827167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescu        booksDao.addBooks(TestUtil.BOOK_1)
1837167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescu
1847167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescu        var throwable: Throwable? = null
1857167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescu        try {
1867167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescu            booksDao.updateBookTitle(TestUtil.BOOK_1.bookId, null)
1877167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescu        } catch (t: Throwable) {
1887167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescu            throwable = t
1897167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescu        }
1907167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescu        assertNotNull(throwable)
1917167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescu        assertThat<Throwable>(throwable, instanceOf<Throwable>(SQLiteConstraintException::class
1927167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescu                .java))
1937167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescu    }
1947167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescu
1957167222ccd7a916d7e286352c1399c60f85c090dFlorina Muntenescu    @Test
19634f575b4b17fe635684e76e02685978477538622Florina Muntenescu    fun publisherWithBooks() {
19734f575b4b17fe635684e76e02685978477538622Florina Muntenescu        booksDao.addAuthors(TestUtil.AUTHOR_1)
19834f575b4b17fe635684e76e02685978477538622Florina Muntenescu        booksDao.addPublishers(TestUtil.PUBLISHER)
19934f575b4b17fe635684e76e02685978477538622Florina Muntenescu        booksDao.addBooks(TestUtil.BOOK_1, TestUtil.BOOK_2)
20034f575b4b17fe635684e76e02685978477538622Florina Muntenescu
2013ea1d11500fdfe07866c1d6fcc970159d0f04f3aYigit Boyar        val actualPublisherWithBooks = booksDao.getPublisherWithBooks(
20234f575b4b17fe635684e76e02685978477538622Florina Muntenescu                TestUtil.PUBLISHER.publisherId)
20334f575b4b17fe635684e76e02685978477538622Florina Muntenescu
20434f575b4b17fe635684e76e02685978477538622Florina Muntenescu        assertThat(actualPublisherWithBooks.publisher, `is`<Publisher>(TestUtil.PUBLISHER))
20534f575b4b17fe635684e76e02685978477538622Florina Muntenescu        assertThat(actualPublisherWithBooks.books?.size, `is`(2))
20634f575b4b17fe635684e76e02685978477538622Florina Muntenescu        assertThat(actualPublisherWithBooks.books?.get(0), `is`<Book>(TestUtil.BOOK_1))
20734f575b4b17fe635684e76e02685978477538622Florina Muntenescu        assertThat(actualPublisherWithBooks.books?.get(1), `is`<Book>(TestUtil.BOOK_2))
20834f575b4b17fe635684e76e02685978477538622Florina Muntenescu    }
2090d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu
2103ea1d11500fdfe07866c1d6fcc970159d0f04f3aYigit Boyar    @Test // b/68077506
2113ea1d11500fdfe07866c1d6fcc970159d0f04f3aYigit Boyar    fun publisherWithBookSales() {
2123ea1d11500fdfe07866c1d6fcc970159d0f04f3aYigit Boyar        booksDao.addAuthors(TestUtil.AUTHOR_1)
2133ea1d11500fdfe07866c1d6fcc970159d0f04f3aYigit Boyar        booksDao.addPublishers(TestUtil.PUBLISHER)
2143ea1d11500fdfe07866c1d6fcc970159d0f04f3aYigit Boyar        booksDao.addBooks(TestUtil.BOOK_1, TestUtil.BOOK_2)
2153ea1d11500fdfe07866c1d6fcc970159d0f04f3aYigit Boyar        val actualPublisherWithBooks = booksDao.getPublisherWithBookSales(
2163ea1d11500fdfe07866c1d6fcc970159d0f04f3aYigit Boyar                TestUtil.PUBLISHER.publisherId)
2173ea1d11500fdfe07866c1d6fcc970159d0f04f3aYigit Boyar
2183ea1d11500fdfe07866c1d6fcc970159d0f04f3aYigit Boyar        assertThat(actualPublisherWithBooks.publisher, `is`<Publisher>(TestUtil.PUBLISHER))
2193ea1d11500fdfe07866c1d6fcc970159d0f04f3aYigit Boyar        assertThat(actualPublisherWithBooks.sales, `is`(listOf(TestUtil.BOOK_1.salesCnt,
2203ea1d11500fdfe07866c1d6fcc970159d0f04f3aYigit Boyar                TestUtil.BOOK_2.salesCnt)))
2213ea1d11500fdfe07866c1d6fcc970159d0f04f3aYigit Boyar    }
2223ea1d11500fdfe07866c1d6fcc970159d0f04f3aYigit Boyar
2230d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu    @Test
2240d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu    fun insertAuthorWithAllFields() {
2250d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu        val author = Author("id", "name", Date(), ArrayList())
2260d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu        database.booksDao().addAuthors(author)
2270d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu
2280d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu        val authorDb = database.booksDao().getAuthor(author.authorId)
2290d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu
2300d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu        assertThat(authorDb, CoreMatchers.`is`<Author>(author))
2310d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu    }
2320d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu
2330d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu    @Test
2340d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu    fun insertInInheritedDao() {
2350d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu        database.derivedDao().insert(TestUtil.AUTHOR_1)
2360d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu
2370d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu        val author = database.derivedDao().getAuthor(TestUtil.AUTHOR_1.authorId)
2380d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu
2390d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu        assertThat(author, CoreMatchers.`is`<Author>(TestUtil.AUTHOR_1))
2400d59e251a0d971be43cefa8e3907f4332dc7a3c5Florina Muntenescu    }
2410348c0148cc4433b787c606e5d658d94ec058e95Yigit Boyar
2420348c0148cc4433b787c606e5d658d94ec058e95Yigit Boyar    @Test
2430348c0148cc4433b787c606e5d658d94ec058e95Yigit Boyar    fun findBooksInMultiLineQuery() {
2440348c0148cc4433b787c606e5d658d94ec058e95Yigit Boyar        booksDao.addPublishers(TestUtil.PUBLISHER)
2450348c0148cc4433b787c606e5d658d94ec058e95Yigit Boyar        booksDao.addBooks(TestUtil.BOOK_1)
2460348c0148cc4433b787c606e5d658d94ec058e95Yigit Boyar        booksDao.addBooks(TestUtil.BOOK_2)
2470348c0148cc4433b787c606e5d658d94ec058e95Yigit Boyar
2480348c0148cc4433b787c606e5d658d94ec058e95Yigit Boyar        val books = database.booksDao().getBooksMultiLineQuery(arrayListOf(
2490348c0148cc4433b787c606e5d658d94ec058e95Yigit Boyar                TestUtil.BOOK_1.bookId,
2500348c0148cc4433b787c606e5d658d94ec058e95Yigit Boyar                TestUtil.BOOK_2.bookId))
2510348c0148cc4433b787c606e5d658d94ec058e95Yigit Boyar        assertThat(books, `is`(listOf(TestUtil.BOOK_2, TestUtil.BOOK_1)))
2520348c0148cc4433b787c606e5d658d94ec058e95Yigit Boyar    }
2532fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar
2542fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar    @Test
2552fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar    fun findBooksByLanguage() {
2562fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar        booksDao.addPublishers(TestUtil.PUBLISHER)
2572fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar        val book1 = TestUtil.BOOK_1.copy(languages = setOf(Lang.TR))
2582fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar        val book2 = TestUtil.BOOK_2.copy(languages = setOf(Lang.ES, Lang.TR))
2592fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar        val book3 = TestUtil.BOOK_3.copy(languages = setOf(Lang.EN))
2602fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar        booksDao.addBooks(book1, book2, book3)
2612fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar
2622fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar        assertThat(booksDao.findByLanguages(setOf(Lang.EN, Lang.TR)),
2632fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar                `is`(listOf(book1, book2, book3)))
2642fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar
2652fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar        assertThat(booksDao.findByLanguages(setOf(Lang.TR)),
2662fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar                `is`(listOf(book1, book2)))
2672fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar
2682fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar        assertThat(booksDao.findByLanguages(setOf(Lang.ES)),
2692fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar                `is`(listOf(book2)))
2702fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar
2712fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar        assertThat(booksDao.findByLanguages(setOf(Lang.EN)),
2722fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar                `is`(listOf(book3)))
2732fb00f11f2e6d90edf678daaa921a3ef1b55a51bYigit Boyar    }
274bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar
275bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar    @Test
276bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar    fun insertVarargInInheritedDao() {
277bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar        database.derivedDao().insertAllArg(TestUtil.AUTHOR_1, TestUtil.AUTHOR_2)
278bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar
279bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar        val author = database.derivedDao().getAuthor(TestUtil.AUTHOR_1.authorId)
280bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar
281bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar        assertThat(author, CoreMatchers.`is`<Author>(TestUtil.AUTHOR_1))
282bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar    }
283bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar
284bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar    @Test
285bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar    fun insertListInInheritedDao() {
286bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar        database.derivedDao().insertAll(listOf(TestUtil.AUTHOR_1))
287bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar
288bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar        val author = database.derivedDao().getAuthor(TestUtil.AUTHOR_1.authorId)
289bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar
290bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar        assertThat(author, CoreMatchers.`is`<Author>(TestUtil.AUTHOR_1))
291bfc7aac93a790e446a867f203263868c9a93fd4cYigit Boyar    }
29226549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki
29326549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki    @Test
29426549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki    fun deleteAndAddPublisher() {
29526549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki        booksDao.addPublishers(TestUtil.PUBLISHER)
29626549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki        booksDao.getPublishers().run {
29726549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki            assertThat(this.size, `is`(1))
29826549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki            assertThat(this.first(), `is`(equalTo(TestUtil.PUBLISHER)))
29926549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki        }
30026549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki        booksDao.deleteAndAddPublisher(TestUtil.PUBLISHER, TestUtil.PUBLISHER2)
30126549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki        booksDao.getPublishers().run {
30226549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki            assertThat(this.size, `is`(1))
30326549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki            assertThat(this.first(), `is`(equalTo(TestUtil.PUBLISHER2)))
30426549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki        }
30526549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki    }
30626549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki
30726549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki    @Test
30826549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki    fun deleteAndAddPublisher_failure() {
30926549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki        booksDao.addPublishers(TestUtil.PUBLISHER)
31026549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki        booksDao.getPublishers().run {
31126549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki            assertThat(this.size, `is`(1))
31226549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki            assertThat(this.first(), `is`(equalTo(TestUtil.PUBLISHER)))
31326549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki        }
31426549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki        var throwable: Throwable? = null
31526549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki        try {
31626549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki            booksDao.deleteAndAddPublisher(TestUtil.PUBLISHER, TestUtil.PUBLISHER2, true)
31726549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki        } catch (e: RuntimeException) {
31826549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki            throwable = e
31926549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki        }
32026549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki        assertThat(throwable, `is`(notNullValue()))
32126549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki        booksDao.getPublishers().run {
32226549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki            assertThat(this.size, `is`(1))
32326549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki            assertThat(this.first(), `is`(equalTo(TestUtil.PUBLISHER)))
32426549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki        }
32526549cc5374db3cbd1c1553069a3cfff02ea37adYuichi Araki    }
32634f575b4b17fe635684e76e02685978477538622Florina Muntenescu}
327