1+ package com.halcyonmobile.core.compatibility.error.wrapping
2+
3+ import com.halcyonmobile.errorparsing2.ErrorWrappingAndParserCallAdapterFactory
4+ import com.halcyonmobile.oauth.dependencies.AuthenticationLocalStorage
5+ import com.halcyonmobile.oauth.dependencies.SessionExpiredEventHandler
6+ import com.halcyonmobile.oauthgson.OauthRetrofitWithGsonContainerBuilder
7+ import com.halcyonmobile.oauthmoshi.OauthRetrofitWithMoshiContainerBuilder
8+ import com.nhaarman.mockitokotlin2.doReturn
9+ import com.nhaarman.mockitokotlin2.mock
10+ import com.nhaarman.mockitokotlin2.times
11+ import com.nhaarman.mockitokotlin2.verify
12+ import com.nhaarman.mockitokotlin2.verifyNoMoreInteractions
13+ import com.nhaarman.mockitokotlin2.whenever
14+ import okhttp3.mockwebserver.MockResponse
15+ import okhttp3.mockwebserver.MockWebServer
16+ import org.junit.After
17+ import org.junit.Before
18+ import org.junit.Test
19+ import org.junit.runner.RunWith
20+ import org.junit.runners.Parameterized
21+ import retrofit2.Call
22+ import retrofit2.Retrofit
23+ import retrofit2.create
24+ import retrofit2.http.GET
25+
26+ @Suppress(" TestFunctionName" )
27+ @RunWith(Parameterized ::class )
28+ class ExceptionWrappingCompatibilityTest (
29+ private val additionalRetrofitConfiguration : (Retrofit .Builder ) -> Retrofit .Builder
30+ ) {
31+
32+ private lateinit var basePath: String
33+ private lateinit var mockAuthenticationLocalStorage: AuthenticationLocalStorage
34+ private lateinit var mockSessionExpiredEventHandler: SessionExpiredEventHandler
35+ private lateinit var mockWebServer: MockWebServer
36+
37+ @Before
38+ fun setup () {
39+ basePath = " /google.com/test/"
40+ mockWebServer = MockWebServer ()
41+ mockAuthenticationLocalStorage = mock()
42+ mockSessionExpiredEventHandler = mock()
43+ }
44+
45+
46+ @After
47+ fun tearDown () {
48+ mockWebServer.shutdown()
49+ }
50+
51+ @Test// (timeout = 5000L)
52+ fun GIVEN_moshi_and_standard_sessionExpiration_exception_WHEN_a_refresh_request_is_run_THEN_the_session_expiration_is_Called () {
53+ whenever(mockAuthenticationLocalStorage.refreshToken).doReturn(" alma" )
54+ mockWebServer.enqueue(MockResponse ().apply {
55+ setResponseCode(401 )
56+ setBody(" " )
57+ })
58+ mockWebServer.enqueue(MockResponse ().apply {
59+ setResponseCode(400 )
60+ setBody(" {\" Invalid refresh token: unrecognized\" }" )
61+ })
62+
63+ val service = OauthRetrofitWithMoshiContainerBuilder (
64+ clientId = " clientId" ,
65+ authenticationLocalStorage = mockAuthenticationLocalStorage,
66+ sessionExpiredEventHandler = mockSessionExpiredEventHandler
67+ )
68+ .configureRetrofit {
69+ additionalRetrofitConfiguration(baseUrl(mockWebServer.url(basePath)))
70+ }
71+ .build()
72+ .oauthRetrofitContainer
73+ .sessionRetrofit
74+ .create<Service >()
75+
76+ try {
77+ service.request().execute()
78+ } catch (throwable: Throwable ) {
79+ throwable.printStackTrace()
80+ } finally {
81+ verify(mockSessionExpiredEventHandler, times(1 )).onSessionExpired()
82+ verifyNoMoreInteractions(mockSessionExpiredEventHandler)
83+ }
84+ }
85+
86+ @Test(timeout = 5000L )
87+ fun GIVEN_gson_and_standard_sessionExpiration_exception_WHEN_a_refresh_request_is_run_THEN_the_session_expiration_is_Called () {
88+ whenever(mockAuthenticationLocalStorage.refreshToken).doReturn(" alma" )
89+ mockWebServer.enqueue(MockResponse ().apply {
90+ setResponseCode(401 )
91+ setBody(" " )
92+ })
93+ mockWebServer.enqueue(MockResponse ().apply {
94+ setResponseCode(400 )
95+ setBody(" {\" Invalid refresh token: unrecognized\" }" )
96+ })
97+
98+ val service = OauthRetrofitWithGsonContainerBuilder (
99+ clientId = " clientId" ,
100+ authenticationLocalStorage = mockAuthenticationLocalStorage,
101+ sessionExpiredEventHandler = mockSessionExpiredEventHandler
102+ )
103+ .configureRetrofit {
104+ additionalRetrofitConfiguration(baseUrl(mockWebServer.url(basePath)))
105+ }
106+ .build()
107+ .oauthRetrofitContainer
108+ .sessionRetrofit
109+ .create<Service >()
110+
111+ try {
112+ service.request().execute()
113+ } catch (throwable: Throwable ) {
114+ throwable.printStackTrace()
115+ } finally {
116+ verify(mockSessionExpiredEventHandler, times(1 )).onSessionExpired()
117+ verifyNoMoreInteractions(mockSessionExpiredEventHandler)
118+ }
119+ }
120+
121+ interface Service {
122+ @GET(" service" )
123+ fun request (): Call <Any ?>
124+ }
125+
126+ companion object {
127+
128+ private fun standard (builder : Retrofit .Builder ): Retrofit .Builder = builder
129+
130+ private fun errorWrapping (builder : Retrofit .Builder ): Retrofit .Builder =
131+ builder.addCallAdapterFactory(ErrorWrappingAndParserCallAdapterFactory (workWithoutAnnotation = true ))
132+
133+ // library is incompatible with 2.0.0 of error wrapper
134+ // private fun errorHandler(builder: Retrofit.Builder): Retrofit.Builder =
135+ // builder.addCallAdapterFactory(RestHandlerCallAdapter.Builder().build())
136+
137+ @Parameterized.Parameters
138+ @JvmStatic
139+ fun setupParameters (): Collection <Array <Any >> {
140+ return listOf (
141+ arrayOf(::standard),
142+ arrayOf(::errorWrapping),
143+ // arrayOf(::errorHandler)
144+ )
145+ }
146+ }
147+ }
0 commit comments