Add AuthDataSourceImplTest test

This commit is contained in:
Kirill Kamakin
2021-11-13 11:13:18 +03:00
parent d370823a10
commit c9bf25d5ea

View File

@@ -0,0 +1,112 @@
package gq.kirmanak.mealie.data.auth.impl
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
import dagger.hilt.android.testing.HiltAndroidRule
import dagger.hilt.android.testing.HiltAndroidTest
import dagger.hilt.android.testing.HiltTestApplication
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.runBlocking
import kotlinx.serialization.ExperimentalSerializationApi
import okhttp3.mockwebserver.MockResponse
import okhttp3.mockwebserver.MockWebServer
import okhttp3.mockwebserver.RecordedRequest
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.annotation.Config
import retrofit2.HttpException
import java.nio.charset.Charset
import javax.inject.Inject
@ExperimentalSerializationApi
@ExperimentalCoroutinesApi
@HiltAndroidTest
@RunWith(AndroidJUnit4::class)
@Config(application = HiltTestApplication::class)
class AuthDataSourceImplTest {
@get:Rule
var hiltRule = HiltAndroidRule(this)
@Inject
lateinit var subject: AuthDataSourceImpl
private lateinit var mockServer: MockWebServer
private lateinit var serverUrl: String
@Before
fun inject() {
hiltRule.inject()
}
@Before
fun startMockServer() {
mockServer = MockWebServer().apply {
start()
}
serverUrl = mockServer.url("/").toString()
}
@After
fun stopMockServer() {
mockServer.shutdown()
}
@Test
fun `when authentication is successful then token is correct`() = runBlocking {
enqueueSuccessfulResponse()
val token = subject.authenticate(TEST_USERNAME, TEST_PASSWORD, serverUrl)
assertThat(token).isEqualTo(TEST_TOKEN)
}
@Test(expected = HttpException::class)
fun `when authentication isn't successful then throws`(): Unit = runBlocking {
enqueueUnsuccessfulResponse()
subject.authenticate(TEST_USERNAME, TEST_PASSWORD, serverUrl)
}
@Test
fun `when authentication is requested then body is correct`() = runBlocking {
enqueueSuccessfulResponse()
subject.authenticate(TEST_USERNAME, TEST_PASSWORD, serverUrl)
val body = mockServer.takeRequest().body()
assertThat(body).isEqualTo("username=$TEST_USERNAME&password=$TEST_PASSWORD")
}
@Test
fun `when authentication is requested then path is correct`() = runBlocking {
enqueueSuccessfulResponse()
subject.authenticate(TEST_USERNAME, TEST_PASSWORD, serverUrl)
val path = mockServer.takeRequest().path
assertThat(path).isEqualTo("/api/auth/token")
}
private fun RecordedRequest.body() = body.readString(Charset.defaultCharset())
private fun enqueueUnsuccessfulResponse() {
val response = MockResponse()
.setBody(UNSUCCESSFUL_AUTH_RESPONSE)
.setHeader("Content-Type", "application/json")
.setResponseCode(401)
mockServer.enqueue(response)
}
private fun enqueueSuccessfulResponse() {
val response = MockResponse()
.setBody(SUCCESSFUL_AUTH_RESPONSE)
.setHeader("Content-Type", "application/json")
.setResponseCode(200)
mockServer.enqueue(response)
}
companion object {
private const val TEST_USERNAME = "TEST_USERNAME"
private const val TEST_PASSWORD = "TEST_PASSWORD"
private const val TEST_TOKEN = "TEST_TOKEN"
private const val SUCCESSFUL_AUTH_RESPONSE =
"{\"access_token\":\"$TEST_TOKEN\",\"token_type\":\"TEST_TOKEN_TYPE\"}"
private const val UNSUCCESSFUL_AUTH_RESPONSE =
"{\"detail\":\"Unauthorized\"}"
}
}