ゆめみの Android の採用コーディング試験に挑戦してみた🖊

[株式会社ゆめみの Android の採用コーディング試験](https://qiita.com/blendthink/items/aa70b8b3106fb4e3555f)に挑戦してみました💪

![app-demo.gif](https://github.com/KazumaProject/android-engineer-codecheck/blob/main/docs/app.gif?raw=true)

<details>
<summary> 作成したもの </summary>

![android_search_view.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569408/474bbffb-6cec-4d54-a7cc-e151837b4a19.png)

![android_search_light.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569408/c07d1693-6c3a-4dfa-98e2-886a5d1daf12.png)

![android_detail_fixed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569408/c07c1bc6-5a6a-4afa-9b94-c048dab6bae0.png)


![android_detail_light.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569408/8f347532-571f-42d7-8b45-1d599855c5fe.png)

</details>

https://github.com/KazumaProject/android-engineer-codecheck

## なんで挑戦したの？？
Android 開発の技術力を確かめるためです😎
有名IT企業のコーディング試験なので腕試しに良いと思いました😊
また、コーディング試験を体験することで新しい学びがあるだろうと考えました。

## 期限は？
実際のコーディング試験の期限は１週間とありました。この挑戦の期限を 3月5日(水) 18:00 ~ 3月12日(水) 18:00 (EST) としました。平日は仕事をしているので帰宅後の 3 時間、土日を 8 時間ずつ作業をして計 34 時間の作業時間でした。

## どんな試験？
`GitHub` のリポジトリを検索するアプリをリファクタリングするものでした。
初級、中級、ボーナス課題に取り組みました。

## 取り組んだこと
リファクタリングで行ったことを大まかに紹介したいと思います🖊
- [公式推奨のアーキテクチャ](https://developer.android.com/topic/architecture?hl=ja)を取り入れる
- 詳細ページでリポジトリの README を Markdown で表示する
- ユニットテストと E2E テストの実装

### 公式推奨のアーキテクチャ
`Domain` があると DB ライブラリや API クライアントを変更する際は Data レイヤのみ修正すれば良いので後から変更しやすいという点があると感じました。

### README を Markdown で表示
[Markwon](https://github.com/noties/Markwon)を使用して`README.md`を DetailFragment で表示する機能を実装しました。
以下のコードで README.md を取得します。もし取得できなかった場合は Place Holder のテキストを表示します。
```kotlin
 val url = "https://api.github.com/repos/$fullName/readme"
```

### ユニットテストと E2E テスト
[こちらのページ](https://developer.android.com/training/testing/fundamentals/what-to-test?hl=ja#:~:text=%E3%81%99%E3%82%8B%E3%83%86%E3%82%B9%E3%83%88%E3%81%A7%E3%81%99%E3%80%82-,%E9%87%8D%E8%A6%81%E3%81%AA%E5%8D%98%E4%BD%93%E3%83%86%E3%82%B9%E3%83%88,-%E3%83%99%E3%82%B9%E3%83%88%20%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9%E3%81%AB%E5%BE%93%E3%81%86)を参考にしました。`Data レイヤ`の`Repository`、 `Domain レイヤ`の`UseCase`, `UI レイヤ`の`ViewModel`のユニットテストを作成しました。
`core-testing` の別モジュールにユニットテストと E2E テストで使用するモックデータを作成しました。

```kotlin
object TestHttpClientProvider {
    private val FAKE_RESPONSE_BODY = """
                {
                    "items": [
                        {
                            "full_name": "MyTestRepo",
                            "language": "Kotlin",
                            "stargazers_count": 42,
                            "watchers_count": 42,
                            "forks_count": 10,
                            "open_issues_count": 5,
                            "owner": {
                                "login": "ownerName"
                                "avatar_url": "https://example.com/avatar.png"
                            },
                            "description": "Description"
                        }
                    ]
                }
            """.trimIndent()

    fun createHttpClient(): HttpClient {
        val mockEngine = MockEngine { _ ->
            respond(
                content = ByteReadChannel(FAKE_RESPONSE_BODY),
                status = HttpStatusCode.OK,
                headers = headersOf(HttpHeaders.ContentType, "application/json")
            )
        }
        return HttpClient(mockEngine) {
            install(ContentNegotiation) {
                json(Json { ignoreUnknownKeys = true })
            }
        }
    }
}
```

### 学んだこと
UI・Domain・Data の3層構造で実装することにより後から変更がしやすいと感じました。初めて espresso を使用して E2E テストを作成しました。Dagger Hilt を使用することで簡単にモックデータに置き換えることが出来ました。

### 出来なかったこと
UI を JetpackCompose に変更することが一週間では出来なかった。

### 最後に
Android の採用コーディング試験を公開してくださった株式会社ゆめみさんありがとうございます🙏