Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions WordPress/Classes/Stores/RemoteConfigStore.swift
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@
import Foundation

class RemoteConfigStore {

// MARK: Shared Instance
fileprivate extension DispatchQueue {
static let remoteConfigStoreQueue = DispatchQueue(label: "remote-config-store-queue")
}

public static let shared = RemoteConfigStore()
class RemoteConfigStore {

// MARK: Private Variables

/// Thread Safety Coordinator
private let queue: DispatchQueue = DispatchQueue(label: "remote-config-store-queue")
private let queue: DispatchQueue
private let remote: RemoteConfigRemote
private let persistenceStore: UserPersistentRepository

// MARK: Initializer

init(remote: RemoteConfigRemote = RemoteConfigRemote(wordPressComRestApi: .defaultApi()),
init(queue: DispatchQueue = .remoteConfigStoreQueue,
remote: RemoteConfigRemote = RemoteConfigRemote(wordPressComRestApi: .defaultApi()),
persistenceStore: UserPersistentRepository = UserDefaults.standard) {
self.queue = queue
self.remote = remote
self.persistenceStore = persistenceStore
}
Expand Down
3 changes: 2 additions & 1 deletion WordPress/Classes/System/WordPressAppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class WordPressAppDelegate: UIResponder, UIApplicationDelegate {
private var noticePresenter: NoticePresenter?
private var bgTask: UIBackgroundTaskIdentifier? = nil
private let remoteFeatureFlagStore = RemoteFeatureFlagStore()
private let remoteConfigStore = RemoteConfigStore()

private var mainContext: NSManagedObjectContext {
return ContextManager.shared.mainContext
Expand Down Expand Up @@ -667,7 +668,7 @@ extension WordPressAppDelegate {
}

func updateRemoteConfig() {
RemoteConfigStore.shared.update()
remoteConfigStore.update()
}
}

Expand Down
17 changes: 16 additions & 1 deletion WordPress/Classes/Utility/BuildInformation/RemoteConfig.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,20 @@ import Foundation

/// A struct that holds all remote config parameters.
struct RemoteConfig {
static let jetpackDeadline = RemoteConfigParameter<String>(key: "jp-deadline", defaultValue: nil)

// MARK: Private Variables

private var store: RemoteConfigStore

// MARK: Initializer

init(store: RemoteConfigStore = RemoteConfigStore()) {
self.store = store
}

// MARK: Remote Config Parameters

var jetpackDeadline: RemoteConfigParameter<String> {
RemoteConfigParameter<String>(key: "jp-deadline", defaultValue: nil, store: store)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ struct RemoteConfigParameter<T> {

// MARK: Initializer

init(key: String, defaultValue: T?, store: RemoteConfigStore = .shared) {
init(key: String, defaultValue: T?, store: RemoteConfigStore) {
self.key = key
self.defaultValue = defaultValue
self.store = store
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,15 @@ class JetpackFeaturesRemovalCoordinator {
return .normal
}

static func removalDeadline(remoteConfigStore: RemoteConfigStore = RemoteConfigStore()) -> Date? {
guard let dateString = RemoteConfig(store: remoteConfigStore).jetpackDeadline.value else {
return nil
}
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
return formatter.date(from: dateString)
}

/// Used to display feature-specific or feature-collection overlays.
/// - Parameters:
/// - source: The source that triggers the display of the overlay.
Expand Down
2 changes: 1 addition & 1 deletion WordPress/WordPressTest/InMemoryUserDefaults.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class InMemoryUserDefaults: UserPersistentRepository {
}

func dictionaryRepresentation() -> [String: Any] {
return dictionary
return dictionary as [String: Any]
}

func set(_ value: Any?, forKey key: String) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,31 @@ final class JetpackFeaturesRemovalCoordinatorTests: XCTestCase {
XCTAssertEqual(phase, .two)
}

// MARK: Removal Deadline

func testFetchingRemovalDeadline() {
// Given
let remoteConfigStore = RemoteConfigStore(persistenceStore: mockUserDefaults)
mockUserDefaults.set(["jp-deadline": "2022-10-10"], forKey: RemoteConfigStore.Constants.CachedResponseKey)

// When
let deadline = JetpackFeaturesRemovalCoordinator.removalDeadline(remoteConfigStore: remoteConfigStore)

XCTAssertEqual(deadline?.components.year, 2022)
XCTAssertEqual(deadline?.components.month, 10)
XCTAssertEqual(deadline?.components.day, 10)
}

func testRemovalDeadlineDoesNotExist() {
// Given
let remoteConfigStore = RemoteConfigStore(persistenceStore: mockUserDefaults)

// When
let deadline = JetpackFeaturesRemovalCoordinator.removalDeadline(remoteConfigStore: remoteConfigStore)

XCTAssertNil(deadline)
}

// MARK: Helpers

private func generateFlags(phaseOne: Bool,
Expand All @@ -261,3 +286,10 @@ final class JetpackFeaturesRemovalCoordinatorTests: XCTestCase {
]
}
}

private extension Date {
var components: DateComponents {
return Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second],
from: self)
}
}