Skip to content

Commit

Permalink
Add NewPersonPresenter
Browse files Browse the repository at this point in the history
  • Loading branch information
dogo committed Feb 28, 2024
1 parent cd09c2f commit 71b6071
Show file tree
Hide file tree
Showing 8 changed files with 218 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,16 @@
import UIKit

final class NewPersonViewController: UIViewController {
private let newPersonView = NewPersonView()
weak var delegate: UpdateTableDataDelegate?

private let newPersonView: NewPersonView

var presenter: NewPersonPresenterProtocol?

// MARK: - Life Cycle

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
init(with view: NewPersonView = NewPersonView()) {
newPersonView = view
super.init(nibName: nil, bundle: nil)
}

@available(*, unavailable)
Expand All @@ -30,31 +33,31 @@ final class NewPersonViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()

setupNavigationItem()
presenter?.setupNavigationItems { [weak self] items in
self?.navigationItem.rightBarButtonItems = items
}
}

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationItem.title = L10n.newPerson
}

func setupNavigationItem() {
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTouched(_:)))
presenter?.setNavigationTitle()
}
}

// MARK: - UIBarButton Actions
extension NewPersonViewController: NewPersonViewControllerProtocol {

@objc
func doneButtonTouched(_ sender: Any) {
func setNavigationTitle(_ title: String) {
navigationItem.title = title
}

func retriveUserInput() -> (name: String, lastName: String) {
let name = newPersonView.firstNameTextField.nonOptionalText
let lastName = newPersonView.lastNameTextField.nonOptionalText
return (name, lastName)
}

if !name.isEmpty {
let person = PersonDTO()
person.name = name
person.lastName = lastName
delegate?.insertNew(person: person)
}
_ = navigationController?.popViewController(animated: true)
func closeViewController() {
navigationController?.popViewController(animated: true)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
//
// NewPersonPresenter.swift
// SWDestinyTrades
//
// Created by Diogo Autilio on 27/02/24.
// Copyright © 2024 Diogo Autilio. All rights reserved.
//

import Foundation
import UIKit

protocol NewPersonPresenterProtocol: AnyObject {
func setNavigationTitle()
func setupNavigationItems(completion: ([UIBarButtonItem]?) -> Void)
}

final class NewPersonPresenter: NewPersonPresenterProtocol {

private weak var controller: NewPersonViewControllerProtocol?

private weak var delegate: UpdateTableDataDelegate?

init(controller: NewPersonViewControllerProtocol?,
delegate: UpdateTableDataDelegate?) {
self.controller = controller
self.delegate = delegate
}

func setNavigationTitle() {
controller?.setNavigationTitle(L10n.newPerson)
}

func setupNavigationItems(completion: ([UIBarButtonItem]?) -> Void) {
let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTouched(_:)))
completion([doneButton])
}

// MARK: - UIBarButton Actions

@objc
private func doneButtonTouched(_ sender: Any) {
let userInput = controller?.retriveUserInput()
let name = userInput?.name ?? ""
let lastName = userInput?.lastName ?? ""

if !name.isEmpty {
let person = PersonDTO()
person.name = name
person.lastName = lastName
delegate?.insertNew(person: person)
}
controller?.closeViewController()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// NewPersonViewControllerProtocol.swift
// SWDestinyTrades
//
// Created by Diogo Autilio on 27/02/24.
// Copyright © 2024 Diogo Autilio. All rights reserved.
//

import Foundation

protocol NewPersonViewControllerProtocol: AnyObject {

func setNavigationTitle(_ title: String)
func retriveUserInput() -> (name: String, lastName: String)
func closeViewController()
}
3 changes: 3 additions & 0 deletions SWDestinyTrades/Classes/NewPerson/View/NewPersonView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import UIKit

final class NewPersonView: UIView {

lazy var firstNameTextField: FloatingTextfield = {
let textField = FloatingTextfield(frame: .zero)
textField.textColor = .whiteBlack
Expand Down Expand Up @@ -42,6 +43,7 @@ final class NewPersonView: UIView {
}

extension NewPersonView: BaseViewConfiguration {

func buildViewHierarchy() {
addSubview(firstNameTextField)
addSubview(lastNameTextField)
Expand Down Expand Up @@ -69,6 +71,7 @@ extension NewPersonView: BaseViewConfiguration {
}

extension NewPersonView: UITextFieldDelegate {

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if firstNameTextField == textField {
lastNameTextField.becomeFirstResponder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ final class PeopleListNavigator: Navigator {
return LoansDetailViewControllerFactory(database: database, person: person).createViewController()
case let .newPerson(delegate):
let viewController = NewPersonViewController()
viewController.delegate = delegate
let presenter = NewPersonPresenter(controller: viewController, delegate: delegate)
viewController.presenter = presenter
return viewController
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// NewPersonViewControllerSpy.swift
// SWDestinyTradesTests
//
// Created by Diogo Autilio on 28/02/24.
// Copyright © 2024 Diogo Autilio. All rights reserved.
//

import Foundation
import UIKit

@testable import SWDestinyTrades

final class NewPersonViewControllerSpy: UIViewController, NewPersonViewControllerProtocol {

private(set) var didCallSetNavigationTitle = [String]()
func setNavigationTitle(_ title: String) {
didCallSetNavigationTitle.append(title)
}

private(set) var didCallRetriveUserInputCount = 0
func retriveUserInput() -> (name: String, lastName: String) {
didCallRetriveUserInputCount += 1
return ("name", "lastName")
}

private(set) var didCallCloseViewControllerCount = 0
func closeViewController() {
didCallCloseViewControllerCount += 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
//
// UpdateTableDataDelegateSpy.swift
// SWDestinyTradesTests
//
// Created by Diogo Autilio on 28/02/24.
// Copyright © 2024 Diogo Autilio. All rights reserved.
//

import Foundation

@testable import SWDestinyTrades

final class UpdateTableDataDelegateSpy: UpdateTableDataDelegate {

private(set) var didCallInsertNew = [PersonDTO]()
func insertNew(person: PersonDTO) {
didCallInsertNew.append(person)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
//
// NewPersonPresenterTests.swift
// SWDestinyTradesTests
//
// Created by Diogo Autilio on 28/02/24.
// Copyright © 2024 Diogo Autilio. All rights reserved.
//

import UIKit
import XCTest

@testable import SWDestinyTrades

final class NewPersonPresenterTests: XCTestCase {

private var sut: NewPersonPresenter!
private var navigationController: UINavigationControllerMock!
private var controller: NewPersonViewControllerSpy!
private var delegate: UpdateTableDataDelegateSpy!

override func setUp() {
super.setUp()
controller = NewPersonViewControllerSpy()
delegate = UpdateTableDataDelegateSpy()
navigationController = UINavigationControllerMock(rootViewController: controller)
sut = NewPersonPresenter(controller: controller,
delegate: delegate)
}

override func tearDown() {
controller = nil
navigationController = nil
sut = nil
super.tearDown()
}

// MARK: - Test setupNavigationItems

func test_setupNavigationItems() {
var expectedItem: [UIBarButtonItem]? = []
sut.setupNavigationItems { items in
expectedItem = items
}

XCTAssertEqual(expectedItem?.count, 1)
}

// MARK: - Test setNavigationTitle

func test_setNavigationTitle() {
sut.setNavigationTitle()

XCTAssertEqual(controller.didCallSetNavigationTitle.count, 1)
XCTAssertEqual(controller.didCallSetNavigationTitle[0], "New Person")
}

// MARK: - Test addButtonTouched

func test_doneButtonTouched() {
var barButtonItems: [UIBarButtonItem]? = []
sut.setupNavigationItems { items in
barButtonItems = items
}
let addButton = barButtonItems?[0]
_ = addButton?.target?.perform(addButton!.action, with: nil)

XCTAssertEqual(controller.didCallCloseViewControllerCount, 1)
XCTAssertEqual(delegate.didCallInsertNew.count, 1)
XCTAssertNotNil(delegate.didCallInsertNew[0])
}
}

0 comments on commit 71b6071

Please sign in to comment.