@@ -82,7 +82,11 @@ class AutofillCredentialServiceTests: BitwardenTestCase { // swiftlint:disable:t
82
82
stateService. activeAccount = . fixture( )
83
83
vaultTimeoutService. isClientLocked [ " 1 " ] = false
84
84
85
- let credential = try await subject. provideCredential ( for: " 1 " , repromptPasswordValidated: false )
85
+ let credential = try await subject. provideCredential (
86
+ for: " 1 " ,
87
+ autofillCredentialServiceDelegate: autofillCredentialServiceDelegate,
88
+ repromptPasswordValidated: false
89
+ )
86
90
87
91
XCTAssertEqual ( credential. password, " password123 " )
88
92
XCTAssertEqual ( credential
. user
, " [email protected] " )
@@ -97,17 +101,29 @@ class AutofillCredentialServiceTests: BitwardenTestCase { // swiftlint:disable:t
97
101
98
102
cipherService. fetchCipherResult = . success( . fixture( type: . identity) )
99
103
await assertAsyncThrows ( error: ASExtensionError ( . credentialIdentityNotFound) ) {
100
- _ = try await subject. provideCredential ( for: " 1 " , repromptPasswordValidated: false )
104
+ _ = try await subject. provideCredential (
105
+ for: " 1 " ,
106
+ autofillCredentialServiceDelegate: autofillCredentialServiceDelegate,
107
+ repromptPasswordValidated: false
108
+ )
101
109
}
102
110
103
111
cipherService. fetchCipherResult = . success( . fixture( login: . fixture( password: nil , username: " user@bitwarden " ) ) )
104
112
await assertAsyncThrows ( error: ASExtensionError ( . credentialIdentityNotFound) ) {
105
- _ = try await subject. provideCredential ( for: " 1 " , repromptPasswordValidated: false )
113
+ _ = try await subject. provideCredential (
114
+ for: " 1 " ,
115
+ autofillCredentialServiceDelegate: autofillCredentialServiceDelegate,
116
+ repromptPasswordValidated: false
117
+ )
106
118
}
107
119
108
120
cipherService. fetchCipherResult = . success( . fixture( login: . fixture( password: " test " , username: nil ) ) )
109
121
await assertAsyncThrows ( error: ASExtensionError ( . credentialIdentityNotFound) ) {
110
- _ = try await subject. provideCredential ( for: " 1 " , repromptPasswordValidated: false )
122
+ _ = try await subject. provideCredential (
123
+ for: " 1 " ,
124
+ autofillCredentialServiceDelegate: autofillCredentialServiceDelegate,
125
+ repromptPasswordValidated: false
126
+ )
111
127
}
112
128
}
113
129
@@ -117,10 +133,38 @@ class AutofillCredentialServiceTests: BitwardenTestCase { // swiftlint:disable:t
117
133
vaultTimeoutService. isClientLocked [ " 1 " ] = false
118
134
119
135
await assertAsyncThrows ( error: ASExtensionError ( . credentialIdentityNotFound) ) {
120
- _ = try await subject. provideCredential ( for: " 1 " , repromptPasswordValidated: false )
136
+ _ = try await subject. provideCredential (
137
+ for: " 1 " ,
138
+ autofillCredentialServiceDelegate: autofillCredentialServiceDelegate,
139
+ repromptPasswordValidated: false
140
+ )
121
141
}
122
142
}
123
143
144
+ /// `provideCredential(for:)` unlocks the user's vault if they use never lock.
145
+ func test_provideCredential_neverLock( ) async throws {
146
+ autofillCredentialServiceDelegate. unlockVaultWithNaverlockHandler = { [ weak self] in
147
+ self ? . vaultTimeoutService. isClientLocked [ " 1 " ] = false
148
+ }
149
+ cipherService. fetchCipherResult = . success(
150
+ . fixture
( login
: . fixture
( password
: " password123 " , username
: " [email protected] " ) )
151
+ )
152
+ stateService. activeAccount = . fixture( )
153
+ vaultTimeoutService. isClientLocked [ " 1 " ] = true
154
+ vaultTimeoutService. vaultTimeout [ " 1 " ] = . never
155
+
156
+ let credential = try await subject. provideCredential (
157
+ for: " 1 " ,
158
+ autofillCredentialServiceDelegate: autofillCredentialServiceDelegate,
159
+ repromptPasswordValidated: false
160
+ )
161
+
162
+ XCTAssertTrue ( autofillCredentialServiceDelegate. unlockVaultWithNeverlockKeyCalled)
163
+ XCTAssertEqual ( credential. password, " password123 " )
164
+ XCTAssertEqual ( credential
. user
, " [email protected] " )
165
+ XCTAssertNil ( pasteboardService. copiedString)
166
+ }
167
+
124
168
/// `provideCredential(for:)` throws an error if reprompt is required.
125
169
func test_provideCredential_repromptRequired( ) async throws {
126
170
stateService. activeAccount = . fixture( )
@@ -136,7 +180,11 @@ class AutofillCredentialServiceTests: BitwardenTestCase { // swiftlint:disable:t
136
180
)
137
181
)
138
182
await assertAsyncThrows ( error: ASExtensionError ( . userInteractionRequired) ) {
139
- _ = try await subject. provideCredential ( for: " 1 " , repromptPasswordValidated: false )
183
+ _ = try await subject. provideCredential (
184
+ for: " 1 " ,
185
+ autofillCredentialServiceDelegate: autofillCredentialServiceDelegate,
186
+ repromptPasswordValidated: false
187
+ )
140
188
}
141
189
}
142
190
@@ -152,7 +200,11 @@ class AutofillCredentialServiceTests: BitwardenTestCase { // swiftlint:disable:t
152
200
stateService. activeAccount = . fixture( )
153
201
vaultTimeoutService. isClientLocked [ " 1 " ] = false
154
202
155
- let credential = try await subject. provideCredential ( for: " 1 " , repromptPasswordValidated: false )
203
+ let credential = try await subject. provideCredential (
204
+ for: " 1 " ,
205
+ autofillCredentialServiceDelegate: autofillCredentialServiceDelegate,
206
+ repromptPasswordValidated: false
207
+ )
156
208
157
209
XCTAssertEqual ( credential. password, " password123 " )
158
210
XCTAssertEqual ( credential
. user
, " [email protected] " )
@@ -173,7 +225,11 @@ class AutofillCredentialServiceTests: BitwardenTestCase { // swiftlint:disable:t
173
225
stateService. disableAutoTotpCopyByUserId [ " 1 " ] = true
174
226
vaultTimeoutService. isClientLocked [ " 1 " ] = false
175
227
176
- let credential = try await subject. provideCredential ( for: " 1 " , repromptPasswordValidated: false )
228
+ let credential = try await subject. provideCredential (
229
+ for: " 1 " ,
230
+ autofillCredentialServiceDelegate: autofillCredentialServiceDelegate,
231
+ repromptPasswordValidated: false
232
+ )
177
233
178
234
XCTAssertEqual ( credential. password, " password123 " )
179
235
XCTAssertEqual ( credential
. user
, " [email protected] " )
@@ -193,7 +249,11 @@ class AutofillCredentialServiceTests: BitwardenTestCase { // swiftlint:disable:t
193
249
stateService. doesActiveAccountHavePremiumResult = . success( false )
194
250
vaultTimeoutService. isClientLocked [ " 1 " ] = false
195
251
196
- let credential = try await subject. provideCredential ( for: " 1 " , repromptPasswordValidated: false )
252
+ let credential = try await subject. provideCredential (
253
+ for: " 1 " ,
254
+ autofillCredentialServiceDelegate: autofillCredentialServiceDelegate,
255
+ repromptPasswordValidated: false
256
+ )
197
257
198
258
XCTAssertEqual ( credential. password, " password123 " )
199
259
XCTAssertEqual ( credential
. user
, " [email protected] " )
@@ -217,7 +277,11 @@ class AutofillCredentialServiceTests: BitwardenTestCase { // swiftlint:disable:t
217
277
stateService. doesActiveAccountHavePremiumResult = . success( false )
218
278
vaultTimeoutService. isClientLocked [ " 1 " ] = false
219
279
220
- let credential = try await subject. provideCredential ( for: " 1 " , repromptPasswordValidated: false )
280
+ let credential = try await subject. provideCredential (
281
+ for: " 1 " ,
282
+ autofillCredentialServiceDelegate: autofillCredentialServiceDelegate,
283
+ repromptPasswordValidated: false
284
+ )
221
285
222
286
XCTAssertEqual ( credential. password, " password123 " )
223
287
XCTAssertEqual ( credential
. user
, " [email protected] " )
@@ -230,7 +294,11 @@ class AutofillCredentialServiceTests: BitwardenTestCase { // swiftlint:disable:t
230
294
vaultTimeoutService. isClientLocked [ " 1 " ] = true
231
295
232
296
await assertAsyncThrows ( error: ASExtensionError ( . userInteractionRequired) ) {
233
- _ = try await subject. provideCredential ( for: " 1 " , repromptPasswordValidated: false )
297
+ _ = try await subject. provideCredential (
298
+ for: " 1 " ,
299
+ autofillCredentialServiceDelegate: autofillCredentialServiceDelegate,
300
+ repromptPasswordValidated: false
301
+ )
234
302
}
235
303
}
236
304
@@ -279,6 +347,9 @@ class AutofillCredentialServiceTests: BitwardenTestCase { // swiftlint:disable:t
279
347
/// succeeds when unlocking with never key.
280
348
@available ( iOS 17 . 0 , * )
281
349
func test_provideFido2Credential_succeedsWithUnlockingNeverKey( ) async throws {
350
+ autofillCredentialServiceDelegate. unlockVaultWithNaverlockHandler = { [ weak self] in
351
+ self ? . vaultTimeoutService. isClientLocked [ " 1 " ] = false
352
+ }
282
353
stateService. activeAccount = . fixture( )
283
354
vaultTimeoutService. isClientLocked [ " 1 " ] = true
284
355
vaultTimeoutService. vaultTimeout [ " 1 " ] = . never
0 commit comments