Skip to content

Commit

Permalink
chore: tests fix
Browse files Browse the repository at this point in the history
  • Loading branch information
forgotvas committed Jan 24, 2025
1 parent 41669f0 commit 6595cb2
Show file tree
Hide file tree
Showing 17 changed files with 576 additions and 184 deletions.
18 changes: 0 additions & 18 deletions Core/CoreTests/CoreMock.generated.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2535,12 +2535,6 @@ open class CorePersistenceProtocolMock: CorePersistenceProtocol, Mock {
perform?(`task`)
}

open func saveDownloadDataTask(_ task: DownloadDataTask) {
addInvocation(.m_saveDownloadDataTask__task(Parameter<DownloadDataTask>.value(`task`)))
let perform = methodPerformValue(.m_saveDownloadDataTask__task(Parameter<DownloadDataTask>.value(`task`))) as? (DownloadDataTask) -> Void
perform?(`task`)
}

open func downloadDataTask(for blockId: String) -> DownloadDataTask? {
addInvocation(.m_downloadDataTask__for_blockId(Parameter<String>.value(`blockId`)))
let perform = methodPerformValue(.m_downloadDataTask__for_blockId(Parameter<String>.value(`blockId`))) as? (String) -> Void
Expand Down Expand Up @@ -2601,7 +2595,6 @@ open class CorePersistenceProtocolMock: CorePersistenceProtocol, Mock {
case m_deleteAllProgress
case m_addToDownloadQueue__blocks_blocksdownloadQuality_downloadQuality(Parameter<[CourseBlock]>, Parameter<DownloadQuality>)
case m_updateTask__task_task(Parameter<DownloadDataTask>)
case m_saveDownloadDataTask__task(Parameter<DownloadDataTask>)
case m_downloadDataTask__for_blockId(Parameter<String>)
case m_getDownloadDataTasks
case m_getDownloadDataTasksForCourse__courseId(Parameter<String>)
Expand Down Expand Up @@ -2653,11 +2646,6 @@ open class CorePersistenceProtocolMock: CorePersistenceProtocol, Mock {
results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsTask, rhs: rhsTask, with: matcher), lhsTask, rhsTask, "task"))
return Matcher.ComparisonResult(results)

case (.m_saveDownloadDataTask__task(let lhsTask), .m_saveDownloadDataTask__task(let rhsTask)):
var results: [Matcher.ParameterComparisonResult] = []
results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsTask, rhs: rhsTask, with: matcher), lhsTask, rhsTask, "_ task"))
return Matcher.ComparisonResult(results)

case (.m_downloadDataTask__for_blockId(let lhsBlockid), .m_downloadDataTask__for_blockId(let rhsBlockid)):
var results: [Matcher.ParameterComparisonResult] = []
results.append(Matcher.ParameterComparisonResult(Parameter.compare(lhs: lhsBlockid, rhs: rhsBlockid, with: matcher), lhsBlockid, rhsBlockid, "for blockId"))
Expand Down Expand Up @@ -2691,7 +2679,6 @@ open class CorePersistenceProtocolMock: CorePersistenceProtocol, Mock {
case .m_deleteAllProgress: return 0
case let .m_addToDownloadQueue__blocks_blocksdownloadQuality_downloadQuality(p0, p1): return p0.intValue + p1.intValue
case let .m_updateTask__task_task(p0): return p0.intValue
case let .m_saveDownloadDataTask__task(p0): return p0.intValue
case let .m_downloadDataTask__for_blockId(p0): return p0.intValue
case .m_getDownloadDataTasks: return 0
case let .m_getDownloadDataTasksForCourse__courseId(p0): return p0.intValue
Expand All @@ -2711,7 +2698,6 @@ open class CorePersistenceProtocolMock: CorePersistenceProtocol, Mock {
case .m_deleteAllProgress: return ".deleteAllProgress()"
case .m_addToDownloadQueue__blocks_blocksdownloadQuality_downloadQuality: return ".addToDownloadQueue(blocks:downloadQuality:)"
case .m_updateTask__task_task: return ".updateTask(task:)"
case .m_saveDownloadDataTask__task: return ".saveDownloadDataTask(_:)"
case .m_downloadDataTask__for_blockId: return ".downloadDataTask(for:)"
case .m_getDownloadDataTasks: return ".getDownloadDataTasks()"
case .m_getDownloadDataTasksForCourse__courseId: return ".getDownloadDataTasksForCourse(_:)"
Expand Down Expand Up @@ -2822,7 +2808,6 @@ open class CorePersistenceProtocolMock: CorePersistenceProtocol, Mock {
public static func deleteAllProgress() -> Verify { return Verify(method: .m_deleteAllProgress)}
public static func addToDownloadQueue(blocks: Parameter<[CourseBlock]>, downloadQuality: Parameter<DownloadQuality>) -> Verify { return Verify(method: .m_addToDownloadQueue__blocks_blocksdownloadQuality_downloadQuality(`blocks`, `downloadQuality`))}
public static func updateTask(task: Parameter<DownloadDataTask>) -> Verify { return Verify(method: .m_updateTask__task_task(`task`))}
public static func saveDownloadDataTask(_ task: Parameter<DownloadDataTask>) -> Verify { return Verify(method: .m_saveDownloadDataTask__task(`task`))}
public static func downloadDataTask(for blockId: Parameter<String>) -> Verify { return Verify(method: .m_downloadDataTask__for_blockId(`blockId`))}
public static func getDownloadDataTasks() -> Verify { return Verify(method: .m_getDownloadDataTasks)}
public static func getDownloadDataTasksForCourse(_ courseId: Parameter<String>) -> Verify { return Verify(method: .m_getDownloadDataTasksForCourse__courseId(`courseId`))}
Expand Down Expand Up @@ -2867,9 +2852,6 @@ open class CorePersistenceProtocolMock: CorePersistenceProtocol, Mock {
public static func updateTask(task: Parameter<DownloadDataTask>, perform: @escaping (DownloadDataTask) -> Void) -> Perform {
return Perform(method: .m_updateTask__task_task(`task`), performs: perform)
}
public static func saveDownloadDataTask(_ task: Parameter<DownloadDataTask>, perform: @escaping (DownloadDataTask) -> Void) -> Perform {
return Perform(method: .m_saveDownloadDataTask__task(`task`), performs: perform)
}
public static func downloadDataTask(for blockId: Parameter<String>, perform: @escaping (String) -> Void) -> Perform {
return Perform(method: .m_downloadDataTask__for_blockId(`blockId`), performs: perform)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -375,7 +375,8 @@ struct CourseScreensView_Previews: PreviewProvider {
enrollmentStart: nil,
enrollmentEnd: nil,
lastVisitedBlockID: nil,
coreAnalytics: CoreAnalyticsMock()
coreAnalytics: CoreAnalyticsMock(),
courseHelper: CourseDownloadHelper(courseStructure: nil, manager: DownloadManagerMock())
),
courseDatesViewModel: CourseDatesViewModel(
interactor: CourseInteractor.mock,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ public final class CourseContainerViewModel: BaseCourseViewModel {
private(set) var storage: CourseStorage

private let cellularFileSizeLimit: Int = 100 * 1024 * 1024
let courseHelper: CourseDownloadHelper
var courseHelper: CourseDownloadHelperProtocol

public init(
interactor: CourseInteractorProtocol,
Expand All @@ -132,7 +132,8 @@ public final class CourseContainerViewModel: BaseCourseViewModel {
enrollmentEnd: Date?,
lastVisitedBlockID: String?,
coreAnalytics: CoreAnalytics,
selection: CourseTab = CourseTab.course
selection: CourseTab = CourseTab.course,
courseHelper: CourseDownloadHelperProtocol
) {
self.interactor = interactor
self.authInteractor = authInteractor
Expand All @@ -151,7 +152,7 @@ public final class CourseContainerViewModel: BaseCourseViewModel {
self.lastVisitedBlockID = lastVisitedBlockID
self.coreAnalytics = coreAnalytics
self.selection = selection.rawValue
self.courseHelper = CourseDownloadHelper(courseStructure: nil, manager: manager)
self.courseHelper = courseHelper
self.courseHelper.videoQuality = storage.userSettings?.downloadQuality ?? .auto
super.init(manager: manager)
addObservers()
Expand Down Expand Up @@ -1011,11 +1012,11 @@ extension CourseContainerViewModel {
}
}

struct VerticalsDownloadState: Hashable {
let vertical: CourseVertical
let state: DownloadViewState
public struct VerticalsDownloadState: Hashable, Sendable {
public let vertical: CourseVertical
public let state: DownloadViewState

var downloadableBlocks: [CourseBlock] {
public var downloadableBlocks: [CourseBlock] {
vertical.childs.filter { $0.isDownloadable && $0.type == .video }
}
}
Expand Down
82 changes: 41 additions & 41 deletions Course/Course/Presentation/Container/CourseDownloadHelper.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,25 @@ import Combine
import Core
import Foundation

struct CourseDownloadValue {
static let empty = CourseDownloadValue(
//sourcery: AutoMockable
public protocol CourseDownloadHelperProtocol: Sendable {
var value: CourseDownloadValue? { get }
var courseStructure: CourseStructure? { get set }
var videoQuality: DownloadQuality { get set }

func publisher() -> AnyPublisher<CourseDownloadValue, Never>
func progressPublisher() -> AnyPublisher<DownloadDataTask, Never>
func refreshValue()
func refreshValue() async
func sizeFor(block: CourseBlock) -> Int?
func sizeFor(blocks: [CourseBlock]) -> Int
func sizeFor(sequential: CourseSequential) -> Int
func sizeFor(sequentials: [CourseSequential]) -> Int
func cancelDownloading(task: DownloadDataTask) async throws
}

public struct CourseDownloadValue: Sendable {
public static let empty = CourseDownloadValue(
courseDownloadTasks: [],
allDownloadTasks: [],
notFinishedTasks: [],
Expand All @@ -21,50 +38,46 @@ struct CourseDownloadValue {
largestBlocks: [],
state: .start
)
var currentDownloadTask: DownloadDataTask?
let courseDownloadTasks: [DownloadDataTask]
let allDownloadTasks: [DownloadDataTask]
let notFinishedTasks: [DownloadDataTask]
let downloadableVerticals: Set<VerticalsDownloadState>
let sequentialsStates: [String: DownloadViewState]
let totalFilesSize: Int
let downloadedFilesSize: Int
let largestBlocks: [CourseBlock]
public var currentDownloadTask: DownloadDataTask?
public let courseDownloadTasks: [DownloadDataTask]
public let allDownloadTasks: [DownloadDataTask]
public let notFinishedTasks: [DownloadDataTask]
public let downloadableVerticals: Set<VerticalsDownloadState>
public let sequentialsStates: [String: DownloadViewState]
public let totalFilesSize: Int
public let downloadedFilesSize: Int
public let largestBlocks: [CourseBlock]
let state: OfflineView.DownloadAllState

mutating func setCurrentDownloadTask(task: DownloadDataTask?) {
self.currentDownloadTask = task
}
}

public final class CourseDownloadHelper: @unchecked Sendable {
public final class CourseDownloadHelper: CourseDownloadHelperProtocol, @unchecked Sendable {

var value: CourseDownloadValue?
var courseStructure: CourseStructure?
var videoQuality: DownloadQuality = .auto
public var value: CourseDownloadValue?
public var courseStructure: CourseStructure?
public var videoQuality: DownloadQuality = .auto

private let queue: DispatchQueue = .init(label: "course.download.helper.queue")
private let manager: DownloadManagerProtocol
private var sourcePublisher: PassthroughSubject<CourseDownloadValue, Never> = .init()
private var sourceProgressPublisher: PassthroughSubject<DownloadDataTask, Never> = .init()
private var cancellables = Set<AnyCancellable>()

func publisher() -> AnyPublisher<CourseDownloadValue, Never> {
public func publisher() -> AnyPublisher<CourseDownloadValue, Never> {
sourcePublisher.share().eraseToAnyPublisher()
}

func progressPublisher() -> AnyPublisher<DownloadDataTask, Never> {
public func progressPublisher() -> AnyPublisher<DownloadDataTask, Never> {
sourceProgressPublisher
.throttle(for: .seconds(0.1), scheduler: queue, latest: true)
.share()
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}

func stopAllDownloads() async throws {
try await manager.cancelAllDownloading()
}

public init (courseStructure: CourseStructure?, manager: DownloadManagerProtocol) {
self.manager = manager
self.courseStructure = courseStructure
Expand All @@ -89,17 +102,17 @@ public final class CourseDownloadHelper: @unchecked Sendable {
.store(in: &cancellables)
}

func refreshValue() {
public func refreshValue() {
Task(priority: .background) {
await refreshValue()
}
}

func cancelDownloading(task: DownloadDataTask) async throws {
public func cancelDownloading(task: DownloadDataTask) async throws {
try await manager.cancelDownloading(task: task)
}

func refreshValue() async {
public func refreshValue() async {
guard let courseStructure else { return }
let downloadTasks = await manager.getDownloadTasks()
await enumerate(
Expand All @@ -109,25 +122,25 @@ public final class CourseDownloadHelper: @unchecked Sendable {
)
}

func sizeFor(block: CourseBlock) -> Int? {
public func sizeFor(block: CourseBlock) -> Int? {
if block.type == .video {
return block.encodedVideo?.video(downloadQuality: videoQuality)?.fileSize
}
return block.fileSize
}

func sizeFor(blocks: [CourseBlock]) -> Int {
public func sizeFor(blocks: [CourseBlock]) -> Int {
let filteredBlocks = blocks.filter { $0.isDownloadable }
let sizes = filteredBlocks.compactMap { sizeFor(block: $0) }
return sizes.reduce(0, +)
}

func sizeFor(sequential: CourseSequential) -> Int {
public func sizeFor(sequential: CourseSequential) -> Int {
let blocks = sequential.childs.flatMap({ $0.childs })
return sizeFor(blocks: blocks)
}

func sizeFor(sequentials: [CourseSequential]) -> Int {
public func sizeFor(sequentials: [CourseSequential]) -> Int {
let sizes = sequentials.map { sizeFor(sequential: $0) }
return sizes.reduce(0, +)
}
Expand Down Expand Up @@ -266,17 +279,4 @@ public final class CourseDownloadHelper: @unchecked Sendable {
}
return nil
}

private func getUsedDiskSpace() -> Int? {
do {
let attributes = try FileManager.default.attributesOfFileSystem(forPath: NSHomeDirectory() as String)
if let totalSpace = attributes[.systemSize] as? Int64,
let freeSpace = attributes[.systemFreeSize] as? Int64 {
return Int(totalSpace - freeSpace)
}
} catch {
print("Error retrieving used disk space: \(error.localizedDescription)")
}
return nil
}
}
2 changes: 1 addition & 1 deletion Course/Course/Presentation/Downloads/DownloadsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public struct DownloadsView: View {
public init(
isSheet: Bool = true,
router: CourseRouter,
courseHelper: CourseDownloadHelper
courseHelper: CourseDownloadHelperProtocol
) {
self.isSheet = isSheet
self._viewModel = .init(
Expand Down
4 changes: 2 additions & 2 deletions Course/Course/Presentation/Downloads/DownloadsViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ final class DownloadsViewModel: ObservableObject {

let router: CourseRouter

private let helper: CourseDownloadHelper
private let helper: CourseDownloadHelperProtocol
private var cancellables = Set<AnyCancellable>()

init(
router: CourseRouter,
helper: CourseDownloadHelper
helper: CourseDownloadHelperProtocol
) {
self.router = router
self.helper = helper
Expand Down
5 changes: 3 additions & 2 deletions Course/Course/Presentation/Offline/OfflineView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -258,10 +258,11 @@ struct OfflineView: View {
enrollmentStart: nil,
enrollmentEnd: nil,
lastVisitedBlockID: nil,
coreAnalytics: CoreAnalyticsMock()
coreAnalytics: CoreAnalyticsMock(),
courseHelper: CourseDownloadHelper(courseStructure: nil, manager: DownloadManagerMock())
)

return OfflineView(
OfflineView(
courseID: "123",
coordinate: .constant(0),
collapsed: .constant(false),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,8 @@ struct LargestDownloadsView_Previews: PreviewProvider {
enrollmentStart: nil,
enrollmentEnd: nil,
lastVisitedBlockID: nil,
coreAnalytics: CoreAnalyticsMock()
coreAnalytics: CoreAnalyticsMock(),
courseHelper: CourseDownloadHelper(courseStructure: nil, manager: DownloadManagerMock())
)

LargestDownloadsView(viewModel: vm)
Expand Down
3 changes: 2 additions & 1 deletion Course/Course/Presentation/Outline/CourseOutlineView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,8 @@ struct CourseOutlineView_Previews: PreviewProvider {
enrollmentStart: Date(),
enrollmentEnd: nil,
lastVisitedBlockID: nil,
coreAnalytics: CoreAnalyticsMock()
coreAnalytics: CoreAnalyticsMock(),
courseHelper: CourseDownloadHelper(courseStructure: nil, manager: DownloadManagerMock())
)
Task {
await withTaskGroup(of: Void.self) { group in
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,8 @@ struct CustomDisclosureGroup_Previews: PreviewProvider {
enrollmentStart: Date(),
enrollmentEnd: nil,
lastVisitedBlockID: nil,
coreAnalytics: CoreAnalyticsMock()
coreAnalytics: CoreAnalyticsMock(),
courseHelper: CourseDownloadHelper(courseStructure: nil, manager: DownloadManagerMock())
)
Task {
await withTaskGroup(of: Void.self) { group in
Expand Down
Loading

0 comments on commit 6595cb2

Please sign in to comment.