From 47f50aad95075acdf41fb0ab467296fb93854654 Mon Sep 17 00:00:00 2001 From: Yoon SungHyun Date: Sun, 27 Aug 2023 23:22:37 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20step2=20=EA=B5=AC=ED=98=84=20(#98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../edu/github/data/network/GitHubService.kt | 9 +++ .../network/GithubRepositoriesDataSource.kt | 12 ++++ .../GithubRepositoriesDataSourceTest.kt | 67 +++++++++++++++++++ core/data/src/test/resources/response.json | 4 ++ .../edu/github/domain/GithubRepository.kt | 9 +++ .../github/domain/network/GitHubDataSource.kt | 7 ++ 6 files changed, 108 insertions(+) create mode 100644 core/data/src/main/java/camp/nextstep/edu/github/data/network/GitHubService.kt create mode 100644 core/data/src/main/java/camp/nextstep/edu/github/data/network/GithubRepositoriesDataSource.kt create mode 100644 core/data/src/test/java/camp/nextstep/edu/github/data/network/GithubRepositoriesDataSourceTest.kt create mode 100644 core/data/src/test/resources/response.json create mode 100644 core/domain/src/main/java/camp/nextstep/edu/github/domain/GithubRepository.kt create mode 100644 core/domain/src/main/java/camp/nextstep/edu/github/domain/network/GitHubDataSource.kt diff --git a/core/data/src/main/java/camp/nextstep/edu/github/data/network/GitHubService.kt b/core/data/src/main/java/camp/nextstep/edu/github/data/network/GitHubService.kt new file mode 100644 index 00000000..6880fd28 --- /dev/null +++ b/core/data/src/main/java/camp/nextstep/edu/github/data/network/GitHubService.kt @@ -0,0 +1,9 @@ +package camp.nextstep.edu.github.data.network + +import camp.nextstep.edu.github.domain.GithubRepository +import retrofit2.http.GET + +interface GitHubService { + @GET("/repositories") + suspend fun getRepositories(): List +} diff --git a/core/data/src/main/java/camp/nextstep/edu/github/data/network/GithubRepositoriesDataSource.kt b/core/data/src/main/java/camp/nextstep/edu/github/data/network/GithubRepositoriesDataSource.kt new file mode 100644 index 00000000..81958fb5 --- /dev/null +++ b/core/data/src/main/java/camp/nextstep/edu/github/data/network/GithubRepositoriesDataSource.kt @@ -0,0 +1,12 @@ +package camp.nextstep.edu.github.data.network + +import camp.nextstep.edu.github.domain.GithubRepository +import camp.nextstep.edu.github.domain.network.GitHubDataSource + +internal class GithubRepositoriesDataSource( + private val gitHubService: GitHubService +) : GitHubDataSource { + override suspend fun fetchRepositories(): List { + return gitHubService.getRepositories() + } +} diff --git a/core/data/src/test/java/camp/nextstep/edu/github/data/network/GithubRepositoriesDataSourceTest.kt b/core/data/src/test/java/camp/nextstep/edu/github/data/network/GithubRepositoriesDataSourceTest.kt new file mode 100644 index 00000000..e9471d02 --- /dev/null +++ b/core/data/src/test/java/camp/nextstep/edu/github/data/network/GithubRepositoriesDataSourceTest.kt @@ -0,0 +1,67 @@ +package camp.nextstep.edu.github.data.network + +import camp.nextstep.edu.github.domain.GithubRepository +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.test.runTest +import okhttp3.OkHttpClient +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.junit.After +import org.junit.Before +import org.junit.Test +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import java.io.File +import java.util.concurrent.TimeUnit + +class GithubRepositoriesDataSourceTest { + private lateinit var mockWebServer: MockWebServer + private lateinit var api: GitHubService + private lateinit var dataSource: GithubRepositoriesDataSource + + private val client = OkHttpClient.Builder() + .connectTimeout(1, TimeUnit.SECONDS) + .readTimeout(1, TimeUnit.SECONDS) + .writeTimeout(1, TimeUnit.SECONDS) + .build() + + @Before + fun setUp() { + mockWebServer = MockWebServer() + } + + @After + fun tearDown() { + mockWebServer.shutdown() + } + + @Test + fun `GitHub repository들을 불러옴`() = runTest { + api = Retrofit.Builder() + .baseUrl(mockWebServer.url("")) + .client(client) + .addConverterFactory(GsonConverterFactory.create()) + .build() + .create(GitHubService::class.java) + val body = File("src/test/resources/response.json").readText() + val response = MockResponse().setBody(body).setResponseCode(200) + mockWebServer.enqueue(response) + dataSource = GithubRepositoriesDataSource(api) + val actual = dataSource.fetchRepositories()[0] + val expected = GithubRepository("nextStep", "android-github") + assertThat(actual).isEqualTo(expected) + } + + @Test + fun `GitHub repository 실제 데이터 체크`() = runTest { + api = Retrofit.Builder() + .baseUrl(mockWebServer.url("https://api.github.com/")) + .client(client) + .addConverterFactory(GsonConverterFactory.create()) + .build() + .create(GitHubService::class.java) + dataSource = GithubRepositoriesDataSource(api) + val actual = dataSource.fetchRepositories() + assertThat(actual).hasSize(100) + } +} diff --git a/core/data/src/test/resources/response.json b/core/data/src/test/resources/response.json new file mode 100644 index 00000000..6432de16 --- /dev/null +++ b/core/data/src/test/resources/response.json @@ -0,0 +1,4 @@ +[{ + "full_name": "nextStep", + "description": "android-github" +}] \ No newline at end of file diff --git a/core/domain/src/main/java/camp/nextstep/edu/github/domain/GithubRepository.kt b/core/domain/src/main/java/camp/nextstep/edu/github/domain/GithubRepository.kt new file mode 100644 index 00000000..c1300c22 --- /dev/null +++ b/core/domain/src/main/java/camp/nextstep/edu/github/domain/GithubRepository.kt @@ -0,0 +1,9 @@ +package camp.nextstep.edu.github.domain + +import com.google.gson.annotations.SerializedName + +data class GithubRepository( + @SerializedName("full_name") + val fullName: String, + val description: String +) diff --git a/core/domain/src/main/java/camp/nextstep/edu/github/domain/network/GitHubDataSource.kt b/core/domain/src/main/java/camp/nextstep/edu/github/domain/network/GitHubDataSource.kt new file mode 100644 index 00000000..feeda1a0 --- /dev/null +++ b/core/domain/src/main/java/camp/nextstep/edu/github/domain/network/GitHubDataSource.kt @@ -0,0 +1,7 @@ +package camp.nextstep.edu.github.domain.network + +import camp.nextstep.edu.github.domain.GithubRepository + +interface GitHubDataSource { + suspend fun fetchRepositories(): List +}