/
SharedPreferencesOAuth2AccessTokenStorageSpecs.groovy
136 lines (95 loc) · 5.49 KB
/
SharedPreferencesOAuth2AccessTokenStorageSpecs.groovy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package de.rheinfabrik.heimdall.extras
import android.content.SharedPreferences
import com.andrewreitz.spock.android.AndroidSpecification
import com.google.gson.Gson
import de.rheinfabrik.heimdall.OAuth2AccessToken
import spock.lang.Title;
@Title("Tests for removeAccessToken() method in the SharedPreferencesOAuth2AccessTokenStorage class")
class SharedPreferencesOAuth2AccessTokenStorageRemoveAccessTokenSpecs extends AndroidSpecification {
// Scenarios
@SuppressWarnings("GroovyAssignabilityCheck")
def "it should remove the access token from the preferences"() {
given: "A fake editor"
SharedPreferences.Editor editor = Mock(SharedPreferences.Editor)
and: "A fake preferences with that editor"
SharedPreferences preferences = Mock(SharedPreferences)
preferences.edit() >> editor
and: "A SharedPreferencesOAuth2AccessTokenStorage with that preferences"
SharedPreferencesOAuth2AccessTokenStorage<OAuth2AccessToken> storage = new SharedPreferencesOAuth2AccessTokenStorage<>(preferences, OAuth2AccessToken.class)
when: "I remove the access token"
storage.removeAccessToken()
then: "Remove is called on the editor"
1 * editor.remove("OAuth2AccessToken") >> editor
and: "Apply is called on the editor"
1 * editor.apply() >> {}
}
}
@Title("Tests for getStoredAccessToken() method in the SharedPreferencesOAuth2AccessTokenStorage class")
class SharedPreferencesOAuth2AccessTokenStorageGetStoredAccessTokenSpecs extends AndroidSpecification {
// Scenarios
def "it should load the stored access token"() {
given: "Some JSON"
String json = "{\"access_token\":\"2YotnFZFEjr1zCsicMWpAA\"}"
and: "A fake preferences returning that string"
SharedPreferences preferences = Mock(SharedPreferences)
preferences.getString("OAuth2AccessToken", _) >> json
and: "A SharedPreferencesOAuth2AccessTokenStorage with that preferences"
SharedPreferencesOAuth2AccessTokenStorage<OAuth2AccessToken> storage = new SharedPreferencesOAuth2AccessTokenStorage<>(preferences, OAuth2AccessToken.class)
when: "I ask for the access token"
OAuth2AccessToken token = storage.getStoredAccessToken().toBlocking().value()
then: "The token should have the correct access token"
token.accessToken == "2YotnFZFEjr1zCsicMWpAA"
}
}
@Title("Tests for storeAccessToken() method in the SharedPreferencesOAuth2AccessTokenStorage class")
class SharedPreferencesOAuth2AccessTokenStorageStoreAccessTokenSpecs extends AndroidSpecification {
// Scenarios
@SuppressWarnings("GroovyAssignabilityCheck")
def "it should store the access token in the preferences"() {
given: "Some JSON"
String json = "{\"access_token\":\"2YotnFZFEjr1zCsicMWpAA\",\"expires_in\":0}"
and: "An OAuth2AccessToken based on that JSON"
OAuth2AccessToken accessToken = new Gson().fromJson(json, OAuth2AccessToken.class);
and: "A fake editor"
SharedPreferences.Editor editor = Mock(SharedPreferences.Editor)
and: "A fake preferences with that editor"
SharedPreferences preferences = Mock(SharedPreferences)
preferences.edit() >> editor
and: "A SharedPreferencesOAuth2AccessTokenStorage with that preferences"
SharedPreferencesOAuth2AccessTokenStorage<OAuth2AccessToken> storage = new SharedPreferencesOAuth2AccessTokenStorage<>(preferences, OAuth2AccessToken.class)
when: "I store the access token"
storage.storeAccessToken(accessToken)
then: "The editor is asked to save the token"
1 * editor.putString("OAuth2AccessToken", json) >> editor
and: "Apply is called on the editor"
1 * editor.apply() >> {}
}
}
@Title("Tests for hasAccessToken() method in the SharedPreferencesOAuth2AccessTokenStorage class")
class SharedPreferencesOAuth2AccessTokenStorageHasAccessTokenSpecs extends AndroidSpecification {
// Scenarios
@SuppressWarnings("GroovyPointlessBoolean")
def "it should emit true if there is an access token"() {
given: "A fake preferences saying there is a token"
SharedPreferences preferences = Mock(SharedPreferences)
preferences.contains("OAuth2AccessToken") >> true
and: "A SharedPreferencesOAuth2AccessTokenStorage with that preferences"
SharedPreferencesOAuth2AccessTokenStorage<OAuth2AccessToken> storage = new SharedPreferencesOAuth2AccessTokenStorage<>(preferences, OAuth2AccessToken.class)
when: "I ask if there is a token"
boolean hasToken = storage.hasAccessToken().toBlocking().value()
then: "It should be true"
hasToken == true
}
@SuppressWarnings("GroovyPointlessBoolean")
def "it should emit false if there is NO access token"() {
given: "A fake preferences saying there is NO token"
SharedPreferences preferences = Mock(SharedPreferences)
preferences.contains("OAuth2AccessToken") >> false
and: "A SharedPreferencesOAuth2AccessTokenStorage with that preferences"
SharedPreferencesOAuth2AccessTokenStorage<OAuth2AccessToken> storage = new SharedPreferencesOAuth2AccessTokenStorage<>(preferences, OAuth2AccessToken.class)
when: "I ask if there is a token"
boolean hasToken = storage.hasAccessToken().toBlocking().value()
then: "It should be false"
hasToken == false
}
}