mirror of
https://github.com/sudosylabs/vnidrop.git
synced 2026-08-05 02:29:55 +02:00
test(apple): CoreGateway seam, XCTest suite, and CI
- Introduce a CoreGateway protocol so feature models depend on a seam (CoreRepository conforms); enables faking the core in tests - Add a VniDropTests target with 42 tests mirroring the KMP suites: approval coordinator, send/receive/settings/app models, preferences, file previews, invitation decode, message queue, error mapping - Add a fake gateway/file-system/device-info and fixtures - Add .github/workflows/apple.yml: build the Rust core, generate the project, and run the tests on an iOS Simulator
This commit is contained in:
@@ -9,13 +9,13 @@ final class AppModel: ObservableObject {
|
||||
@Published private(set) var themeMode: ThemeMode = .system
|
||||
|
||||
private let environment: PlatformEnvironment
|
||||
private let repository: CoreRepository
|
||||
private let repository: CoreGateway
|
||||
private let messages: UiMessageController
|
||||
private var cancellables = Set<AnyCancellable>()
|
||||
|
||||
init(
|
||||
environment: PlatformEnvironment,
|
||||
repository: CoreRepository,
|
||||
repository: CoreGateway,
|
||||
preferences: AppPreferencesRepository,
|
||||
messages: UiMessageController
|
||||
) {
|
||||
|
||||
@@ -26,7 +26,7 @@ struct ApprovalState: Equatable {
|
||||
final class ApprovalCoordinator: ObservableObject {
|
||||
@Published private(set) var state = ApprovalState()
|
||||
|
||||
private let repository: CoreRepository
|
||||
private let repository: CoreGateway
|
||||
private let preferences: AppPreferencesRepository
|
||||
private let notifications: LocalNotificationService
|
||||
private let visibility: AppVisibility
|
||||
@@ -36,7 +36,7 @@ final class ApprovalCoordinator: ObservableObject {
|
||||
private var cancellables = Set<AnyCancellable>()
|
||||
|
||||
init(
|
||||
repository: CoreRepository,
|
||||
repository: CoreGateway,
|
||||
preferences: AppPreferencesRepository,
|
||||
notifications: LocalNotificationService,
|
||||
visibility: AppVisibility,
|
||||
@@ -57,7 +57,7 @@ final class ApprovalCoordinator: ObservableObject {
|
||||
}
|
||||
.store(in: &cancellables)
|
||||
|
||||
repository.$state
|
||||
repository.statePublisher
|
||||
.sink { [weak self] core in
|
||||
guard let self, core.isInitialized else { return }
|
||||
let sharing = core.transfers.filter { $0.direction == .send && $0.status == .sharing }
|
||||
|
||||
@@ -51,13 +51,13 @@ final class ReceiveModel: ObservableObject {
|
||||
@Published private(set) var state = ReceiveState()
|
||||
@Published private(set) var coreState = CoreState()
|
||||
|
||||
private let repository: CoreRepository
|
||||
private let repository: CoreGateway
|
||||
private let fileSystemService: FileSystemService
|
||||
private let messages: UiMessageController
|
||||
private var cancellables = Set<AnyCancellable>()
|
||||
|
||||
init(
|
||||
repository: CoreRepository,
|
||||
repository: CoreGateway,
|
||||
fileSystemService: FileSystemService,
|
||||
preferences: AppPreferencesRepository,
|
||||
messages: UiMessageController
|
||||
@@ -66,7 +66,7 @@ final class ReceiveModel: ObservableObject {
|
||||
self.fileSystemService = fileSystemService
|
||||
self.messages = messages
|
||||
|
||||
repository.$state.sink { [weak self] in self?.coreState = $0 }.store(in: &cancellables)
|
||||
repository.statePublisher.sink { [weak self] in self?.coreState = $0 }.store(in: &cancellables)
|
||||
|
||||
preferences.$preferences
|
||||
.sink { [weak self] prefs in
|
||||
|
||||
@@ -50,14 +50,14 @@ final class SendModel: ObservableObject {
|
||||
/// small transfer complete.
|
||||
@Published private(set) var receiversByTransfer: [UInt64: [ReceiverRequestModel]] = [:]
|
||||
|
||||
private let repository: CoreRepository
|
||||
private let repository: CoreGateway
|
||||
private let fileSystemService: FileSystemService
|
||||
private let filePreviewRepository: FilePreviewRepository
|
||||
private let messages: UiMessageController
|
||||
private var cancellables = Set<AnyCancellable>()
|
||||
|
||||
init(
|
||||
repository: CoreRepository,
|
||||
repository: CoreGateway,
|
||||
fileSystemService: FileSystemService,
|
||||
preferences: AppPreferencesRepository,
|
||||
filePreviewRepository: FilePreviewRepository,
|
||||
@@ -68,7 +68,7 @@ final class SendModel: ObservableObject {
|
||||
self.filePreviewRepository = filePreviewRepository
|
||||
self.messages = messages
|
||||
|
||||
repository.$state.sink { [weak self] in self?.coreState = $0 }.store(in: &cancellables)
|
||||
repository.statePublisher.sink { [weak self] in self?.coreState = $0 }.store(in: &cancellables)
|
||||
|
||||
repository.signals
|
||||
.sink { [weak self] signal in
|
||||
@@ -86,7 +86,7 @@ final class SendModel: ObservableObject {
|
||||
// Keep receiver delivery records current for every sharing/importing
|
||||
// outgoing transfer (new shares appear here; status transitions arrive via
|
||||
// the receiverHistoryChanged signal above).
|
||||
repository.$state
|
||||
repository.statePublisher
|
||||
.map { core -> Set<UInt64> in
|
||||
Set(core.transfers
|
||||
.filter { $0.direction == .send && ($0.status == .sharing || $0.status == .importing) }
|
||||
@@ -100,7 +100,7 @@ final class SendModel: ObservableObject {
|
||||
.sink { [weak self] previews in self?.state.transferThumbnails = previews }
|
||||
.store(in: &cancellables)
|
||||
|
||||
repository.$state
|
||||
repository.statePublisher
|
||||
.map { core -> Set<UInt64>? in
|
||||
core.isInitialized ? Set(core.transfers.map(\.transferId)) : nil
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ final class SettingsModel: ObservableObject {
|
||||
private let environment: PlatformEnvironment
|
||||
private let deviceInfoProvider: DeviceInfoProvider
|
||||
private let fileSystemService: FileSystemService
|
||||
private let repository: CoreRepository
|
||||
private let repository: CoreGateway
|
||||
private let preferences: AppPreferencesRepository
|
||||
private let notifications: LocalNotificationService
|
||||
private let messages: UiMessageController
|
||||
@@ -101,7 +101,7 @@ final class SettingsModel: ObservableObject {
|
||||
environment: PlatformEnvironment,
|
||||
deviceInfoProvider: DeviceInfoProvider,
|
||||
fileSystemService: FileSystemService,
|
||||
repository: CoreRepository,
|
||||
repository: CoreGateway,
|
||||
preferences: AppPreferencesRepository,
|
||||
notifications: LocalNotificationService,
|
||||
messages: UiMessageController,
|
||||
|
||||
Reference in New Issue
Block a user