Skip to content

Commit c0d3e2c

Browse files
committed
Update test
1 parent eec8ceb commit c0d3e2c

File tree

8 files changed

+114
-105
lines changed

8 files changed

+114
-105
lines changed

sdk-example-kt/src/main/java/jp/studyplus/android/sdk_example_kt/MainActivity.kt

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import android.view.View
88
import android.widget.TextView
99
import android.widget.Toast
1010
import androidx.appcompat.app.AppCompatActivity
11+
import jp.studyplus.android.sdk.PostCallback
1112
import jp.studyplus.android.sdk.Studyplus
13+
import jp.studyplus.android.sdk.StudyplusError
1214
import jp.studyplus.android.sdk.record.StudyRecord
1315
import jp.studyplus.android.sdk.record.StudyRecordAmountTotal
1416

@@ -18,19 +20,22 @@ class MainActivity : AppCompatActivity() {
1820
const val REQUEST_CODE_AUTH = 1
1921
}
2022

23+
private val instance by lazy {
24+
Studyplus(
25+
context = this,
26+
consumerKey = getString(R.string.consumer_key),
27+
consumerSecret = getString(R.string.consumer_secret),
28+
)
29+
}
30+
2131
override fun onCreate(savedInstanceState: Bundle?) {
2232
super.onCreate(savedInstanceState)
2333
setContentView(R.layout.activity_main)
2434

25-
Studyplus.instance.setup(
26-
getString(R.string.consumer_key),
27-
getString(R.string.consumer_secret)
28-
)
29-
3035
findViewById<View>(R.id.start_auth)?.apply {
3136
setOnClickListener {
3237
try {
33-
Studyplus.instance.startAuth(this@MainActivity, REQUEST_CODE_AUTH)
38+
instance.startAuth(this@MainActivity, REQUEST_CODE_AUTH)
3439
} catch (e: ActivityNotFoundException) {
3540
e.printStackTrace()
3641
Toast.makeText(context, "Need for Studyplus 5.+", Toast.LENGTH_LONG).show()
@@ -40,7 +45,7 @@ class MainActivity : AppCompatActivity() {
4045

4146
findViewById<View>(R.id.cancel_auth)?.apply {
4247
setOnClickListener {
43-
Studyplus.instance.cancelAuth(this@MainActivity)
48+
instance.cancelAuth()
4449
updateAuthText()
4550
}
4651
}
@@ -52,19 +57,15 @@ class MainActivity : AppCompatActivity() {
5257
amount = StudyRecordAmountTotal(30),
5358
comment = "勉強した!!!"
5459
)
55-
Studyplus.instance.postRecord(this@MainActivity, record,
56-
object : Studyplus.Companion.OnPostRecordListener {
57-
override fun onResult(success: Boolean, recordId: Long?, throwable: Throwable?) {
58-
if (success) {
59-
Toast.makeText(context, "Post Study Record!! ($recordId)", Toast.LENGTH_LONG).show()
60-
} else {
61-
throwable?.apply {
62-
Toast.makeText(context, "error!!", Toast.LENGTH_LONG).show()
63-
printStackTrace()
64-
}
65-
}
66-
}
67-
})
60+
instance.postRecord(record, object : PostCallback {
61+
override fun onSuccess() {
62+
Toast.makeText(context, "Post Study Record!!", Toast.LENGTH_LONG).show()
63+
}
64+
65+
override fun onFailure(e: StudyplusError) {
66+
Toast.makeText(context, "error!!", Toast.LENGTH_LONG).show()
67+
}
68+
})
6869
}
6970
}
7071
}
@@ -76,18 +77,24 @@ class MainActivity : AppCompatActivity() {
7677

7778
private fun updateAuthText() {
7879
val authStatusText = findViewById<TextView>(R.id.auth_status)
79-
authStatusText.text = when (Studyplus.instance.isAuthenticated(this)) {
80+
authStatusText.text = when (instance.isAuthenticated()) {
8081
true -> getString(R.string.status_authenticated)
8182
else -> getString(R.string.status_unauthenticated)
8283
}
8384
}
8485

8586
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
87+
super.onActivityResult(requestCode, resultCode, data)
88+
if (resultCode != RESULT_OK || data == null) {
89+
Toast.makeText(this, "error!!", Toast.LENGTH_LONG).show()
90+
return
91+
}
92+
8693
when (requestCode) {
8794
REQUEST_CODE_AUTH -> {
8895
if (resultCode == Activity.RESULT_OK) {
89-
Studyplus.instance.setAuthResult(this, data)
90-
Toast.makeText(this@MainActivity, "Success!!", Toast.LENGTH_LONG).show()
96+
instance.setAuthResult(data)
97+
Toast.makeText(this, "Success!!", Toast.LENGTH_LONG).show()
9198
}
9299
}
93100
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package jp.studyplus.android.sdk.internal
2+
3+
import jp.studyplus.android.sdk.record.StudyRecord
4+
import okhttp3.HttpUrl
5+
import okhttp3.HttpUrl.Companion.toHttpUrl
6+
import okhttp3.MediaType.Companion.toMediaType
7+
import okhttp3.Request
8+
import okhttp3.RequestBody
9+
import okhttp3.RequestBody.Companion.toRequestBody
10+
11+
internal fun StudyRecord.requestBody() = json
12+
.toRequestBody("application/json; charset=utf-8".toMediaType())
13+
14+
internal fun createRequest(url: String, accessToken: String, body: RequestBody) =
15+
createRequest(url.toHttpUrl(), accessToken, body)
16+
17+
internal fun createRequest(url: HttpUrl, accessToken: String, body: RequestBody) =
18+
Request.Builder()
19+
.header("Accept", "application/json")
20+
.header("Content-type", "application/json")
21+
.header("Authorization", "OAuth $accessToken")
22+
.url(url)
23+
.post(body)
24+
.build()

studyplus-android-sdk/src/main/java/jp/studyplus/android/sdk/internal/api/Repository.kt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,33 @@
11
package jp.studyplus.android.sdk.internal.api
22

3+
import androidx.annotation.VisibleForTesting
34
import jp.studyplus.android.sdk.BuildConfig
45
import jp.studyplus.android.sdk.PostCallback
56
import jp.studyplus.android.sdk.StudyplusError
67
import jp.studyplus.android.sdk.internal.auth.Preference
8+
import jp.studyplus.android.sdk.internal.createRequest
9+
import jp.studyplus.android.sdk.internal.requestBody
710
import jp.studyplus.android.sdk.record.StudyRecord
811
import okhttp3.Call
912
import okhttp3.Callback
10-
import okhttp3.MediaType.Companion.toMediaType
1113
import okhttp3.OkHttpClient
1214
import okhttp3.Request
13-
import okhttp3.RequestBody.Companion.toRequestBody
1415
import okhttp3.Response
1516
import java.io.IOException
1617

1718
internal class Repository(private val client: OkHttpClient = Manager.client) {
1819
fun post(store: Preference, record: StudyRecord, callback: PostCallback) {
19-
val body = record
20-
.json()
21-
.toRequestBody("application/json; charset=utf-8".toMediaType())
20+
val request = createRequest(
21+
url = "${BuildConfig.API_ENDPOINT}/v1/study_records",
22+
accessToken = store.accessToken,
23+
body = record.requestBody(),
24+
)
2225

23-
val request = Request.Builder()
24-
.header("Accept", "application/json")
25-
.header("Content-type", "application/json")
26-
.header("Authorization", "OAuth ${store.accessToken}")
27-
.url("${BuildConfig.API_ENDPOINT}/v1/study_records")
28-
.post(body)
29-
.build()
26+
post(request = request, callback = callback)
27+
}
3028

29+
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
30+
fun post(request: Request, callback: PostCallback) {
3131
client.newCall(request).enqueue(object : Callback {
3232
override fun onFailure(call: Call, e: IOException) {
3333
callback.onFailure(StudyplusError.IOException(e))

studyplus-android-sdk/src/main/java/jp/studyplus/android/sdk/record/StudyRecord.kt

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,20 +38,21 @@ data class StudyRecord @JvmOverloads constructor(
3838
recordedTime = recordedTime.toInstant().atOffset(ZoneOffset.UTC)
3939
)
4040

41-
internal fun json(): String = if (duration > DURATION_RANGE_MAX_24H) {
42-
throw IllegalArgumentException("duration must be 24 hours or less")
43-
} else {
44-
JSONObject().apply {
45-
put("record_datetime", recordedTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME))
46-
put("duration", duration)
47-
comment?.let { put("comment", it) }
48-
amount?.let { studyRecordAmount ->
49-
studyRecordAmount.amountTotal?.let { put("amount", it) }
50-
studyRecordAmount.startPosition?.let { put("start_position", it) }
51-
studyRecordAmount.endPosition?.let { put("end_position", it) }
52-
}
53-
}.toString()
54-
}
41+
internal val json: String
42+
get() = if (duration > DURATION_RANGE_MAX_24H) {
43+
throw IllegalArgumentException("duration must be 24 hours or less")
44+
} else {
45+
JSONObject().apply {
46+
put("record_datetime", recordedTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME))
47+
put("duration", duration)
48+
comment?.let { put("comment", it) }
49+
amount?.let { studyRecordAmount ->
50+
studyRecordAmount.amountTotal?.let { put("amount", it) }
51+
studyRecordAmount.startPosition?.let { put("start_position", it) }
52+
studyRecordAmount.endPosition?.let { put("end_position", it) }
53+
}
54+
}.toString()
55+
}
5556

5657
companion object {
5758
private const val DURATION_RANGE_MAX_24H = 24L * 60L * 60L

studyplus-android-sdk/src/test/java/jp/studyplus/android/sdk/ApiUnitTest.kt

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package jp.studyplus.android.sdk
22

33
import android.os.Build
4-
import jp.studyplus.android.sdk.internal.api.MockApiClient
5-
import jp.studyplus.android.sdk.internal.api.PostCallback
4+
import jp.studyplus.android.sdk.internal.api.Repository
5+
import jp.studyplus.android.sdk.internal.createRequest
6+
import jp.studyplus.android.sdk.internal.requestBody
67
import jp.studyplus.android.sdk.record.StudyRecord
8+
import okhttp3.mockwebserver.MockResponse
9+
import okhttp3.mockwebserver.MockWebServer
710
import org.junit.Test
811
import org.junit.runner.RunWith
912
import org.robolectric.RobolectricTestRunner
1013
import org.robolectric.annotation.Config
11-
import java.io.IOException
12-
import kotlin.test.assertEquals
1314
import kotlin.test.fail
1415

1516
@RunWith(RobolectricTestRunner::class)
@@ -18,13 +19,24 @@ class ApiUnitTest {
1819

1920
@Test
2021
fun mockApi() {
22+
val server = MockWebServer()
23+
server.enqueue(MockResponse())
24+
server.start()
25+
2126
val record = StudyRecord(2 * 60)
22-
MockApiClient.postStudyRecords(null, record, object : PostCallback {
23-
override fun onSuccess(recordId: Long?) {
24-
assertEquals(recordId, 9999L)
27+
val body = record.requestBody()
28+
val request = createRequest(
29+
url = server.url("/v1/study_records"),
30+
accessToken = "access_token",
31+
body = body,
32+
)
33+
34+
Repository().post(request = request, callback = object : PostCallback {
35+
override fun onSuccess() {
36+
assert(true)
2537
}
2638

27-
override fun onFailure(e: IOException) {
39+
override fun onFailure(e: StudyplusError) {
2840
fail("Failed Network Request")
2941
}
3042
})

studyplus-android-sdk/src/test/java/jp/studyplus/android/sdk/StudyRecordUnitTest.kt

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,24 @@ import org.robolectric.RobolectricTestRunner
1111
import org.robolectric.annotation.Config
1212
import java.time.OffsetDateTime
1313
import java.time.ZoneOffset
14-
import java.time.format.DateTimeFormatter
1514

1615
@RunWith(RobolectricTestRunner::class)
1716
@Config(sdk = [Build.VERSION_CODES.P])
1817
class StudyRecordUnitTest {
1918

2019
private val date = OffsetDateTime.of(2019, 6, 1, 1, 2, 3, 0, ZoneOffset.UTC)
21-
private val dateStr = date.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
20+
private val dateStr = "2019-06-01T01:02:03Z"
2221

2322
@Test
2423
fun toJsonTest_littleParams() {
25-
val studyRecord = StudyRecord(2 * 60)
24+
val studyRecord = StudyRecord(
25+
duration = 2 * 60,
26+
recordedTime = date,
27+
)
2628

2729
assertEquals(
28-
"{\"record_datetime\":\"${studyRecord.recordedTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)}\",\"duration\":120}",
29-
studyRecord.json()
30+
"""{"record_datetime":"$dateStr","duration":120}""",
31+
studyRecord.json
3032
)
3133
}
3234

@@ -36,12 +38,12 @@ class StudyRecordUnitTest {
3638
duration = 2 * 60,
3739
amount = StudyRecordAmountTotal(30),
3840
comment = "perfect!",
39-
recordedTime = date
41+
recordedTime = date,
4042
)
4143

4244
assertEquals(
43-
"{\"record_datetime\":\"$dateStr\",\"duration\":120,\"comment\":\"perfect!\",\"amount\":30}",
44-
studyRecord.json()
45+
"""{"record_datetime":"$dateStr","duration":120,"comment":"perfect!","amount":30}""",
46+
studyRecord.json
4547
)
4648
}
4749

@@ -51,12 +53,12 @@ class StudyRecordUnitTest {
5153
duration = 2 * 60,
5254
amount = StudyRecordAmountRange(5, 12),
5355
comment = "perfect!",
54-
recordedTime = date
56+
recordedTime = date,
5557
)
5658

5759
assertEquals(
58-
"{\"record_datetime\":\"$dateStr\",\"duration\":120,\"comment\":\"perfect!\",\"start_position\":5,\"end_position\":12}",
59-
studyRecord.json()
60+
"""{"record_datetime":"$dateStr","duration":120,"comment":"perfect!","start_position":5,"end_position":12}""",
61+
studyRecord.json
6062
)
6163
}
6264

studyplus-android-sdk/src/test/java/jp/studyplus/android/sdk/internal/api/MockApiClient.kt

Lines changed: 0 additions & 10 deletions
This file was deleted.

studyplus-android-sdk/src/test/java/jp/studyplus/android/sdk/internal/api/MockApiService.kt

Lines changed: 0 additions & 27 deletions
This file was deleted.

0 commit comments

Comments
 (0)