Skip to content

Instantly share code, notes, and snippets.

View tifoaudii's full-sized avatar
🎯
Focusing

Tifo Audi A.P tifoaudii

🎯
Focusing
View GitHub Profile
@testable import PokemonApp
import XCTest
class PokemonLegacyListViewControllerTest: XCTestCase {
func test_whenSuccessFetchPokemons_shouldRenderCollectionCard() {
// Given
func test_whenContentTypeIsTodayTask_shouldFetchTodayTask() {
let dataStore = TaskViewDataStoreSpy()
let sut = TaskViewDefaultPresenter(dataStore: dataStore)
let contentType = TaskContentType.today
var presentableTask: PresentableTask?
sut.updateContentType(with: contentType)
sut.fetchTask(for: contentType) { tasks in
XCTAssertEqual(tasks.count, 1)
presentableTask = tasks.first!
class TaskViewDataStoreSpy: TaskViewDataStore {
var fetchTodayTaskCalled = false
var fetchFailedTaskCalled = false
var fetchUpcomingTaskCalled = false
var fetchFinishedTaskCalled = false
var finishTaskCalled = false
var todayTaskCompletion: (([TaskModel]) -> Void)?
var failedTaskCompletion: (([TaskModel]) -> Void)?
protocol UIFactory {
func createTaskViewController(navigationDelegate: TaskViewControllerNavigationDelegate) -> UIViewController
func createAddTaskViewController(didAddNewTask: @escaping () -> Void) -> UIViewController
}
final class ViewControllerFactory: UIFactory {
private let coreDataStack: CoreDataStack
init(coreDataStack: CoreDataStack) {
import CoreData
extension CoreDataStack: TaskViewDataStore {
func fetchTodayTask(completion: @escaping ([TaskModel]) -> Void) {
let request = Task.fetchRequest()
let sortDescriptor = NSSortDescriptor(key: #keyPath(Task.deadline), ascending: true)
let startDate = Date()
let endDate = Calendar.current.date(
protocol TaskViewPresenter {
var contentType: TaskContentType { get }
func fetchTask(for contentType: TaskContentType, completion: @escaping ([PresentableTask]) -> Void)
func updateContentType(with contentType: TaskContentType)
}
final class TaskViewDefaultPresenter: TaskViewPresenter {
private let dataStore: TaskViewDataStore
protocol TaskViewDataStore {
func fetchTodayTask(completion: @escaping ([TaskModel]) -> Void)
func fetchFailedTask(completion: @escaping ([TaskModel]) -> Void)
func fetchUpcomingTask(completion: @escaping ([TaskModel]) -> Void)
func fetchFinishedTask(completion: @escaping ([TaskModel]) -> Void)
func finishTask(_ task: TaskModel)
}
extension Task: TaskModelConvertible {
func asTaskModel() -> TaskModel {
TaskModel(
title: title ?? "",
type: type ?? "",
deadline: deadline ?? Date(),
color: color,
isCompleted: isCompleted
)
}
protocol TaskModelConvertible {
func asTaskModel() -> TaskModel
}
struct TaskModel {
let title: String
let type: String
let deadline: Date
let color: NSObject?
let isCompleted: Bool
import CoreData
@objc(Task)
public class Task: NSManagedObject {}
extension Task {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Task> {
return NSFetchRequest<Task>(entityName: "Task")
}