Add fake price fetcher for debug mode

This commit is contained in:
2024-02-21 09:48:26 -05:00
parent e9c44eec2c
commit 86da8b1bba
6 changed files with 62 additions and 8 deletions

View File

@@ -12,15 +12,19 @@ import Combine
struct ContentView: View {
@ObservedObject private var satsViewModel = SatsViewModel()
@State private var priceSource: PriceSource = .coinbase
@State private var priceSource: PriceSource
private let dateFormatter = DateFormatter()
private let dateFormatter: DateFormatter
private let priceFetcherDelegator = PriceFetcherDelegator()
private let priceFetcherDelegator: PriceFetcherDelegator
init() {
init(_ priceSource: PriceSource) {
dateFormatter = DateFormatter()
dateFormatter.dateStyle = .short
dateFormatter.timeStyle = .short
self.priceSource = priceSource
priceFetcherDelegator = PriceFetcherDelegator(priceSource)
}
@MainActor
@@ -107,5 +111,5 @@ struct ContentView: View {
}
#Preview {
ContentView()
ContentView(.fake)
}

View File

@@ -0,0 +1,18 @@
//
// FakePriceFetcher.swift
// SatsPrice
//
// Created by Terry Yiu on 2/21/24.
//
#if DEBUG
import Foundation
import BigDecimal
/// Fake price fetcher that returns a randomized price. Useful for development testing without requiring a network call.
class FakePriceFetcher: PriceFetcher {
func btcToUsd() async throws -> BigDecimal? {
BigDecimal(Double.random(in: 10000...100000))
}
}
#endif

View File

@@ -11,8 +11,15 @@ import BigDecimal
class PriceFetcherDelegator: PriceFetcher {
private let coinbasePriceFetcher = CoinbasePriceFetcher()
private let coinGeckoPriceFetcher = CoinGeckoPriceFetcher()
#if DEBUG
private let fakePriceFetcher = FakePriceFetcher()
#endif
var priceSource: PriceSource = .coinbase
var priceSource: PriceSource
init(_ priceSource: PriceSource) {
self.priceSource = priceSource
}
private var delegate: PriceFetcher {
switch priceSource {
@@ -20,6 +27,10 @@ class PriceFetcherDelegator: PriceFetcher {
coinbasePriceFetcher
case .coingecko:
coinGeckoPriceFetcher
#if DEBUG
case .fake:
fakePriceFetcher
#endif
}
}

View File

@@ -8,15 +8,32 @@
import Foundation
enum PriceSource: CaseIterable, CustomStringConvertible {
static var allCases: [PriceSource] {
#if DEBUG
[.coinbase, .coingecko, .fake]
#else
[.coinbase, .coingecko]
#endif
}
case coinbase
case coingecko
#if DEBUG
case fake
#endif
var description: String {
switch self {
case .coinbase:
"Coinbase"
case .coingecko:
"CoinGecko"
#if DEBUG
case .fake:
"Fake"
#endif
}
}
}

View File

@@ -11,7 +11,7 @@ import SwiftUI
struct SatsPriceApp: App {
var body: some Scene {
WindowGroup {
ContentView()
ContentView(.coinbase)
}
}
}