From 92392ba13d1082bd9adac7bdbc53fa657261a57d Mon Sep 17 00:00:00 2001 From: lihenggui Date: Thu, 15 Feb 2024 17:15:00 -0800 Subject: [PATCH] Add implementations in the test module --- core/database/build.gradle.kts | 46 ++++++++----------- .../core/database/DriverModule.kt | 1 - .../core/database/BaseTest.android.kt | 28 +++++++++++ .../core/database/DatabaseModule.kt | 1 - .../core/database/DriverModule.kt | 1 - .../nowinandroid/core/database/BaseTest.kt | 31 +++++++++++++ .../core/database/dao/NewsResourceDaoTest.kt | 26 ++++------- .../core/database/DriverModule.kt | 1 - .../nowinandroid/core/database/BaseTest.js.kt | 29 ++++++++++++ .../core/database/DriverModule.kt | 1 - .../core/database/BaseTest.jvm.kt | 26 +++++++++++ .../core/database/DriverModule.kt | 1 - .../core/database/BaseTest.native.kt | 26 +++++++++++ 13 files changed, 170 insertions(+), 48 deletions(-) create mode 100644 core/database/src/androidUnitTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.android.kt create mode 100644 core/database/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.kt rename core/database/src/{androidTest => commonTest}/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt (93%) create mode 100644 core/database/src/jsTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.js.kt create mode 100644 core/database/src/jvmTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.jvm.kt create mode 100644 core/database/src/nativeTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.native.kt diff --git a/core/database/build.gradle.kts b/core/database/build.gradle.kts index 3ff4e180f..51c382775 100644 --- a/core/database/build.gradle.kts +++ b/core/database/build.gradle.kts @@ -30,36 +30,30 @@ android { kotlin { sourceSets { - val commonMain by getting { - dependencies { - api(projects.core.model) - implementation(libs.kotlinx.datetime) - implementation(libs.kotlinInject.runtime) - implementation(libs.sqldelight.coroutines.extensions) - implementation(libs.sqldelight.primitive.adapters) - } + commonMain.dependencies { + api(projects.core.model) + implementation(libs.kotlinx.datetime) + implementation(libs.kotlinInject.runtime) + implementation(libs.sqldelight.coroutines.extensions) + implementation(libs.sqldelight.primitive.adapters) } - val androidMain by getting { - dependencies { - implementation(libs.sqldelight.android.driver) - } + androidMain.dependencies { + implementation(libs.sqldelight.android.driver) } - val nativeMain by getting { - dependencies { - implementation(libs.sqldelight.native.driver) - } + androidUnitTest.dependencies { + implementation(libs.androidx.test.core) } - val jvmMain by getting { - dependencies { - implementation(libs.sqldelight.sqlite.driver) - } + nativeMain.dependencies { + implementation(libs.sqldelight.native.driver) } - val jsMain by getting { - dependencies { - implementation(libs.sqldelight.webworker.driver) - implementation(npm("sql.js", "1.6.2")) - implementation(devNpm("copy-webpack-plugin", "9.1.0")) - } + + jvmMain.dependencies { + implementation(libs.sqldelight.sqlite.driver) + } + jsMain.dependencies { + implementation(libs.sqldelight.webworker.driver) + implementation(npm("sql.js", "1.6.2")) + implementation(devNpm("copy-webpack-plugin", "9.1.0")) } commonTest.dependencies { implementation(libs.kotlin.test) diff --git a/core/database/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt b/core/database/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt index 7ffe43ffb..4e703461d 100644 --- a/core/database/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt +++ b/core/database/src/androidMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt @@ -22,7 +22,6 @@ import app.cash.sqldelight.db.QueryResult import app.cash.sqldelight.db.SqlDriver import app.cash.sqldelight.db.SqlSchema import app.cash.sqldelight.driver.android.AndroidSqliteDriver -import me.tatarka.inject.annotations.Component import me.tatarka.inject.annotations.Inject import me.tatarka.inject.annotations.Provides diff --git a/core/database/src/androidUnitTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.android.kt b/core/database/src/androidUnitTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.android.kt new file mode 100644 index 000000000..e478729b9 --- /dev/null +++ b/core/database/src/androidUnitTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.android.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.database + +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import app.cash.sqldelight.async.coroutines.synchronous +import app.cash.sqldelight.db.SqlDriver +import app.cash.sqldelight.driver.android.AndroidSqliteDriver + +actual suspend fun createDriver(): SqlDriver { + val context: Context = ApplicationProvider.getApplicationContext() + return AndroidSqliteDriver(NiaDatabase.Schema.synchronous(), context, "nia-database-test.db") +} diff --git a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DatabaseModule.kt b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DatabaseModule.kt index 6e412f799..d5bddadc4 100644 --- a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DatabaseModule.kt +++ b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DatabaseModule.kt @@ -23,7 +23,6 @@ import com.google.samples.apps.nowinandroid.core.database.dao.RecentSearchQueryD import com.google.samples.apps.nowinandroid.core.database.dao.TopicDao import com.google.samples.apps.nowinandroid.core.database.dao.TopicFtsDao import kotlinx.coroutines.Dispatchers -import me.tatarka.inject.annotations.Component import me.tatarka.inject.annotations.Provides internal object DatabaseModule { diff --git a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt index 344c62d86..aaeaf9b15 100644 --- a/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt +++ b/core/database/src/commonMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt @@ -19,7 +19,6 @@ package com.google.samples.apps.nowinandroid.core.database import app.cash.sqldelight.db.QueryResult import app.cash.sqldelight.db.SqlDriver import app.cash.sqldelight.db.SqlSchema -import me.tatarka.inject.annotations.Component import me.tatarka.inject.annotations.Provides expect class DriverModule { diff --git a/core/database/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.kt b/core/database/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.kt new file mode 100644 index 000000000..a337ab8f9 --- /dev/null +++ b/core/database/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.database + +import app.cash.sqldelight.db.SqlDriver +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.test.runTest + +/** + * Init driver for each platform. Should *always* be called to setup test + */ +expect suspend fun createDriver(): SqlDriver +fun testing(block: suspend CoroutineScope.(NiaDatabase) -> Unit) = runTest { + val driver = createDriver() + block(NiaDatabase(driver)) + driver.close() +} diff --git a/core/database/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt b/core/database/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt similarity index 93% rename from core/database/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt rename to core/database/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt index 55e817618..8b873e8cb 100644 --- a/core/database/src/androidTest/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt +++ b/core/database/src/commonTest/kotlin/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt @@ -1,5 +1,5 @@ /* - * Copyright 2022 The Android Open Source Project + * Copyright 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,36 +16,30 @@ package com.google.samples.apps.nowinandroid.core.database.dao -import android.content.Context -import androidx.room.Room -import androidx.test.core.app.ApplicationProvider import com.google.samples.apps.nowinandroid.core.database.NiaDatabase +import com.google.samples.apps.nowinandroid.core.database.createDriver import com.google.samples.apps.nowinandroid.core.database.model.NewsResourceEntity import com.google.samples.apps.nowinandroid.core.database.model.NewsResourceTopicCrossRef import com.google.samples.apps.nowinandroid.core.database.model.TopicEntity import com.google.samples.apps.nowinandroid.core.database.model.asExternalModel +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import kotlinx.datetime.Instant -import org.junit.Before -import org.junit.Test +import kotlin.test.BeforeTest +import kotlin.test.Test import kotlin.test.assertEquals class NewsResourceDaoTest { private lateinit var newsResourceDao: NewsResourceDao private lateinit var topicDao: TopicDao - private lateinit var db: NiaDatabase - @Before - fun createDb() { - val context = ApplicationProvider.getApplicationContext() - db = Room.inMemoryDatabaseBuilder( - context, - NiaDatabase::class.java, - ).build() - newsResourceDao = db.newsResourceDao() - topicDao = db.topicDao() + @BeforeTest + fun setup() = runTest { + val db = NiaDatabase(createDriver()) + newsResourceDao = NewsResourceDao(db, Dispatchers.Unconfined) + topicDao = TopicDao(db, Dispatchers.Unconfined) } @Test diff --git a/core/database/src/jsMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt b/core/database/src/jsMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt index 298cd9873..4a34bc105 100644 --- a/core/database/src/jsMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt +++ b/core/database/src/jsMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt @@ -20,7 +20,6 @@ import app.cash.sqldelight.db.QueryResult import app.cash.sqldelight.db.SqlDriver import app.cash.sqldelight.db.SqlSchema import app.cash.sqldelight.driver.worker.WebWorkerDriver -import me.tatarka.inject.annotations.Component import me.tatarka.inject.annotations.Provides import org.w3c.dom.Worker diff --git a/core/database/src/jsTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.js.kt b/core/database/src/jsTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.js.kt new file mode 100644 index 000000000..39e519254 --- /dev/null +++ b/core/database/src/jsTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.js.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.database + +import app.cash.sqldelight.db.SqlDriver +import app.cash.sqldelight.driver.worker.WebWorkerDriver +import org.w3c.dom.Worker + +actual suspend fun createDriver(): SqlDriver { + return WebWorkerDriver( + Worker( + js("""new URL("@cashapp/sqldelight-sqljs-worker/sqljs.worker.js", import.meta.url)"""), + ), + ).also { NiaDatabase.Schema.create(it).await() } +} diff --git a/core/database/src/jvmMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt b/core/database/src/jvmMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt index 54b6efc42..8b8e797dc 100644 --- a/core/database/src/jvmMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt +++ b/core/database/src/jvmMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt @@ -20,7 +20,6 @@ import app.cash.sqldelight.db.QueryResult import app.cash.sqldelight.db.SqlDriver import app.cash.sqldelight.db.SqlSchema import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver -import me.tatarka.inject.annotations.Component import me.tatarka.inject.annotations.Provides actual class DriverModule { diff --git a/core/database/src/jvmTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.jvm.kt b/core/database/src/jvmTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.jvm.kt new file mode 100644 index 000000000..a77aa2349 --- /dev/null +++ b/core/database/src/jvmTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.jvm.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.database + +import app.cash.sqldelight.db.SqlDriver +import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver +import com.google.samples.apps.nowinandroid.core.database.NiaDatabase.Companion.Schema + +actual suspend fun createDriver(): SqlDriver { + return JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY) + .also { Schema.create(it).await() } +} diff --git a/core/database/src/nativeMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt b/core/database/src/nativeMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt index cdb3a75bb..cd54d58d2 100644 --- a/core/database/src/nativeMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt +++ b/core/database/src/nativeMain/kotlin/com/google/samples/apps/nowinandroid/core/database/DriverModule.kt @@ -21,7 +21,6 @@ import app.cash.sqldelight.db.QueryResult import app.cash.sqldelight.db.SqlDriver import app.cash.sqldelight.db.SqlSchema import app.cash.sqldelight.driver.native.NativeSqliteDriver -import me.tatarka.inject.annotations.Component import me.tatarka.inject.annotations.Provides actual class DriverModule { diff --git a/core/database/src/nativeTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.native.kt b/core/database/src/nativeTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.native.kt new file mode 100644 index 000000000..d7b6b1c9d --- /dev/null +++ b/core/database/src/nativeTest/kotlin/com/google/samples/apps/nowinandroid/core/database/BaseTest.native.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid.core.database + +import app.cash.sqldelight.async.coroutines.synchronous +import app.cash.sqldelight.db.SqlDriver +import app.cash.sqldelight.driver.native.NativeSqliteDriver +import com.google.samples.apps.nowinandroid.core.database.NiaDatabase.Companion.Schema + +actual suspend fun createDriver(): SqlDriver { + return NativeSqliteDriver(Schema.synchronous(), "nia-database-test.db") +}