Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Lint.yml
name: Lint
on: pull_request

jobs:
Lint:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: SwiftFormat
run: swiftformat --lint . --reporter github-actions-log
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public extension AsyncNetworkable {
request.httpBody = getBody(body)
return request
}

/// Creates a URLRequest with a JSON body and query parameters
/// - Parameters:
/// - queryItems: Dictionary of query parameters to be added to the URL
Expand Down
26 changes: 26 additions & 0 deletions Tests/MBAsyncNetworkingTests/APITests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import Foundation
import Testing
@testable import MBAsyncNetworking

@MainActor struct APITests {
init() {
UserSession.initialize(with: NetworkingStorage())
}

@Test func apiTest() async throws {
// Write your test here and use APIs like `#expect(...)` to check expected conditions.
let request: Data = try await TestAPI.google.fetch()
#expect(request.count > 0)
}

enum TestAPI: AsyncNetworkable {
case google
case amazon
func request() async -> URLRequest {
switch self {
case .google: await getRequest(queryItems: [:], url: URL(forceString: "https://google.com"))
case .amazon: await getRequest(queryItems: [:], url: URL(forceString: "https://amazon.com"))
}
}
}
}
6 changes: 0 additions & 6 deletions Tests/MBAsyncNetworkingTests/MBAsyncNetworkingTests.swift

This file was deleted.

117 changes: 117 additions & 0 deletions Tests/MBAsyncNetworkingTests/MultipleSceneTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
//
// MultipleSceneTests.swift
// MBAsyncNetworking
//
// Created by Raşid Ramazanov on 5.08.2025.
//

import Foundation
import Testing
@testable import MBAsyncNetworking

@MainActor struct MultipleSceneTests {
var sut: XViewController!
init() {
UserSession.initialize(with: NetworkingStorage())
}

@Test mutating func interactorFetch() async {
let presentationLogic = XPresentationLogicSpy()
sut = XViewController(presentationLogic: presentationLogic)
await sut.interactor.fetch()
#expect(presentationLogic.content != nil)
#expect(presentationLogic.error == nil)
}

final class XPresentationLogicSpy: XPresentationLogic {
var viewController: (any MultipleSceneTests.XDisplayLogic)?
var content: Data?
var error: Error?
func present(data: Data) {
content = data
}

func present(error: any Error) {
self.error = error
}
}

final class XViewController: XDisplayLogic {
let interactor: XInteractor
var content: Data?
var errorMessage: String?
init() {
let presenter = XPresenter()
interactor = XInteractor(presenter: presenter)
presenter.viewController = self
}

init(presentationLogic: XPresentationLogic) {
interactor = XInteractor(presenter: presentationLogic)
interactor.presenter.viewController = self
}

func viewDidLoad() {
Task {
await interactor.fetch()
}
}

func displayContent(_ data: Data) {
content = data
}

func displayError(_ message: String) {
errorMessage = message
}
}

protocol XDisplayLogic {
func displayContent(_ data: Data)
func displayError(_ message: String)
}

final class XInteractor {
var presenter: XPresentationLogic
init(presenter: XPresentationLogic) {
self.presenter = presenter
}

func fetch() async {
do {
let response: Data = try await TestAPI.google.fetch()
presenter.present(data: response)
} catch {
presenter.present(error: error)
}
}
}

final class XPresenter: XPresentationLogic {
var viewController: XDisplayLogic?
func present(data: Data) {
viewController?.displayContent(data)
}

func present(error: Error) {
viewController?.displayError(error.localizedDescription)
}
}

protocol XPresentationLogic {
var viewController: XDisplayLogic? { get set }
func present(data: Data)
func present(error: Error)
}

enum TestAPI: AsyncNetworkable {
case google
case amazon
func request() async -> URLRequest {
switch self {
case .google: await getRequest(queryItems: [:], url: URL(forceString: "https://google.com"))
case .amazon: await getRequest(queryItems: [:], url: URL(forceString: "https://amazon.com"))
}
}
}
}
14 changes: 14 additions & 0 deletions Tests/MBAsyncNetworkingTests/NetworkingStorage.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//
// NetworkingStorage.swift
// MBAsyncNetworking
//
// Created by Raşid Ramazanov on 5.08.2025.
//

import Foundation
@testable import MBAsyncNetworking

struct NetworkingStorage: NetworkingStorable {
var refreshToken: String? = UUID().uuidString
var accessToken: String? = UUID().uuidString
}
Loading