Skip to content

Commit e404cb3

Browse files
committed
pm-19305 Fix test coverage
1 parent b2acdf2 commit e404cb3

File tree

6 files changed

+129
-3
lines changed

6 files changed

+129
-3
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import BitwardenKit
2+
import XCTest
3+
4+
final class SessionTimeoutTypeTests: BitwardenTestCase {
5+
// MARK: Tests
6+
7+
/// `init(rawValue:)` returns the correct case for the given raw value string.
8+
func test_initFromRawValue() {
9+
XCTAssertEqual(SessionTimeoutType.immediately, SessionTimeoutType(rawValue: "immediately"))
10+
XCTAssertEqual(SessionTimeoutType.onAppRestart, SessionTimeoutType(rawValue: "onAppRestart"))
11+
//`onSystemLock` value maps to `onAppRestart` on mobile.
12+
XCTAssertEqual(SessionTimeoutType.onAppRestart, SessionTimeoutType(rawValue: "onSystemLock"))
13+
XCTAssertEqual(SessionTimeoutType.never, SessionTimeoutType(rawValue: "never"))
14+
XCTAssertEqual(SessionTimeoutType.custom, SessionTimeoutType(rawValue: "custom"))
15+
//`nil` value maps to `custom` on mobile in support to legacy.
16+
XCTAssertEqual(SessionTimeoutType.custom, SessionTimeoutType(rawValue: nil))
17+
}
18+
19+
/// `init(value:)` returns the correct case for the given `SessionTimeoutValue`.
20+
func test_initFromSessionTimeoutValue() {
21+
XCTAssertEqual(SessionTimeoutType.immediately, SessionTimeoutType(value: .immediately))
22+
XCTAssertEqual(SessionTimeoutType.onAppRestart, SessionTimeoutType(value: .onAppRestart))
23+
XCTAssertEqual(SessionTimeoutType.never, SessionTimeoutType(value: .never))
24+
XCTAssertEqual(SessionTimeoutType.custom, SessionTimeoutType(value: .custom(123)))
25+
}
26+
27+
/// `init(value:)` returns `.predefined` for all predefined timeout values.
28+
func test_initFromSessionTimeoutValue_predefined() {
29+
XCTAssertEqual(SessionTimeoutType.predefined, SessionTimeoutType(value: .oneMinute))
30+
XCTAssertEqual(SessionTimeoutType.predefined, SessionTimeoutType(value: .fiveMinutes))
31+
XCTAssertEqual(SessionTimeoutType.predefined, SessionTimeoutType(value: .fifteenMinutes))
32+
XCTAssertEqual(SessionTimeoutType.predefined, SessionTimeoutType(value: .thirtyMinutes))
33+
XCTAssertEqual(SessionTimeoutType.predefined, SessionTimeoutType(value: .oneHour))
34+
XCTAssertEqual(SessionTimeoutType.predefined, SessionTimeoutType(value: .fourHours))
35+
}
36+
37+
/// `rawValue` returns the correct string values.
38+
func test_rawValues() {
39+
XCTAssertEqual(SessionTimeoutType.immediately.rawValue, "immediately")
40+
XCTAssertEqual(SessionTimeoutType.onAppRestart.rawValue, "onAppRestart")
41+
XCTAssertEqual(SessionTimeoutType.never.rawValue, "never")
42+
XCTAssertEqual(SessionTimeoutType.predefined.rawValue, "predefined")
43+
XCTAssertEqual(SessionTimeoutType.custom.rawValue, "custom")
44+
}
45+
46+
/// `timeoutType` returns the correct string representation values.
47+
func test_timeoutType() {
48+
XCTAssertEqual(SessionTimeoutType.immediately.timeoutType, "immediately")
49+
XCTAssertEqual(SessionTimeoutType.onAppRestart.timeoutType, "on app restart")
50+
XCTAssertEqual(SessionTimeoutType.never.timeoutType, "never")
51+
XCTAssertEqual(SessionTimeoutType.predefined.timeoutType, "predefined")
52+
XCTAssertEqual(SessionTimeoutType.custom.timeoutType, "custom")
53+
}
54+
}

BitwardenShared/Core/Vault/Services/PolicyService.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,6 @@ extension DefaultPolicyService {
275275
var timeoutValue: SessionTimeoutValue?
276276

277277
for policy in policies {
278-
// This is never null, but maybe it should be revised
279278
guard let policyTimeoutValue = policy[.minutes]?.intValue else { continue }
280279
timeoutValue = SessionTimeoutValue(rawValue: policyTimeoutValue)
281280

@@ -293,7 +292,7 @@ extension DefaultPolicyService {
293292
switch action {
294293
case "lock":
295294
timeoutAction = .lock
296-
case "logout":
295+
case "logOut":
297296
timeoutAction = .logout
298297
default:
299298
timeoutAction = nil

BitwardenShared/Core/Vault/Services/PolicyServiceTests.swift

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ class PolicyServiceTests: BitwardenTestCase { // swiftlint:disable:this type_bod
3030

3131
let maximumTimeoutPolicy = Policy.fixture(
3232
data: [
33-
PolicyOptionType.minutes.rawValue: .int(60),
3433
PolicyOptionType.action.rawValue: .string("lock"),
34+
PolicyOptionType.minutes.rawValue: .int(60),
35+
PolicyOptionType.type.rawValue: .string("custom"),
3536
],
3637
type: .maximumVaultTimeout,
3738
)
@@ -40,6 +41,15 @@ class PolicyServiceTests: BitwardenTestCase { // swiftlint:disable:this type_bod
4041
data: [PolicyOptionType.minutes.rawValue: .int(60)],
4142
type: .maximumVaultTimeout,
4243
)
44+
45+
let maximumTimeoutPolicyLogout = Policy.fixture(
46+
data: [
47+
PolicyOptionType.action.rawValue: .string("logOut"),
48+
PolicyOptionType.minutes.rawValue: .int(60),
49+
PolicyOptionType.type.rawValue: .string("custom"),
50+
],
51+
type: .maximumVaultTimeout,
52+
)
4353

4454
let passwordGeneratorPolicy = Policy.fixture(
4555
data: [
@@ -391,6 +401,19 @@ class PolicyServiceTests: BitwardenTestCase { // swiftlint:disable:this type_bod
391401
XCTAssertEqual(policyValues?.timeoutAction, .lock)
392402
}
393403

404+
/// `fetchTimeoutPolicyValues()` fetches timeout values when the policy contains data.
405+
func test_fetchTimeoutPolicyValues_logout() async throws {
406+
stateService.activeAccount = .fixture()
407+
organizationService.fetchAllOrganizationsResult = .success([.fixture()])
408+
policyDataStore.fetchPoliciesResult = .success([maximumTimeoutPolicyLogout])
409+
410+
let policyValues = try await subject.fetchTimeoutPolicyValues()
411+
412+
XCTAssertEqual(policyValues?.timeoutAction, .logout)
413+
XCTAssertEqual(policyValues?.timeoutType, .custom)
414+
XCTAssertEqual(policyValues?.timeoutValue?.rawValue, 60)
415+
}
416+
394417
/// `fetchTimeoutPolicyValues()` returns `nil` if the user is exempt from policies in the organization.
395418
func test_fetchTimeoutPolicyValues_exemptUser() async throws {
396419
stateService.activeAccount = .fixture()

BitwardenShared/Core/Vault/Services/SyncServiceTests.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,26 @@ class SyncServiceTests: BitwardenTestCase {
177177
XCTAssertEqual(stateService.vaultTimeout["1"], SessionTimeoutValue(rawValue: 60))
178178
}
179179

180+
/// `fetchSync()` updates the user's timeout action and value
181+
/// if the user's timeout value is greater than the policy's.
182+
func test_checkVaultTimeoutPolicy_setActionForOnAppRestartType() async throws {
183+
client.result = .httpSuccess(testData: .syncWithCiphers)
184+
stateService.activeAccount = .fixture()
185+
stateService.vaultTimeout["1"] = SessionTimeoutValue(rawValue: 120)
186+
187+
policyService.fetchTimeoutPolicyValuesResult = .success(
188+
SessionTimeoutPolicy(
189+
timeoutAction: .logout,
190+
timeoutType: .onAppRestart,
191+
timeoutValue: SessionTimeoutValue(rawValue: 60),
192+
),
193+
)
194+
195+
try await subject.fetchSync(forceSync: false)
196+
197+
XCTAssertEqual(stateService.timeoutAction["1"], .logout)
198+
}
199+
180200
/// `fetchSync()` updates the user's timeout action and value - if the timeout value is set to
181201
/// never, it is set to the maximum timeout allowed by the policy.
182202
func test_checkVaultTimeoutPolicy_valueNever() async throws {

BitwardenShared/UI/Platform/Settings/Settings/AccountSecurity/AccountSecurityProcessorTests.swift

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,35 @@ class AccountSecurityProcessorTests: BitwardenTestCase { // swiftlint:disable:th
133133
),
134134
)
135135
}
136+
137+
/// `perform(_:)` with `.appeared` sets the policy related state properties when the policy type is immediately.
138+
@MainActor
139+
func test_perform_appeared_timeoutImmediatelyPolicyEnabled() async throws {
140+
let account: Account = .fixture()
141+
let userId = account.profile.userId
142+
stateService.activeAccount = account
143+
authRepository.activeAccount = account
144+
// The server sends 480 minutes as default but must be ignored when type is not nil
145+
policyService.fetchTimeoutPolicyValuesResult = .success(
146+
SessionTimeoutPolicy(
147+
timeoutAction: .logout,
148+
timeoutType: .immediately,
149+
timeoutValue: SessionTimeoutValue(rawValue: 480),
150+
),
151+
)
152+
stateService.userHasMasterPassword[userId] = true
153+
await subject.perform(.appeared)
154+
155+
XCTAssertTrue(subject.state.isPolicyTimeoutEnabled)
156+
XCTAssertTrue(subject.state.isTimeoutActionPolicyEnabled)
157+
XCTAssertTrue(subject.state.isSessionTimeoutActionDisabled)
158+
XCTAssertEqual(subject.state.policyTimeoutType, SessionTimeoutType.immediately)
159+
XCTAssertEqual(subject.state.availableTimeoutOptions, [.immediately])
160+
XCTAssertEqual(
161+
subject.state.policyTimeoutMessage,
162+
Localizations.thisSettingIsManagedByYourOrganization,
163+
)
164+
}
136165

137166
/// `perform(_:)` with `.appeared` sets the policy related state properties when the policy is enabled,
138167
/// but the policy doesn't return an action.

BitwardenShared/UI/Platform/Settings/Settings/AccountSecurity/AccountSecurityView+SnapshotTests.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ class AccountSecurityViewTests: BitwardenTestCase {
159159
policyTimeoutAction: .logout,
160160
sessionTimeoutAction: .logout,
161161
sessionTimeoutValue: .custom(1),
162+
162163
),
163164
),
164165
),

0 commit comments

Comments
 (0)